title: Incorrect Function Call "IOCTL_DISK_GET_DRIVE_LAYOUT_EX"
body: <p>I am currently trying to write a C++ program to automate retrieving information about the partitions of a sample hard-drive image, the information in question being the number of partitions on the disk and for each partition its start sector, size and and file system type. </p>
  
  <p>I'm pretty sure at this point the best way to achieve this is through MSDN functions, microsofts inbuilt commands. I am trying to use the "IOCTL_DISK_GET_DRIVE_LAYOUT_EX" function, but according to my get error call my function is incorrect. When I debug the program is appears that the bool value is also unchanged after the "IOCTL_DISK_GET_DRIVE_LAYOUT_EX" call, meaning it is not returning the bResult value.</p>
  
  <p>I am using Microsoft Visual C++ Express Edition. If people could take a look at my code and tell me what they think I did wrong it would be much appreciated.</p>
  
  <pre><code>#define UNICODE 1
  #define _UNICODE 1
  
  #include &lt;windows.h&gt;
  #include &lt;winioctl.h&gt;
  #include &lt;stdio.h&gt;
  
  #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 results
  
  
    hDevice = 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
                    &amp;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, &amp;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);
  }
  </code></pre>