2010-07-08 18 views
2

À l'heure actuelle, j'expérimente la fonction CreateVirtualDisk pour créer un disque dur virtuel à partir du disque physique et du disque virtuel. Je suis coincé ici pendant une semaine à cause de l'erreur: L'accès est refusé lorsque j'ai essayé de créer un disque dur virtuel à partir d'un disque physique. J'ai toujours exécuté le programme avec les droits d'administrateur, donc en théorie, ça devrait marcher, mais ce n'est pas le cas. Je ne sais vraiment pas ce qui s'est passé ici.Erreur: Accès refusé lors de l'utilisation de la fonction 'CreateVirtualDisk' dans WIN7

Vous pouvez trouver VHD document API ici: VHD

J'ai utilisé le PInvoke pour appeler cette méthode de la bibliothèque 'virtdisk.dll', voilà comment je défini la fonction:

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

Et voilà comment je reçu l'erreur:

Je lâchais tous les paramètres comme ceci:

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 

J'ai essayé avec beaucoup de valeurs de la variable chaîne « sourcepath » et voici les résultats:

  1. Avec le chemin absolu d'un disque virtuel existant: sourcepath = @ "D: \ virtualdisk \ KarhuBearOS.vhd "; Succès! Avec le chemin absolu d'un disque physique: sourcepath = @ "C: \"; Échec!  L'accès est refusé.
  2. Avec un ID de volume créé par le Service VSS: sourcepath = @ "\ \ {volume a3c3c244-8b7a-11de-a777-806e6f6e6963} \" Échec!  L'accès est refusé.
  3. Le chemin absolu d'un ID de volume créé par le service VSS sourcepath = @ "\? \ GLOBALROOT \ Device \ HarddiskVolumeShadowCopy30 \" Echec!  L'accès est refusé.

J'apprécierai grandement votre aide si vous pouvez me montrer la manière de corriger ce problème.

Mon meilleur,

Hoang Anh Nguyen

Répondre

0

cela fonctionne pour moi avec cette configuration:


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 

Je ne peux pas en dire plus sur SourcePath, puisque je ne peux pas trouver une définition de sourcepath dans votre code.

fishbone