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