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

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

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

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

    bl4iD Гость

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

    ???? Гость

    Репутация:
    0
    Для XP:

    Код:
    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.
    Для всех остальных:

    Код:
    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 Гость

    Репутация:
    0
    <!--QuoteBegin-????+13:04:2004, 23:44 -->
    <span class="vbquote">(???? @ 13:04:2004, 23:44 )</span><!--QuoteEBegin-->Для XP:

    Код:
    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.
    Для всех остальных:

    Код:
    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. Гость

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

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