Неправильный вызов функции & quot; IOCTL_DISK_GET_DRIVE_LAYOUT_EX & quot;

В настоящее время я пытаюсь написать программу на C ++ для автоматизации извлечения информации о разделах образца образа жесткого диска, причем рассматриваемой информацией является количество разделов на диске и для каждого раздела его начальный сектор, размер и тип файловой системы. ,

Я уверен, что на данный момент лучший способ добиться этого — использовать функции MSDN, встроенные команды microsofts. Я пытаюсь использовать функцию «IOCTL_DISK_GET_DRIVE_LAYOUT_EX», но, согласно моему вызову get error, моя функция неверна. Когда я отлаживаю программу, появляется сообщение, что значение bool также остается неизменным после вызова «IOCTL_DISK_GET_DRIVE_LAYOUT_EX», что означает, что оно не возвращает значение bResult.

Я использую Microsoft Visual C ++ Express Edition. Если бы люди могли взглянуть на мой код и сказать, что, по их мнению, я сделал неправильно, это было бы очень признательно.

#define UNICODE 1
#define _UNICODE 1

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

#define wszDrive L"\\\\.\\PhysicalDrive6"
BOOL GetDriveParition(LPWSTR wszPath, DRIVE_LAYOUT_INFORMATION_EX *pdg)
{

HANDLE hDevice = INVALID_HANDLE_VALUE;  // handle to the drive to be examined
BOOL bResult   = FALSE;                 // results flag
DWORD junk     = 0;                     // discard resultshDevice = CreateFileW(wszPath,          // drive to open
0,                // no access to the drive
FILE_SHARE_READ | // share mode
FILE_SHARE_WRITE,
NULL,             // default security attributes
OPEN_EXISTING,    // disposition
0,                // file attributes
NULL);            // do not copy file attributes

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

bResult =  DeviceIoControl(
hDevice,                        // handle to device
IOCTL_DISK_GET_DRIVE_LAYOUT_EX, // dwIoControlCode
NULL,                           // lpInBuffer
0,                              // nInBufferSize
pdg,                            // lpOutBuffer
sizeof(*pdg),                   // nOutBufferSize
&junk,                          // lpBytesReturned
NULL);                          // lpOverlapped

CloseHandle(hDevice);

return (bResult);}

int wmain(int argc, wchar_t *argv[])
{
DRIVE_LAYOUT_INFORMATION_EX pdg; // disk drive partition structure
BOOL bResult = FALSE;      // generic results flag

bResult = GetDriveParition (wszDrive, &pdg);

if (bResult)
{
wprintf(L"Drive path            = %ws\n",   wszDrive);
wprintf(L"Partition Style       = %I64d\n", pdg.PartitionStyle);
wprintf(L"Partition Count       = %ld\n",   pdg.PartitionCount);

system("Pause");
}
else
{
wprintf (L"GetDrivePartition failed. Error %ld.\n", GetLastError ());
system("Pause");
}

return ((int)bResult);
}

1

Решение

DRIVE_LAYOUT_INFORMATION_EX это странная структура. Это определяется как

struct {
DWORD                    PartitionStyle;
DWORD                    PartitionCount;
union {
DRIVE_LAYOUT_INFORMATION_MBR Mbr;
DRIVE_LAYOUT_INFORMATION_GPT Gpt;
};
PARTITION_INFORMATION_EX PartitionEntry[ 1 ];
}

но обычно PartitionEntry рассматривается как гораздо больший массив, с PartitionCount записей. Это похоже на механизм C99 VLA. Так как ты выделил только sizeof(*pdg) байт, нет места даже для второго PartitionEntry.

C ++ взломать:

struct ExtraEntries : DRIVE_LAYOUT_INFORMATION_EX
{
PARTITION_INFORMATION_EX PartitionEntry[ 9 ]; // Or some other reasonable value
};
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]