The Windows Disk Management 13






Calling DeviceIoControl() Program Example


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. 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.

Create a new empty Win32 console application project. Give a suitable project name and change the project location if needed.


Calling DeviceIoControl() program example: Creating new Win32 C++ console application project in Visual C++ .NET


Then, add the source file and give it a suitable name.

Next, add the following source code.


/* 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>


BOOL GetDriveGeometry(DISK_GEOMETRY *pdg)


  HANDLE hDevice;               // handle to the drive to be examined

  BOOL bResult;                 // results flag

  DWORD junk;                   // discard results


  hDevice = CreateFile(TEXT("\\\\.\\PhysicalDrive0"),  // drive to open

                    0,                // no access to the drive

                    FILE_SHARE_READ | // share mode


                    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


        printf("CreateFile() failed!\n");

        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




  return (bResult);



int main(int argc, char *argv[])


  DISK_GEOMETRY pdg;            // disk drive geometry structure

  BOOL bResult;                            // generic results flag

  ULONGLONG DiskSize;           // size of the drive, in bytes


  bResult = GetDriveGeometry (&pdg);


  if (bResult)


    printf("Cylinders = %I64d\n", pdg.Cylinders);

    printf("Tracks/cylinder = %ld\n", (ULONG) pdg.TracksPerCylinder);

    printf("Sectors/track = %ld\n", (ULONG) pdg.SectorsPerTrack);

    printf("Bytes/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));




    printf ("GetDriveGeometry() failed. Error %ld.\n", GetLastError ());



  return ((int)bResult);



Build and run the project. The following screenshot is a sample output.


Calling DeviceIoControl() Program Example: A sample console program output in action


The Unicode version can be found in the download page.





< Windows Disk 12 | Win32 Programming Index Page | Windows Disk Index | Windows Disk 14 >