Chiamata a DeviceIoControl
Un'applicazione può usare la funzione DeviceIoControl per eseguire operazioni di input e output dirette su o recuperare informazioni su, un'unità disco floppy, un'unità disco rigido, un'unità nastro o un'unità CD-ROM. Per un elenco dei codici di controllo standard inclusi nella documentazione dell'SDK, vedere la sezione Osservazioni di DeviceIoControl.
Nell'esempio seguente viene illustrato come recuperare informazioni sulla prima unità fisica nel sistema. Usa la funzione CreateFile per recuperare l'handle del dispositivo nella prima unità fisica e quindi usa DeviceIoControl con il codice di controllo IOCTL_DISK_GET_DRIVE_GEOMETRY per riempire una struttura DISK_GEOMETRY con informazioni sull'unità.
#define UNICODE 1
#define _UNICODE 1
/* The code of interest is in the subroutine GetDriveGeometry. The
code in main shows how to interpret the results of the call. */
#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
#define wszDrive L"\\\\.\\PhysicalDrive0"
BOOL GetDriveGeometry(LPWSTR wszPath, DISK_GEOMETRY *pdg)
{
HANDLE hDevice = INVALID_HANDLE_VALUE; // handle to the drive to be examined
BOOL bResult = FALSE; // results flag
DWORD junk = 0; // discard results
hDevice = CreateFileW(wszPath, // 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 wmain(int argc, wchar_t *argv[])
{
DISK_GEOMETRY pdg = { 0 }; // disk drive geometry structure
BOOL bResult = FALSE; // generic results flag
ULONGLONG DiskSize = 0; // size of the drive, in bytes
bResult = GetDriveGeometry (wszDrive, &pdg);
if (bResult)
{
wprintf(L"Drive path = %ws\n", wszDrive);
wprintf(L"Cylinders = %I64d\n", pdg.Cylinders);
wprintf(L"Tracks/cylinder = %ld\n", (ULONG) pdg.TracksPerCylinder);
wprintf(L"Sectors/track = %ld\n", (ULONG) pdg.SectorsPerTrack);
wprintf(L"Bytes/sector = %ld\n", (ULONG) pdg.BytesPerSector);
DiskSize = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
(ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
wprintf(L"Disk size = %I64d (Bytes)\n"
L" = %.2f (Gb)\n",
DiskSize, (double) DiskSize / (1024 * 1024 * 1024));
}
else
{
wprintf (L"GetDriveGeometry failed. Error %ld.\n", GetLastError ());
}
return ((int)bResult);
}