gpt4 book ai didi

c++ - IOCTL_DISK_GET_DRIVE_LAYOUT_EX 工作不正常

转载 作者:行者123 更新时间:2023-11-28 07:27:58 25 4
gpt4 key购买 nike

我有一个硬盘,上面有 3 个分区。当我使用 IOCTL_DISK_GET_DRIVE_LAYOUT_EX 时,对象(在我的代码中它是“pdg”对象)仅返回数组 1 分区信息,即使它说找到 4 分区也是如此。我缺少什么,以便 partitionEntry(必须使用调试器对对象 pdg 进行 partitionentry)显示所有 3 个分区。我到处寻找一些信息,但无法让它发挥作用。不同的论坛,msdn ...

下面是我的代码

#define UNICODE 1
#define _UNICODE 1

#include <windows.h>
#include <winioctl.h>
#include <stdio.h>

#define wszDrive L"\\\\.\\PhysicalDrive3"

BOOL GetDrive(LPWSTR wszPath)
{
HANDLE hDevice = INVALID_HANDLE_VALUE; // handle to the drive to be examined
BOOL bResult = FALSE; // results flag
DWORD junk = 0; // discard results
DWORD hr;

DWORD szNewLayout = sizeof(DRIVE_LAYOUT_INFORMATION_EX) + sizeof(PARTITION_INFORMATION_EX) * 4 * 25 ;
DRIVE_LAYOUT_INFORMATION_EX *pdg = (DRIVE_LAYOUT_INFORMATION_EX*) new BYTE[szNewLayout];

hDevice = CreateFileW(wszPath, // drive to open
GENERIC_READ|GENERIC_WRITE, // no access to the drive
FILE_SHARE_READ | // share mode
FILE_SHARE_WRITE,
NULL, // default security attributes
OPEN_EXISTING, // disposition
0, // file attributes
0); // do not copy file attributes

if (hDevice == INVALID_HANDLE_VALUE) // cannot open the drive
{
hr = GetLastError();
return (FALSE);
}

bResult = DeviceIoControl(hDevice, // device to be queried
IOCTL_DISK_GET_DRIVE_LAYOUT_EX, // operation to perform
NULL, 0, // no input buffer
pdg, szNewLayout,// sizeof(*pdg)*2, // output buffer
&junk, // # bytes returned
(LPOVERLAPPED) NULL); // synchronous I/O
if(!bResult)
{
hr = GetLastError();

LPTSTR errorText = NULL;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&errorText, 0, NULL);
wprintf(L"Error", errorText);
}
CloseHandle(hDevice);

return (bResult);
}


int wmain(int argc, wchar_t *argv[])
{

BOOL bResult = FALSE; // generic results flag

bResult = GetDrive(wszDrive);

system ("pause");

return ((int)bResult);
}

谢谢

最佳答案

其他分区数据在那里,但没有被调试器显示。

DRIVE_LAYOUT_INFORMATION_EX.PartitionEntry 声明为长度为 1 的数组,但实际上是动态分配以匹配 PartitionCount。

DeviceIoControl后设置断点,右击pdg选择QuickWatch...,然后更新表达式为pdg->PartitionEntry[1],然后是 [2],以此类推检查其他分区。

或者,添加一个循环来遍历 PartitionEntry 数组并打印结果:

for( int i = 0; i < pdg->PartitionCount; i++ ) {
printf( "partition %d: %d\n", i, pdg->PartitionEntry[i].PartitionStyle);
}

关于c++ - IOCTL_DISK_GET_DRIVE_LAYOUT_EX 工作不正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18363483/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com