1

3 つのパーティションを持つハードディスクがあります。IOCTL_DISK_GET_DRIVE_LAYOUT_EX を使用すると、4 つのパーティションが見つかったと表示されていても、オブジェクト (私のコードでは "pdg" オブジェクト) は配列 1 のパーティション情報のみを返します。partitionEntry (partitionentry のオブジェクト pdg にデバッガーを使用する必要があります) に 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);
}

ありがとう

4

1 に答える 1