when I run CreateVritualDisk, I get the error 87 (ERROR_INVALID_PARAMETER). Presumably missing a parameter or is incorrect. The problem is with the version CREATE_VIRTUAL_DISK_VERSION_2, CREATE_VIRTUAL_DISK_VERSION_1 runs successfully.
function TForm3.CreateVHDX(const AFilePath: string; const ASize: ULONG; const AType: integer; out AReturn: DWORD): Boolean;
var
params: TCreateVirtualDiskParameters;
mask: TVIRTUAL_DISK_ACCESS_MASK;
vst: TVirtualStorageType;
hvhd: THandle;
begin
hVhd := INVALID_HANDLE_VALUE;
// vst.DeviceId := VIRTUAL_STORAGE_TYPE_DEVICE_VHDX;
vst.DeviceId := VIRTUAL_STORAGE_TYPE_DEVICE_UNKNOWN;
// vst.VendorId := VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT ;
vst.VendorId := VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN;
params.Version:= CREATE_VIRTUAL_DISK_VERSION_2;
params.Version2.UniqueId := TGUID.Empty;
params.Version2.MaximumSize:= ASize * 1024 * 1024;
params.Version2.BlockSizeInBytes := CREATE_VIRTUAL_DISK_PARAMETERS_DEFAULT_BLOCK_SIZE; //0
params.Version2.SectorSizeInBytes := $200;
params.Version2.PhysicalSectorSize := $200;
params.Version2.ParentPath := nil;
// params.Version2.OpenFlags := OPEN_VIRTUAL_DISK_FLAG_NONE;
params.Version2.ResiliencyGuid := TGUID.Empty;
// params.Version2.ParentVirtualStorageType := ;
mask := VIRTUAL_DISK_ACCESS_NONE;
if AType = 0 then //dynamic
begin
AReturn := CreateVirtualDisk(
@vst,
PWideChar(AFilePath),
mask,
nil,
CREATE_VIRTUAL_DISK_FLAG_NONE,
0,
@params,
nil,
hvhd);
Result := AReturn = ERROR_SUCCESS;
end;
if AType = 1 then //fixed
begin
AReturn := CreateVirtualDisk(
@vst,
PWideChar(AFilePath),
mask,
nil,
CREATE_VIRTUAL_DISK_FLAG_FULL_PHYSICAL_ALLOCATION,
0,
@params,
nil,
hvhd);
Result := AReturn = ERROR_SUCCESS;
end;
if hvhd <> INVALID_HANDLE_VALUE then
CloseHandle( hvhd )
end;
I have already tried several combinations, but no success.
EDIT: I use Windows 10. In the future, i want to create VHD and VHDX files (fixed, dynamic and differencing) with one method call. At this moment, i want to create VHDX (fixed, dynamic and differencing).
TCreateVirtualDiskParametersVersion2 = record
UniqueId: TGUID;
MaximumSize: ULONGLONG;
BlockSizeInBytes: ULONG;
SectorSizeInBytes: ULONG;
PhysicalSectorSize: ULONG;
ParentPath: LPCWSTR;
SourcePath: LPCWSTR;
OpenFlags: TOPEN_VIRTUAL_DISK_FLAG;
ParentVirtualStorageType: VIRTUAL_STORAGE_TYPE;
SourceVirtualStorageType: VIRTUAL_STORAGE_TYPE;
ResiliencyGuid: TGUID;
end;