Вызов функции 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 по нижеследующим причинам: