Note

Access to this page requires authorization. You can try signing in or .

Access to this page requires authorization. You can try .

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. For a list of standard control codes included in the SDK documentation, see the Remarks section of DeviceIoControl.

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.

#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);
}

Feedback

Was this page helpful?

Additional resources