为什么DeviceIoControl IOCTL_DISK_GET_DRIVE_LAYOUT_EX失败



使用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_BUFFERlpBytesReturned为0(零(。

最新更新