2010-07-08 35 views
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 

我已用字符串變量「源路徑」的許多值,並且在這裏試圖是結果:

  1. 隨着現有虛擬磁盤的絕對路徑: 源路徑= @「d:\ VirtualDisk \ KarhuBearOS.vhd 「; 成功!
  2. 使用物理磁盤的絕對路徑: sourcepath = @「C:\」; 失敗! 訪問被拒絕。
  3. 由VSS Service創建的卷ID: sourcepath = @「\?\ Volume {a3c3c244-8b7a-11de-a777-806e6f6e6963} \」 失敗! 訪問被拒絕。
  4. 由VSS服務創建的卷ID的絕對路徑 sourcepath = @「\?\ GLOBALROOT \ Device \ HarddiskVolumeShadowCopy30 \」 失敗! 訪問被拒絕。

如果您能告訴我解決此問題的方法,我將非常感謝您的幫助。

我的最好的,

晃映阮

回答

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,因爲我不能在您的代碼中找到源路徑符號的定義。

魚骨