gpt4 book ai didi

c# - 错误 : Access denied when using the function 'CreateVirtualDisk' in WIN7

转载 作者:太空宇宙 更新时间:2023-11-03 16:53:11 25 4
gpt4 key购买 nike

现在我正在尝试使用 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”的许多值,结果如下:

  1. 使用现有虚拟磁盘的绝对路径:sourcepath = @"D:\VirtualDisk\KarhuBearOS.vhd";成功!
  2. 使用物理磁盘的绝对路径:sourcepath = @"C:\";失败的!  访问被拒绝。
  3. 使用 VSS 服务创建的卷 ID:sourcepath = @"\?\Volume{a3c3c244-8b7a-11de-a777-806e6f6e6963}\"失败的!  访问被拒绝。
  4. 使用 VSS 服务创建的卷 ID 的绝对路径sourcepath = @"\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy30\"失败的!  访问被拒绝。

如果您能告诉我解决此问题的方法,我将不胜感激。

我最好的,

黄英阮

最佳答案

它适用于我的配置:


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 符号的定义。

鱼骨

关于c# - 错误 : Access denied when using the function 'CreateVirtualDisk' in WIN7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3205811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com