错误:在WIN7中使用“CreateVirtualDisk”函数时访问被拒绝

时间:2010-07-08 16:24:23

标签: c# pinvoke virtual-disk

现在我正在尝试使用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 \” 失败! 访问被拒绝。
  5. 如果您能告诉我解决此问题的方法,我将非常感谢您的帮助。

    我的最好,

    Hoang Anh Nguyen

1 个答案:

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

鱼骨