使用DeviceIoControl查询PartitionCount时出现问题。
#include <tchar.h>
#include <iostream>
#include <windows.h>
int wmain(int argc, wchar_t *argv[])
{
HANDLE hDevice = CreateFileA("\\.\PhysicalDrive0", 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (hDevice == INVALID_HANDLE_VALUE) {
return 0;
}
else {
DWORD dwInfoSize = sizeof(DRIVE_LAYOUT_INFORMATION_EX)+sizeof(PARTITION_INFORMATION_EX)* 3;
DRIVE_LAYOUT_INFORMATION_EX* tpDriveLayoutInformationEx = (DRIVE_LAYOUT_INFORMATION_EX*)malloc(dwInfoSize);
if (NULL == tpDriveLayoutInformationEx) {
CloseHandle(hDevice);
return(-1);
}
DWORD dwResult = 0;
BOOL bResult = DeviceIoControl(hDevice, // handle to device
IOCTL_DISK_GET_DRIVE_LAYOUT_EX, // dwIoControlCode
NULL, // lpInBuffer
0, // nInBufferSize
tpDriveLayoutInformationEx, // output buffer
dwInfoSize, // size of output buffer
&dwResult, // number of bytes returned
NULL // OVERLAPPED structure
);
if (0 == bResult) {
printf("DeviceIoControl IOCTL_DISK_GET_DRIVE_LAYOUT_EX FAILED", "");
CloseHandle(hDevice);
return 0;
}
printf("PartitionCount: %s", tpDriveLayoutInformationEx->PartitionCount);
}
system("pause");
return 0;
}
DeviceIoControl IOCTL_DISK_GET_DRIVE_LAYOUT_EX失败的原因?。请帮帮我。谢谢
您可以参考如何调用DeviceIoControl来获取所需的内存量?
根据VOLUME_DISK_EXTENTS
:
数据块是一个磁盘上连续运行的扇区。当返回的扩展数据块数大于一(1(时,将返回错误代码error_MORE_DATA。您应该再次调用DeviceIoControl,根据第一次DeviceIoControl调用后NumberOfDiskExtents的值分配足够的缓冲区空间。
如果您传递的输出缓冲区小于sizeof(VOLUME_DISK_EXTENTS(,也会记录在IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
控制代码中:
如果输出缓冲区小于
sizeof(VOLUME_DISK_EXTENTS)
,则调用失败,GetLastError
返回ERROR_INSUFFICIENT_BUFFER
,lpBytesReturned
为0(零(。