Ошибка: доступ запрещен при использовании функции «CreateVirtualDisk» в WIN7 - PullRequest
2 голосов
/ 08 июля 2010

Сейчас я экспериментирую с функцией 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

Я пробовал много значений строковой переменной 'sourcepath' и вот результаты:

  1. С абсолютным путем к существующему виртуальному диску: sourcepath = @ "D: \ VirtualDisk\ KarhuBearOS.vhd ";Успех!
  2. С абсолютным путем физического диска: sourcepath = @ "C: \";Не удалось! Доступ запрещен.
  3. С идентификатором тома, созданным службой VSS: sourcepath = @ "\? \ Volume {a3c3c244-8b7a-11de-a777-806e6f6e6963} \" Ошибка! Доступ запрещен.
  4. При абсолютном пути идентификатора тома, созданного службой VSS sourcepath = @ "\? \ GLOBALROOT \ Device \ HarddiskVolumeShadowCopy30 \" Ошибка! Доступ запрещен.

Я буду очень признателен за вашу помощь, если вы покажете мне, как решить эту проблему.

С наилучшими пожеланиями,

Хоанг АнхНгуен

1 Ответ

0 голосов
/ 03 января 2011

у меня работает с такой конфигурацией:


 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 в вашем коде.

елочки

...