2010-07-08 4 views
2

지금은 CreateVirtualDisk 기능을 사용하여 실제 디스크와 가상 디스크 모두에서 VHD를 생성하고 있습니다. 오류로 인해 1 주일 동안 여기에 갇혀 있습니다. 물리적 디스크에서 VHD를 만들려고 할 때 액세스가 거부되었습니다. 나는 항상 관리자 권한으로 프로그램을 실행 했으므로 이론적으로는 효과가 있지만 그렇지 않았다. 나는 여기서 무엇이 잘못되었는지 정말로 모른다.오류 : WIN7에서 'CreateVirtualDisk'기능을 사용할 때 액세스가 거부되었습니다.

현재 VHD의 API 문서를 찾을 수 있습니다

[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); 

그리고 :

VHD 내가 도서관 'virtdisk.dll'에서이 메서드를 호출 PInvoke를 사용, 이것은 내가 기능을 정의하는 방법이다

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 기존 가상 디스크의 절대 경로로

  1. : 617,451,515,

    나는 결과는 여기에 많은 문자열 변수 '원본 경로'의 가치와 함께있는 시도 "; 성공!

  2. 실제 디스크의 절대 경로로 : sourcepath = @ "C : \"; 실패했습니다!  액세스가 거부되었습니다.
  3. VSS에서 생성 한 볼륨 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를을 말할 수는 있기 때문에 그럴 수 없어 코드에서 소스 경로 심볼의 정의를 찾으십시오.

fishbone

관련 문제