У меня есть жесткий диск, на котором есть 3 раздела. Когда я использую IOCTL_DISK_GET_DRIVE_LAYOUT_EX, объект (в моем коде это объект «pdg») возвращает только информацию о разделе массива 1, даже если он говорит, что нашел 4 раздела. Что мне не хватает, так что partitionEntry (должен использовать отладчик для объекта pdg для partitionentry) отображает все 3 раздела. Я просмотрел всю информацию и не смог заставить ее работать. Различные форумы, ... MSDNIOCTL_DISK_GET_DRIVE_LAYOUT_EX Не работает правильно
Ниже мой код
#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);
}
Благодаря
Вы не очень ясно, что в возвращенных данных, что заставляет вас думать только один раздел возвращаются. Являются ли 3 дополнительных раздела напечатаны как «PARTITION_ENTRY_UNUSED»? –
Держу пари, что IOCTL_DISK_GET_DRIVE_LAYOUT_EX действительно работает правильно –
Я не вижу ни одного PARTITION_ENTRY_UNUSED – Helder