+}\r
+\r
+\r
+STATIC BOOL VDS_CallBack_FormatVolume(void* pInterface, VDS_DISK_PROP* pDiskProp, UINT64 data)\r
+{\r
+ HRESULT hr, hr2;\r
+ ULONG completed;\r
+ IVdsAsync* pAsync;\r
+ IVdsVolumeMF3* pVolume = (IVdsVolumeMF3*)pInterface;\r
+ WCHAR* pFs = NULL;\r
+ WCHAR FsNTFS[32] = L"NTFS";\r
+ WCHAR FsFAT32[32] = L"FAT32";\r
+ VDS_PARA* VdsPara = (VDS_PARA*)data;\r
+ \r
+ pFs = (VdsPara->Attr == 1) ? FsNTFS : FsFAT32;\r
+ Log("VDS_CallBack_FormatVolume (%C:) (%llu) ...", VdsPara->DriveLetter, (ULONGLONG)VdsPara->Attr);\r
+\r
+ hr = IVdsVolumeMF3_FormatEx2(pVolume, pFs, 0, 0, L"Ventoy", VDS_FSOF_FORCE | VDS_FSOF_QUICK, &pAsync);\r
+ while (SUCCEEDED(hr))\r
+ {\r
+ hr = IVdsAsync_QueryStatus(pAsync, &hr2, &completed);\r
+ if (SUCCEEDED(hr))\r
+ {\r
+ hr = hr2;\r
+ if (hr == S_OK)\r
+ {\r
+ Log("FormatVolume QueryStatus OK, %lu%%", completed);\r
+ break;\r
+ }\r
+ else if (hr == VDS_E_OPERATION_PENDING)\r
+ {\r
+ Log("FormatVolume: %lu%%", completed);\r
+ hr = S_OK;\r
+ }\r
+ else\r
+ {\r
+ Log("FormatVolume invalid status:0x%lx", hr);\r
+ }\r
+ }\r
+ Sleep(1000);\r
+ }\r
+\r
+ if (hr != S_OK)\r
+ {\r
+ VDS_SET_ERROR(hr);\r
+ Log("Could not FormatVolume, 0x%x err:0x%lx (%s)", hr, LASTERR, WindowsErrorString(hr));\r
+\r
+ VDS_SET_ERROR(hr);\r
+ return FALSE;\r
+ }\r
+\r
+ return TRUE;\r
+}\r
+BOOL VDS_FormatVolume(char DriveLetter, int fs)\r
+{\r
+ int i;\r
+ BOOL ret = FALSE;\r
+ const char* guid = NULL;\r
+ CHAR Drive[32] = { 0 };\r
+ WCHAR wGuid[128] = { 0 };\r
+ CHAR VolumeGuid[128] = { 0 };\r
+ VDS_PARA Para;\r
+\r
+ Drive[0] = DriveLetter;\r
+ Drive[1] = ':';\r
+ Drive[2] = '\\';\r
+ GetVolumeNameForVolumeMountPointA(Drive, VolumeGuid, sizeof(VolumeGuid) / 2);\r
+\r
+ guid = strstr(VolumeGuid, "{");\r
+ if (!guid)\r
+ {\r
+ Log("Can not find volume GUID for %s:", Drive);\r
+ return FALSE;\r
+ }\r
+\r
+ for (i = 0; i < 128 && guid[i]; i++)\r
+ {\r
+ wGuid[i] = guid[i];\r
+ }\r
+ Log("VDS_FormatVolume find GUID %C: <%s> ", DriveLetter, VolumeGuid);\r
+\r
+ Para.Attr = fs;\r
+ Para.DriveLetter = DriveLetter;\r
+\r
+ ret = VDS_VolumeCommProc(INTF_VOLUME_MF3, wGuid, VDS_CallBack_FormatVolume, (UINT64)&Para);\r
+ Log("VDS_FormatVolume %C: <%s> ret:%d (%s)", DriveLetter, VolumeGuid, ret, ret ? "SUCCESS" : "FAIL");\r
+\r
+ return ret;\r
+}\r