когда я запускаю CreateVritualDisk, я получаю сообщение об ошибке 87 (ERROR_INVALID_PARAMETER). Предположительно отсутствует параметр или указан неверно. Проблема с версией CREATE_VIRTUAL_DISK_VERSION_2, CREATE_VIRTUAL_DISK_VERSION_1 работает успешно.
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;
Я уже пробовал несколько комбинаций, но безуспешно.
РЕДАКТИРОВАТЬ: я использую 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;
CreateVirtualDisk()
. Можете ли вы также вставить свою структуруCREATE_VIRTUAL_DISK_PARAMETERS
? - person cogumel0   schedule 26.06.2016SourcePath
на ноль? Предположительно, в настоящее время он имеет значение пустой строки. - person cogumel0   schedule 26.06.2016PhysicalSectorSizeInBytes
при создании виртуального диска, а также не можете вызывать определенные методы, такие как методResizeVirtualDisk()
. - person cogumel0   schedule 26.06.2016