#include
#include
#include
BOOL GetDriveGeometry(const char *pathofdisk,DISK_GEOMETRY*pdg)
{
HANDLE hDevice; // handleto the drive to be examined
BOOL bResult; // results flag
DWORD junk; // discard results
hDevice = CreateFile(pathofdisk, // drive to open
0, // noaccess to the drive
FILE_SHARE_READ | // share mode
FILE_SHARE_WRITE,
NULL, // default security attributes
OPEN_EXISTING, // disposition
0, // fileattributes
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 toperform
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 geometrystructure
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);
}