]> glassweightruler.freedombox.rocks Git - Ventoy.git/blobdiff - Ventoy2Disk/Ventoy2Disk/DiskService_vds.c
1.0.85 release
[Ventoy.git] / Ventoy2Disk / Ventoy2Disk / DiskService_vds.c
index f930559e20ddacc06b6ba4ec5aa5df00a076f000..e2a1fab7f4e96cc2a696c35b730b3be1e7abe578 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
@@ -1302,27 +1303,62 @@ STATIC BOOL CHKDSK_Volume(CHAR LogicalDrive)
        return TRUE;\r
 }\r
 \r
-\r
-STATIC BOOL VDS_CallBack_ShrinkVolume(void* pInterface, VDS_DISK_PROP* pDiskProp, UINT64 data)\r
+STATIC HRESULT VDS_RealShrinkVolume(void* pInterface, VDS_DISK_PROP* pDiskProp, UINT64 data)\r
 {\r
-       int i;\r
        HRESULT hr, hr2;\r
        IVdsVolume* pVolume = (IVdsVolume*)pInterface;\r
        ULONG completed;\r
        IVdsAsync* pAsync;\r
-       VDS_PARA *VdsPara = (VDS_PARA *)data;\r
+       VDS_PARA* VdsPara = (VDS_PARA*)data;\r
 \r
        (void)pDiskProp;\r
 \r
-       Log("VDS_CallBack_ShrinkVolume (%C:) (%llu) ...", VdsPara->DriveLetter, (ULONGLONG)VdsPara->Offset);\r
+       Log("VDS_ShrinkVolume (%C:) (%llu) ...", VdsPara->DriveLetter, (ULONGLONG)VdsPara->Offset);\r
 \r
        hr = IVdsVolume_Shrink(pVolume, (ULONGLONG)VdsPara->Offset, &pAsync);\r
+\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("ShrinkVolume QueryStatus OK, %lu%%", completed);\r
+                               break;\r
+                       }\r
+                       else if (hr == VDS_E_OPERATION_PENDING)\r
+                       {\r
+                               Log("ShrinkVolume: %lu%%", completed);\r
+                               hr = S_OK;\r
+                       }\r
+                       else\r
+                       {\r
+                               Log("ShrinkVolume invalid status:0x%lx", hr);\r
+                       }\r
+               }\r
+               Sleep(1000);\r
+       }\r
+\r
+       return hr;\r
+}\r
+\r
+STATIC BOOL VDS_CallBack_ShrinkVolume(void* pInterface, VDS_DISK_PROP* pDiskProp, UINT64 data)\r
+{\r
+       int i;\r
+       HRESULT hr;\r
+       VDS_PARA *VdsPara = (VDS_PARA *)data;\r
+\r
+       Log("VDS_CallBack_ShrinkVolume (%C:) (%llu) ...", VdsPara->DriveLetter, (ULONGLONG)VdsPara->Offset);\r
+\r
+       hr = VDS_RealShrinkVolume(pInterface, pDiskProp, data);\r
        if (hr == VDS_E_SHRINK_DIRTY_VOLUME)\r
        {\r
                Log("Volume %C: is dirty, run chkdsk and retry.", VdsPara->DriveLetter);\r
                CHKDSK_Volume(VdsPara->DriveLetter);\r
 \r
-               hr = IVdsVolume_Shrink(pVolume, (ULONGLONG)VdsPara->Offset, &pAsync);\r
+               hr = VDS_RealShrinkVolume(pInterface, pDiskProp, data);\r
                if (hr == VDS_E_SHRINK_DIRTY_VOLUME)\r
                {\r
                        Log("################################################################");\r
@@ -1336,6 +1372,65 @@ STATIC BOOL VDS_CallBack_ShrinkVolume(void* pInterface, VDS_DISK_PROP* pDiskProp
                }\r
        }\r
 \r
+       if (hr != S_OK)\r
+       {\r
+               VDS_SET_ERROR(hr);\r
+               Log("Could not ShrinkVolume, 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
+\r
+BOOL VDS_ShrinkVolume(int DriveIndex, const char* VolumeGuid, CHAR DriveLetter, UINT64 OldBytes, UINT64 ReduceBytes)\r
+{\r
+       int i;\r
+       BOOL ret = FALSE;\r
+       WCHAR wGuid[128] = { 0 };\r
+       const char *guid = NULL;\r
+       VDS_PARA Para;\r
+\r
+       (VOID)DriveIndex;\r
+       (VOID)OldBytes;\r
+\r
+       guid = strstr(VolumeGuid, "{");\r
+       if (!guid)\r
+       {\r
+               return FALSE;\r
+       }\r
+\r
+       for (i = 0; i < 128 && guid[i]; i++)\r
+       {\r
+               wGuid[i] = guid[i];\r
+       }\r
+\r
+       Para.Offset = ReduceBytes;\r
+       Para.DriveLetter = DriveLetter;\r
+\r
+       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
+}\r
+\r
+\r
+STATIC BOOL VDS_CallBack_FormatVolume(void* pInterface, VDS_DISK_PROP* pDiskProp, UINT64 data)\r
+{\r
+       int fs;\r
+       HRESULT hr, hr2;\r
+       ULONG completed;\r
+       IVdsAsync* pAsync;\r
+       IVdsVolumeMF3* pVolume = (IVdsVolumeMF3*)pInterface;\r
+       WCHAR* pFs = NULL;\r
+       VDS_PARA* VdsPara = (VDS_PARA*)data;\r
+       \r
+       fs = (int)VdsPara->Attr;\r
+       pFs = GetVentoyFsFmtNameByTypeW(fs);\r
+       \r
+       Log("VDS_CallBack_FormatVolume (%C:) (%s) ClusterSize:%u ...", VdsPara->DriveLetter, GetVentoyFsFmtNameByTypeA(fs), VdsPara->ClusterSize);\r
+\r
+       hr = IVdsVolumeMF3_FormatEx2(pVolume, pFs, 0, VdsPara->ClusterSize, L"Ventoy", VDS_FSOF_FORCE | VDS_FSOF_QUICK, &pAsync);\r
        while (SUCCEEDED(hr))\r
        {\r
                hr = IVdsAsync_QueryStatus(pAsync, &hr2, &completed);\r
@@ -1344,17 +1439,17 @@ STATIC BOOL VDS_CallBack_ShrinkVolume(void* pInterface, VDS_DISK_PROP* pDiskProp
                        hr = hr2;\r
                        if (hr == S_OK)\r
                        {\r
-                               Log("ShrinkVolume QueryStatus OK, %lu%%", completed);\r
+                               Log("FormatVolume QueryStatus OK, %lu%%", completed);\r
                                break;\r
                        }\r
                        else if (hr == VDS_E_OPERATION_PENDING)\r
                        {\r
-                               Log("ShrinkVolume: %lu%%", completed);\r
+                               Log("FormatVolume: %lu%%", completed);\r
                                hr = S_OK;\r
                        }\r
                        else\r
                        {\r
-                               Log("ShrinkVolume invalid status:0x%lx", hr);\r
+                               Log("FormatVolume invalid status:0x%lx", hr);\r
                        }\r
                }\r
                Sleep(1000);\r
@@ -1363,7 +1458,7 @@ STATIC BOOL VDS_CallBack_ShrinkVolume(void* pInterface, VDS_DISK_PROP* pDiskProp
        if (hr != S_OK)\r
        {\r
                VDS_SET_ERROR(hr);\r
-               Log("Could not ShrinkVolume, 0x%x err:0x%lx (%s)", hr, LASTERR, WindowsErrorString(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
@@ -1371,21 +1466,25 @@ STATIC BOOL VDS_CallBack_ShrinkVolume(void* pInterface, VDS_DISK_PROP* pDiskProp
 \r
        return TRUE;\r
 }\r
-\r
-BOOL VDS_ShrinkVolume(int DriveIndex, const char* VolumeGuid, CHAR DriveLetter, UINT64 OldBytes, UINT64 ReduceBytes)\r
+BOOL VDS_FormatVolume(char DriveLetter, int fs, DWORD ClusterSize)\r
 {\r
        int i;\r
        BOOL ret = FALSE;\r
+       const char* guid = NULL;\r
+       CHAR Drive[32] = { 0 };\r
        WCHAR wGuid[128] = { 0 };\r
-       const char *guid = NULL;\r
+       CHAR VolumeGuid[128] = { 0 };\r
        VDS_PARA Para;\r
 \r
-       (VOID)DriveIndex;\r
-       (VOID)OldBytes;\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
@@ -1393,11 +1492,14 @@ BOOL VDS_ShrinkVolume(int DriveIndex, const char* VolumeGuid, CHAR DriveLetter,
        {\r
                wGuid[i] = guid[i];\r
        }\r
+       Log("VDS_FormatVolume find GUID %C: <%s> ", DriveLetter, VolumeGuid);\r
 \r
-       Para.Offset = ReduceBytes;\r
+       Para.Attr = fs;\r
        Para.DriveLetter = DriveLetter;\r
+       Para.ClusterSize = ClusterSize;\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
-       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