Ну очень надо!

Тема в разделе "C и С++ FAQ", создана пользователем -, 29 фев 2004.

Статус темы:
Закрыта.
  1. Гость

    Помогите......Надо на Visual C++ написать скандиск. Как мне считать физические данные о диске. Есть такая функция DeviceIoControl... но не могу понять с MSDN как она работает.............
     
  2. bl4iD

    bl4iD Гость

    Слава
    Посмотри в MSDN в сторону DRIVEGEOMETRY (или что-то типо такого), там как раз DeviceIoControl используется , и вроде даже исходник есть, во всяком случае я оттуда брал. Именно геометрические параметры винта, т.е. кластеры, сектора, цилиндры... С серийным номером и моделью всё намного сложнее...
     
  3. ????

    ???? Гость

    Для XP:

    Код (Text):
    Calling DeviceIoControl

    An application can use the DeviceIoControl function to perform direct input and output operations on, or retrieve information about, a floppy disk drive, hard disk drive, tape drive, or CD-ROM drive. The following example demonstrates how to retrieve information about the first physical drive in the system. It uses the CreateFile function to retrieve the device handle to the first physical drive, and then uses DeviceIoControl with the IOCTL_DISK_GET_DRIVE_GEOMETRY control code to fill a DISK_GEOMETRY structure with information about the drive.

    /* The code of interest is in the subroutine GetDriveGeometry. The
     code in main shows how to interpret the results of the IOCTL call. */

    #include <windows.h>
    #include <winioctl.h>

    BOOL GetDriveGeometry(DISK_GEOMETRY *pdg)
    {
    HANDLE hDevice;        // handle to the drive to be examined
    BOOL bResult;         // results flag
    DWORD junk;          // discard results

    hDevice = CreateFile("\\\\.\\PhysicalDrive0", // drive to open
             0,        // no access to the drive
             FILE_SHARE_READ | // share mode
             FILE_SHARE_WRITE,
             NULL,       // default security attributes
             OPEN_EXISTING,  // disposition
             0,        // file attributes
             NULL);      // do not copy file attributes

    if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
    {
     return (FALSE);
    }

    bResult = DeviceIoControl(hDevice, // device to be queried
      IOCTL_DISK_GET_DRIVE_GEOMETRY, // operation to perform
                  NULL, 0, // no input buffer
                 pdg, sizeof(*pdg),   // output buffer
                 &junk,         // # bytes returned
                 (LPOVERLAPPED) NULL); // synchronous I/O

    CloseHandle(hDevice);

    return (bResult);
    }

    int main(int argc, char *argv[])
    {
    DISK_GEOMETRY pdg;      // disk drive geometry structure
    BOOL bResult;         // generic results flag
    ULONGLONG DiskSize;      // size of the drive, in bytes

    bResult = GetDriveGeometry (&pdg);

    if (bResult)
    {
     printf("Cylinders = %I64d\n", pdg.Cylinders);
     printf("Tracks per cylinder = %ld\n", (ULONG) pdg.TracksPerCylinder);
     printf("Sectors per track = %ld\n", (ULONG) pdg.SectorsPerTrack);
     printf("Bytes per sector = %ld\n", (ULONG) pdg.BytesPerSector);

     DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
      (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
     printf("Disk size = %I64d (Bytes) = %I64d (Mb)\n", DiskSize,
         DiskSize / (1024 * 1024));
    }
    else
    {
     printf ("GetDriveGeometry failed. Error %ld.\n", GetLastError ());
    }

    return ((int)bResult);
    }
    This example does not work on Windows Me/98/95 for the following reasons:


    The standard device input/output control codes are not available.
    An application must specify a virtual device driver in the CreateFile function—not a specific device.
    Windows Me/98/95: For an example that works on Windows Me/98/95, see Calling DeviceIoControl on Windows Me/98/95.
    Для всех остальных:

    Код (Text):
    Calling DeviceIoControl on Windows Me/98/95
    An application running on Windows Me/98/95 can use the DeviceIoControl function to send control codes directly to a virtual device driver (VxD). Any VxD can support any number of control codes, or none at all.


    The system VxD, VWIN32.VXD, supports the input and output control (IOCTL) functions originally provided by MS-DOS Interrupt 21h. The following example shows how to call Get Media ID (Interrupt 21h Function 440Dh Minor Code 66h) from an application:

    #define VWIN32_DIOC_DOS_IOCTL 1

    typedef struct _DEVIOCTL_REGISTERS
    {
     DWORD reg_EBX;
     DWORD reg_EDX;
     DWORD reg_ECX;
     DWORD reg_EAX;
     DWORD reg_EDI;
     DWORD reg_ESI;
     DWORD reg_Flags;
    } DEVIOCTL_REGISTERS, *PDEVIOCTL_REGISTERS;

    typedef struct _MID
    {
     WORD midInfoLevel;
     DWORD midSerialNum;
     BYTE midVolLabel[11];
     BYTE midFileSysType[8];
    } MID, *PMID;

    BOOL GetMediaID(PMID pmid, UINT nDrive)
    {
     DEVIOCTL_REGISTERS reg;

     reg.reg_EAX = 0x440D;    // IOCTL for block devices
     reg.reg_EBX = nDrive;    // zero-based drive ID
     reg.reg_ECX = 0x0866;    // Get Media ID command
     reg.reg_EDX = (DWORD) pmid; // receives media ID info

     if (!DoIOCTL(&reg))
       return FALSE;

     if (reg.reg_Flags & 0x8000) // error if carry flag set
       return FALSE;

     return TRUE;
    }

    BOOL DoIOCTL(PDEVIOCTL_REGISTERS preg)
    {
     HANDLE hDevice;

     BOOL fResult;
     DWORD cb;

     preg->reg_Flags = 0x8000; // assume error (carry flag set)

     hDevice = CreateFile("\\\\.\\vwin32",
       GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
       (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING,
       FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);

     if (hDevice == (HANDLE) INVALID_HANDLE_VALUE)
       return FALSE;
     else
     {
       fResult = DeviceIoControl(hDevice, VWIN32_DIOC_DOS_IOCTL,
         preg, sizeof(*preg), preg, sizeof(*preg), &cb, 0);
     }

     CloseHandle(hDevice);

     return fResult;
    }

    For an example that works on other versions of Windows, see Calling DeviceIoControl.
    Что именно не понятно???
     
  4. Guest_AlexiS

    Guest_AlexiS Гость

    <!--QuoteBegin-????+13:04:2004, 23:44 -->
    <span class="vbquote">(???? @ 13:04:2004, 23:44 )</span><!--QuoteEBegin-->Для XP:

    Код (Text):
    Calling DeviceIoControl

    An application can use the DeviceIoControl function to perform direct input and output operations on, or retrieve information about, a floppy disk drive, hard disk drive, tape drive, or CD-ROM drive. The following example demonstrates how to retrieve information about the first physical drive in the system. It uses the CreateFile function to retrieve the device handle to the first physical drive, and then uses DeviceIoControl with the IOCTL_DISK_GET_DRIVE_GEOMETRY control code to fill a DISK_GEOMETRY structure with information about the drive.

    /* The code of interest is in the subroutine GetDriveGeometry. The
      code in main shows how to interpret the results of the IOCTL call. */

    #include <windows.h>
    #include <winioctl.h>

    BOOL GetDriveGeometry(DISK_GEOMETRY *pdg)
    {
     HANDLE hDevice;               // handle to the drive to be examined
     BOOL bResult;                 // results flag
     DWORD junk;                   // discard results

     hDevice = CreateFile("\\\\.\\PhysicalDrive0",  // drive to open
                       0,                // no access to the drive
                       FILE_SHARE_READ | // share mode
                       FILE_SHARE_WRITE,
                       NULL,             // default security attributes
                       OPEN_EXISTING,    // disposition
                       0,                // file attributes
                       NULL);            // do not copy file attributes

     if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
     {
       return (FALSE);
     }

     bResult = DeviceIoControl(hDevice,  // device to be queried
         IOCTL_DISK_GET_DRIVE_GEOMETRY,  // operation to perform
                                NULL, 0, // no input buffer
                               pdg, sizeof(*pdg),     // output buffer
                               &junk,                 // # bytes returned
                               (LPOVERLAPPED) NULL);  // synchronous I/O

     CloseHandle(hDevice);

     return (bResult);
    }

    int main(int argc, char *argv[])
    {
     DISK_GEOMETRY pdg;            // disk drive geometry structure
     BOOL bResult;                 // generic results flag
     ULONGLONG DiskSize;           // size of the drive, in bytes

     bResult = GetDriveGeometry (&pdg);

     if (bResult)
     {
       printf("Cylinders = %I64d\n", pdg.Cylinders);
       printf("Tracks per cylinder = %ld\n", (ULONG) pdg.TracksPerCylinder);
       printf("Sectors per track = %ld\n", (ULONG) pdg.SectorsPerTrack);
       printf("Bytes per sector = %ld\n", (ULONG) pdg.BytesPerSector);

       DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
         (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
       printf("Disk size = %I64d (Bytes) = %I64d (Mb)\n", DiskSize,
              DiskSize / (1024 * 1024));
     }
     else
     {
       printf ("GetDriveGeometry failed. Error %ld.\n", GetLastError ());
     }

     return ((int)bResult);
    }
    This example does not work on Windows Me/98/95 for the following reasons:


    The standard device input/output control codes are not available.
    An application must specify a virtual device driver in the CreateFile function—not a specific device.
    Windows Me/98/95:  For an example that works on Windows Me/98/95, see Calling DeviceIoControl on Windows Me/98/95.
    Для всех остальных:

    Код (Text):
    Calling DeviceIoControl on Windows Me/98/95
    An application running on Windows Me/98/95 can use the DeviceIoControl function to send control codes directly to a virtual device driver (VxD). Any VxD can support any number of control codes, or none at all.


    The system VxD, VWIN32.VXD, supports the input and output control (IOCTL) functions originally provided by MS-DOS Interrupt 21h. The following example shows how to call Get Media ID (Interrupt 21h Function 440Dh Minor Code 66h) from an application:

    #define VWIN32_DIOC_DOS_IOCTL 1

    typedef struct _DEVIOCTL_REGISTERS
    {
       DWORD reg_EBX;
       DWORD reg_EDX;
       DWORD reg_ECX;
       DWORD reg_EAX;
       DWORD reg_EDI;
       DWORD reg_ESI;
       DWORD reg_Flags;
    } DEVIOCTL_REGISTERS, *PDEVIOCTL_REGISTERS;

    typedef struct _MID
    {
       WORD  midInfoLevel;
       DWORD midSerialNum;
       BYTE  midVolLabel[11];
       BYTE  midFileSysType[8];
    } MID, *PMID;

    BOOL GetMediaID(PMID pmid, UINT nDrive)
    {
       DEVIOCTL_REGISTERS reg;

       reg.reg_EAX = 0x440D;       // IOCTL for block devices
       reg.reg_EBX = nDrive;       // zero-based drive ID
       reg.reg_ECX = 0x0866;       // Get Media ID command
       reg.reg_EDX = (DWORD) pmid; // receives media ID info

       if (!DoIOCTL(&reg))
           return FALSE;

       if (reg.reg_Flags & 0x8000) // error if carry flag set
           return FALSE;

       return TRUE;
    }

    BOOL DoIOCTL(PDEVIOCTL_REGISTERS preg)
    {
       HANDLE hDevice;

       BOOL fResult;
       DWORD cb;

       preg->reg_Flags = 0x8000; // assume error (carry flag set)

       hDevice = CreateFile("\\\\.\\vwin32",
           GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
           (LPSECURITY_ATTRIBUTES) NULL, OPEN_EXISTING,
           FILE_ATTRIBUTE_NORMAL, (HANDLE) NULL);

       if (hDevice == (HANDLE) INVALID_HANDLE_VALUE)
           return FALSE;
       else
       {
           fResult = DeviceIoControl(hDevice, VWIN32_DIOC_DOS_IOCTL,
               preg, sizeof(*preg), preg, sizeof(*preg), &cb, 0);
       }

       CloseHandle(hDevice);

       return fResult;
    }

    For an example that works on other versions of Windows, see Calling DeviceIoControl.
    Что именно не понятно???[/quote]
    А если мне надо получить от диска А такие параметры как: размер межсекторного промежутка, и число секторов с одинаковыми именами на одной дорожке. То как это сделать в MSND ни чего подходящего не нашёл. И ещё как использовать DeviseIOControl для форматирования диска. Пробывал как написано в MSDN выдает ошибку типа нет доступа. Если знаете помогите пожалуста
     
  5. Гость

    Guest_AlexiS
    а права есть??? и диск точно не занят другим процессом???
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей