]> glassweightruler.freedombox.rocks Git - Ventoy.git/blobdiff - Ventoy2Disk/Ventoy2Disk/DiskService_vds.c
Ventoy2Disk.exe update.
[Ventoy.git] / Ventoy2Disk / Ventoy2Disk / DiskService_vds.c
index 3a6383031aea65410293283cb64ab0fc77d8bc22..f0ee6f93ef0a33a98c1a2a5e1a7716b4bf9a1137 100644 (file)
@@ -590,6 +590,7 @@ const char *WindowsErrorString(DWORD error_code)
 #define IVdsVolume_QueryInterface(This, riid, ppvObject) (This)->lpVtbl->QueryInterface(This, riid, ppvObject)\r
 #define IVdsVolume_Release(This) (This)->lpVtbl->Release(This)\r
 #define IVdsVolumeMF3_QueryVolumeGuidPathnames(This, pwszPathArray, pulNumberOfPaths) (This)->lpVtbl->QueryVolumeGuidPathnames(This,pwszPathArray,pulNumberOfPaths)\r
+#define IVdsVolumeMF_Format(This, type, pwsszLabel, dwUnitAllocationSize, bForce, bQuickFormat, bEnableCompression, ppAsync) (This)->lpVtbl->Format(This, type, pwsszLabel, dwUnitAllocationSize, bForce, bQuickFormat, bEnableCompression, ppAsync)\r
 #define IVdsVolumeMF3_FormatEx2(This, pwszFileSystemTypeName, usFileSystemRevision, ulDesiredUnitAllocationSize, pwszLabel, Options, ppAsync) (This)->lpVtbl->FormatEx2(This, pwszFileSystemTypeName, usFileSystemRevision, ulDesiredUnitAllocationSize, pwszLabel, Options, ppAsync)\r
 #define IVdsVolumeMF3_Release(This) (This)->lpVtbl->Release(This)\r
 #define IVdsVolume_GetProperties(This, pVolumeProperties) (This)->lpVtbl->GetProperties(This,pVolumeProperties)\r
@@ -1411,4 +1412,92 @@ BOOL VDS_ShrinkVolume(int DriveIndex, const char* VolumeGuid, CHAR DriveLetter,
        ret = VDS_VolumeCommProc(INTF_VOLUME, wGuid, VDS_CallBack_ShrinkVolume, (UINT64)&Para);\r
        Log("VDS_ShrinkVolume %C: ret:%d (%s)", DriveLetter, ret, ret ? "SUCCESS" : "FAIL");\r
        return ret;\r
-}
\ No newline at end of file
+}\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