#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
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
}\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
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
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
\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
{\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