物理硬盘命名为\\.\PhysicalDrive0
用CreateFile打开物理硬盘,然后用DeviceIoControl的参数IOCTL_DISK_GET_DRIVE_GEOMETRY,代码如下
#include <windows.h>
#include <stdio.h>
#include <winioctl.h>#define wszDrive L"\\\\.\\PhysicalDrive0"BOOL GetDriveGeometry(LPWSTR wszPath, DISK_GEOMETRY *pdg)
{HANDLE hDevice = INVALID_HANDLE_VALUE;BOOL bResult = FALSE;DWORD junk = 0;hDevice = CreateFile(wszDrive, 0,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);if (hDevice == INVALID_HANDLE_VALUE) return FALSE;bResult = DeviceIoControl(hDevice, IOCTL_DISK_GET_DRIVE_GEOMETRY,NULL,0,pdg,sizeof(*pdg),&junk,NULL);CloseHandle(hDevice);return TRUE;
}int main()
{DISK_GEOMETRY dg = {0};BOOL bResult = FALSE;ULONGLONG DiskSize = 0;bResult = GetDriveGeometry(wszDrive, &dg);if (bResult) {wprintf(L"Drive path =%ws\n", wszDrive);wprintf(L"Cylinders = %I64d\n", dg.Cylinders);wprintf(L"Tracks/cylinder=%ld\n", dg.TracksPerCylinder);wprintf(L"Sectors/track=%ld\n", dg.SectorsPerTrack);wprintf(L"Bytes/sector=%ld\n", dg.BytesPerSector);DiskSize = dg.Cylinders.QuadPart * (ULONG)dg.TracksPerCylinder * (ULONG)dg.SectorsPerTrack * (ULONG)dg.BytesPerSector;wprintf(L"Disk size=%I64d (Bytes)"L" %.2f (Gb)\n", DiskSize,(double)DiskSize / (1024 * 1024 * 1024));} else {wprintf(L"GetDriveGeometry failed. error:%ld.\n", GetLastError());}return 0;
}