#include
#include
#include
BOOL GetDriveGeometry(const char *pathofdisk,DISK_GEOMETRY
*pdg)
{
HANDLE hDevice;
// handle
to the drive to be examined
BOOL bResult;
// results flag
DWORD junk;
// discard results
hDevice = CreateFile(pathofdisk,
// 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 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
if(argc<=1)return 0;
bResult = GetDriveGeometry
(argv[1],&pdg);
if(pdg.MediaType == RemovableMedia)
printf("\nRemovableMedia\n");
if(pdg.MediaType == FixedMedia)
printf("FixedMedia\n");
if (bResult)
{
printf("Cylinders =
%I64d\n", pdg.Cylinders);
printf("Trackslinder =
%ld\n", (ULONG) pdg.TracksPerCylinder);
printf("Sectors/track =
%ld\n", (ULONG) pdg.SectorsPerTrack);
printf("Bytesctor =
%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);
}