title: Error partitioning and formatting USB flash drive in C++
body: <p>I'm stuck attempting to re-partition and format a USB flash drive using C++, any help would be great! </p>
  
  <p>The goal is to re-partition any arbitrary flash drive with a single partition taking the entire space and formatted FAT32 (later options NTFS and EXFAT).  This will be done in batch, hopefully with 50+ devices at once, so drive letter access is not an option.  I'm able to create a partition, but when I try IOCTL_DISK_SET_PARTITION_INFO_EX to set the format type, it is failing with 0x32, ERROR_NOT_SUPPORTED.  But it's not clear what exactly is not supported.  I can manually partition the device using utilities such as diskpart, so I know the partition and file system types are supported by the device.  Can anyone help?  My full source code is below, it's failing on the DeviceIoControl() call with IOCTL_DISK_SET_PARTITION_INFO_EX.  </p>
  
  <pre><code>#include "stdafx.h"
  #include &lt;random&gt;
  #include &lt;Windows.h&gt;
  #include &lt;atlstr.h&gt;
  #include &lt;iostream&gt;
  #include &lt;assert.h&gt;
  
  
  using namespace std;
  
  #define THROW_CSTRING(a, b) { CString csE; csE.Format(a, b); throw csE; }
  #define RANDOM_DWORD {DWORD(rand()) | DWORD(rand() &lt;&lt; 8) | DWORD(rand() &lt;&lt; 16) | DWORD(rand() &lt;&lt; 24)}
  
  
  int main()
  {
    DRIVE_LAYOUT_INFORMATION_EX* pdg = NULL;
    HANDLE hDevice = INVALID_HANDLE_VALUE;
  
    try
    {
  
      hDevice = CreateFile(L"\\\\.\\PhysicalDrive2",
                            GENERIC_READ | GENERIC_WRITE, 
                            0,              // Only we can access 
                            NULL,           // Default security
                            OPEN_EXISTING,  // For hardware, open existing 
                            0,              // File attributes
                            NULL);          //Do not copy attributes 
      if (hDevice == INVALID_HANDLE_VALUE)
      {
        THROW_CSTRING(L"ERROR: CreateFile() failed: 0x%x", GetLastError());
      }
  
      CREATE_DISK dsk;
      memset(&amp;dsk, 0, sizeof(dsk));
      CREATE_DISK_MBR dskmbr = { 0 };
      dskmbr.Signature = 1;
      dsk.PartitionStyle = PARTITION_STYLE_MBR;
      dsk.Mbr = dskmbr;
  
      // DRIVE_LAYOUT_INFORMAITON_EX has an array of partition info at the end, need enough for 4 partitions minimum
      int iDriveLayoutBytesRequired = sizeof(DRIVE_LAYOUT_INFORMATION_EX) + sizeof(PARTITION_INFORMATION_EX) * 3;
      pdg = (DRIVE_LAYOUT_INFORMATION_EX*)new BYTE[iDriveLayoutBytesRequired];
      memset(pdg, 0, iDriveLayoutBytesRequired);
  
      DRIVE_LAYOUT_INFORMATION_MBR mbrlayout = { 0 };
      mbrlayout.Signature = RANDOM_DWORD;
      pdg-&gt;PartitionStyle = PARTITION_STYLE_MBR;
      pdg-&gt;Mbr = mbrlayout;
      pdg-&gt;PartitionCount = 1;
  
      DWORD dwBytesReturned = 0;
  
  
      if (!DeviceIoControl(hDevice, IOCTL_DISK_CREATE_DISK, &amp;dsk, sizeof(dsk), NULL, 0, &amp;dwBytesReturned, NULL))
      {
        THROW_CSTRING(L"ERROR: IOCTL_DISK_CREATE_DISK failed: 0x%x", GetLastError());
      }
  
  
      // Get the drive dimensions, then use that info to create a new partition 
  
      // Drive length
      GET_LENGTH_INFORMATION sLenInfo = { 0 };
      if (!DeviceIoControl(hDevice, IOCTL_DISK_GET_LENGTH_INFO, NULL, 0, &amp;sLenInfo, sizeof(sLenInfo), &amp;dwBytesReturned, NULL))
      {
        THROW_CSTRING(L"ERROR: IOCTL_DISK_GET_LENGTH_INFO failed: 0x%x", GetLastError());
      }
      assert(sizeof(sLenInfo.Length.QuadPart) == sizeof(__int64));
      __int64 iDiskLengthBytes = sLenInfo.Length.QuadPart;
  
  
      pdg-&gt;PartitionStyle = PARTITION_STYLE_MBR;
      pdg-&gt;PartitionCount = 4;
      pdg-&gt;Mbr.Signature = 1;
  
      pdg-&gt;PartitionEntry[0].PartitionStyle = PARTITION_STYLE_MBR;
      pdg-&gt;PartitionEntry[0].StartingOffset.QuadPart = 0;
      pdg-&gt;PartitionEntry[0].PartitionLength.QuadPart = iDiskLengthBytes;
      pdg-&gt;PartitionEntry[0].PartitionNumber = 1;
      pdg-&gt;PartitionEntry[0].RewritePartition = TRUE;
  
      //pdg-&gt;PartitionEntry[0].Mbr.PartitionType = PARTITION_IFS; // NTFS
      pdg-&gt;PartitionEntry[0].Mbr.PartitionType = PARTITION_FAT32;
      pdg-&gt;PartitionEntry[0].Mbr.BootIndicator = TRUE;
      pdg-&gt;PartitionEntry[0].Mbr.RecognizedPartition = 1;
      pdg-&gt;PartitionEntry[0].Mbr.HiddenSectors = 0;
  
  
      // Partition device
      if (!DeviceIoControl(hDevice, IOCTL_DISK_SET_DRIVE_LAYOUT_EX, pdg, iDriveLayoutBytesRequired, NULL, 0, &amp;dwBytesReturned, NULL))
      {
        THROW_CSTRING(L"ERROR: IOCTL_DISK_SEt_DRIVE_LAYOUT_EX failed: 0x%x", GetLastError());
      }
  
      // Tell the driver to flush its cache
      if (!DeviceIoControl(hDevice, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &amp;dwBytesReturned, NULL))
      {
        THROW_CSTRING(L"ERROR: IOCTL_DISK_UPDATE_PROPERTIES failed: 0x%x", GetLastError());
      }
  
      SET_PARTITION_INFORMATION_EX dskinfo;
      memset(&amp;dskinfo, 0, sizeof(dskinfo));
      dskinfo.PartitionStyle = PARTITION_STYLE_MBR;
      dskinfo.Mbr.PartitionType = PARTITION_FAT32;
  
      if (!DeviceIoControl(hDevice, IOCTL_DISK_SET_PARTITION_INFO_EX, &amp;dskinfo, sizeof(dskinfo), NULL, 0, &amp;dwBytesReturned, NULL))
      {
        THROW_CSTRING(L"ERROR: IOCTL_DISK_SET_PARTITION_INFO_EX failed: 0x%x", GetLastError());
      }
  
    }
  
    catch (CString csErr)
    {
      // Error lookup: https://msdn.microsoft.com/en-us/library/w indows/desktop/ms681382(v=vs.85).aspx
      // 0x7a - ERROR_INSUFFICIENT_BUFFER
      // 0x57 - ERROR_INVALID_PARAMETER
      // 0x32 - ERROR_NOT_SUPPORTED
      // 0x18 - ERROR_BAD_LENGTH
      // 0x05 - ERROR_ACCESS_DENIED
      wcout &lt;&lt; csErr.GetString();
    }
  
    CloseHandle(hDevice);
    delete pdg;
    return 0;
  }
  </code></pre>