现在我正在尝试使用CreateVirtualDisk函数从物理磁盘和虚拟磁盘创建VHD。由于错误,我被困在这里一个星期:当我尝试从物理磁盘创建VHD时,访问被拒绝。我总是使用管理员权限运行该程序,所以理论上它应该可以解决,但事实并非如此。我真的不知道这里出了什么问题。
您可以在此处找到VHD API文档:VHD
我使用PInvoke从库'virtdisk.dll'调用此方法,这是我定义函数的方式:
[DllImport("virtdisk.dll", CharSet = CharSet.Unicode)]
public static extern Int32 CreateVirtualDisk(
ref VIRTUAL_STORAGE_TYPE VirtualStorageType,
String Path,
_VIRTUAL_DISK_ACCESS_MASK VirtualDiskAccessMask,
IntPtr SecurityDescriptor,
_CREATE_VIRTUAL_DISK_FLAG Flags,
Int32 ProviderSpecificFlags,
ref CREATE_VIRTUAL_DISK_PARAMETERS Parameters,
IntPtr Overlapped,
ref VirtualDiskSafeHandle Handle);
这就是我收到错误的方式:
我设置了所有参数:
VIRTUAL_STORAGE_TYPE:
o virtualStorageType.DeviceID = VIRTUAL_STORAGE_TYPE_DEVICE_VHD;
o virtualStorageType.VendorID = VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT;
PATH: // name of the new VHD file
o m_path = “D:\VirtualDisk\test.vhd”;
VIRTUAL_DISK_ACCESS_MASK:
o virtualDiskAccessMask = VIRTUAL_DISK_ACCESS_MASK.VIRTUAL_DISK_ACCESS_CREATE;
SECURITY_DESCRIPTOR:
o securityDescriptor = IntPtr.Zero;
CREATE_VIRTUAL_DISK_FLAG:
o createVirtualDiskFlag = CREATE_VIRTUAL_DISK_FLAG.CREATE_VIRTUAL_DISK_FLAG_FULL_PHYSICAL_ALLOCATION
ProviderSpecificFlag:
o providerSpecificFlag = 0;
CREATE_VIRTUAL_DISK_PARAMETER:
o m_createVirtualDiskParameters.Version = _CREATE_VIRTUAL_DISK_VERSION.CREATE_VIRTUAL_DISK_VERSION_1;
o m_createVirtualDiskParameters.Version1.UniqueId = Guid.Empty;
o m_createVirtualDiskParameters.Version1.MaximumSize = 0;
o m_createVirtualDiskParameters.Version1.BlockSizeInBytes = 0;
o m_createVirtualDiskParameters.Version1.SectorSizeInByte = VirtualDisk.CREATE_VIRTUAL_DISK_PARAMETERS_DEFAULT_SECTOR_SIZE;
o m_createVirtualDiskParameters.Version1.ParentPath = IntPtr.Zero;
o m_createVirtualDiskParameters.Version1.SourcePath = Marshal.StringToHGlobalAuto(sourcepath);
OVERLAPPED:
o Overlapped = IntPtr.Zero ;
HANDLE:
o handle
我尝试过使用字符串变量'sourcepath'的许多值,结果如下:
如果您能告诉我解决此问题的方法,我将非常感谢您的帮助。
我的最好,
Hoang Anh Nguyen
答案 0 :(得分:0)
使用此配置对我有用:
MaximumSize: 0x40000000 //0 leads to error 87 (invalid parameter)
BlockSizeInBytes: 0x80000 // 0 leads to error 87 (invalid parameter)
createVirtualDiskFlag: CREATE_VIRTUAL_DISK_FLAG_NONE //didn't test full physical allocation
SourcePath: 0 //I think that this causes the problem in your program
我不能多说 SourcePath ,因为我在代码中找不到 sourcepath 符号的定义。
鱼骨