Когда я запускаю CreateVritualDisk, я получаю ошибку 87 (ERROR_INVALID_PARAMETER). Предположительно, отсутствует параметр или неверен. Проблема с версией CREATE_VIRTUAL_DISK_VERSION_2, CREATE_VIRTUAL_DISK_VERSION_1 выполняется успешно.Каковы правильные параметры для CREATE_VIRTUAL_DISK_VERSION_2?
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;
Я уже пробовал несколько комбинаций, но не удался.
EDIT: Я использую Windows 10. В будущем я хочу создать файлы VHD и VHDX (фиксированные, динамические и разностные) с помощью одного вызова метода. В данный момент я хочу создать VHDX (фиксированный, динамический и разностный).
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;
Какой ОС вы используете? Версия 2 не поддерживается до Windows 8. –
Просто вы знаете, что документация MSDN для API виртуальных дисков ужасна. Куча вещей отсутствует или неверна. – theB
Какой тип устройства вы на самом деле создаете? Значения различаются в зависимости от того, является ли это VHD, VHDX или VHD Set – cogumel0