下面的代码在Win2k SP4上测试通过,注意 nBufferSize 后面那个数字,我用的是11,因为我的硬盘分了三个区,这个数字一般需要设为: (硬盘的分区数 * 4 - 1)
我的系统上返回的 lpPartsInfo->PartitionCount 是 12,大一点没什么关系.
#include <windows.h>
#include <winioctl.h>
int main(int argc, char* argv[])
{
HANDLE hDevice = NULL;
DWORD nBytesRead = 0;
DWORD nBufferSize = sizeof(DRIVE_LAYOUT_INFORMATION) + sizeof(PARTITION_INFORMATION) * 11;
PDRIVE_LAYOUT_INFORMATION lpPartsInfo = (PDRIVE_LAYOUT_INFORMATION)malloc(nBufferSize);
if (lpPartsInfo == NULL)
{
return 0;
}
memset(lpPartsInfo, 0, nBufferSize);
//
// Getting a handle to 1st Hard Disk via CreateFile() function.
// Open the 1st HD using ".//PhysicalDrive0"
// Open drive C: using ".//C:"
//
hDevice = CreateFile(
".//PhysicalDrive0",
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL
);
if(hDevice == NULL)
{
return 0;
}
DeviceIoControl(
hDevice,
IOCTL_DISK_GET_DRIVE_LAYOUT,
NULL,
0,
lpPartsInfo,
nBufferSize,
&nBytesRead,
NULL
);
CloseHandle(hDevice);
free(lpPartsInfo);
return 0;
}