2
現在我正在嘗試使用CreateVirtualDisk函數從物理磁盤和虛擬磁盤創建VHD。由於錯誤,我在這裏陷入了一個星期:當我嘗試從物理磁盤創建VHD時,訪問被拒絕。我總是用管理員權限運行這個程序,所以理論上它應該解決問題,但是它沒有。我真的不知道這裏出了什麼問題。錯誤:在WIN7中使用函數'CreateVirtualDisk'時訪問被拒絕
你可以在這裏找到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
我已用字符串變量「源路徑」的許多值,並且在這裏試圖是結果:
- 隨着現有虛擬磁盤的絕對路徑: 源路徑= @「d:\ VirtualDisk \ KarhuBearOS.vhd 「; 成功!
- 使用物理磁盤的絕對路徑: sourcepath = @「C:\」; 失敗! 訪問被拒絕。
- 由VSS Service創建的卷ID: sourcepath = @「\?\ Volume {a3c3c244-8b7a-11de-a777-806e6f6e6963} \」 失敗! 訪問被拒絕。
- 由VSS服務創建的卷ID的絕對路徑 sourcepath = @「\?\ GLOBALROOT \ Device \ HarddiskVolumeShadowCopy30 \」 失敗! 訪問被拒絕。
如果您能告訴我解決此問題的方法,我將非常感謝您的幫助。
我的最好的,
晃映阮