2013-08-21 2 views
0

У меня есть жесткий диск, на котором есть 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); 
} 

Благодаря

+0

Вы не очень ясно, что в возвращенных данных, что заставляет вас думать только один раздел возвращаются. Являются ли 3 дополнительных раздела напечатаны как «PARTITION_ENTRY_UNUSED»? –

+0

Держу пари, что IOCTL_DISK_GET_DRIVE_LAYOUT_EX действительно работает правильно –

+0

Я не вижу ни одного PARTITION_ENTRY_UNUSED – Helder

ответ

1

Другие данные раздел есть, но не отображаются в отладчике.

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); 
} 
+0

Your Write, Thanks Alot – Helder

+0

У меня есть 1 последний незавершенный выпуск. если я попробую один и тот же код на диске с 1 разделом, он возвращает число разделов как 4. он должен быть 1. В чем проблема? – Helder

+0

[MSDN] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa364001 (v = vs.85) .aspx) говорит, что PartitionCount будет кратным 4 для MBR-дисков, но дополнительные разделы будут иметь 'PARTITION_ENTRY_UNUSED' в поле' Mbr.PartitionType'. – lnmx

Смежные вопросы