Вызов функции DeviceIoControl


Приложение может использовать функцию DeviceIoControl, чтобы выполнить прямые операции ввода и вывода данных или извлечь информацию о накопителе на гибких магнитных дисках, жестком диске, накопителе на магнитной ленте или об устройстве чтения компакт-дисков (CD-ROM). Нижеследующий пример демонстрирует, как извлечь информацию о первом физическом диске в системе. Он использует функцию CreateFile, чтобы извлечь дескриптор устройства первого физического диска, а затем использует DeviceIoControl с управляющим кодом IOCTL_DISK_GET_DRIVE_GEOMETRY, чтобы заполнить структуру DISK_GEOMETRY информацией о диске.

/* Интересуемый код находится в подпрограмме GetDriveGeometry.
   Код в основной части показывает, как интерпретировать результаты вызова IOCTL. */

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

BOOL GetDriveGeometry(DISK_GEOMETRY *pdg)
{
  HANDLE hDevice;               // дескриптор проверяемого устройства 
  BOOL bResult;                 // флажок результата
  DWORD junk;                   // сбрасываем результаты

  hDevice = CreateFile("\\\\.\\PhysicalDrive0",  // открываемое устройство
                    0,                // нет доступа к устройству
                    FILE_SHARE_READ | // режим совместного использования
                    FILE_SHARE_WRITE, 
                    NULL,             // атрибуты безопасности по умолчанию
                    OPEN_EXISTING,    // расположение
                    0,                // атрибуты файла
                    NULL);            // не копировать атрибуты файла

  if (hDevice == INVALID_HANDLE_VALUE) // невозможно открыть устройство
  {
    return (FALSE);
  }

  bResult = DeviceIoControl(hDevice,  // запрошенное устройство
      IOCTL_DISK_GET_DRIVE_GEOMETRY,  // выполняемая операция
                             NULL, 0, // буфера ввода нет
                            pdg, sizeof(*pdg),     // буфер вывода
                            &junk,                 // # возвращено байтов
                            (LPOVERLAPPED) NULL);  // синхронизация ввода/вывода (I/O)

  CloseHandle(hDevice);

  return (bResult);
}

int main(int argc, char *argv[])
{
  DISK_GEOMETRY pdg;            // геометрическая структура дискового устройства
  BOOL bResult;                 // флажок общих результатов
  ULONGLONG DiskSize;           // размер диска, в байтах

  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 (Gb)\n", DiskSize,
           DiskSize / (1024 * 1024 * 1024));
  } 
  else 
  {
    printf ("GetDriveGeometry failed. Error %ld.\n", GetLastError ());
  }

  return ((int)bResult);
}

Этот пример не работает в среде Windows Me/98/95 по нижеследующим причинам:

Windows Me/98/95: Пример, который работает в среде Windows Me/98/95, см. в статье Вызов DeviceIoControl в среде Windows Me/98/95.

Назад в оглавление
На главную страницу

Hosted by uCoz