2

現在、物理ディスクと仮想ディスクの両方から VHD を作成する CreateVirtualDisk 機能を試しています。エラーのため、ここで 1 週間立ち往生しています: 物理ディスクから VHD を作成しようとしたときにアクセスが拒否されました。私は常に管理者権限でプログラムを実行していたので、理論的にはうまくいくはずですが、うまくいきませんでした。ここで何がうまくいかなかったのか本当にわかりません。

ここで 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 サービスによって作成されたボリューム ID: sourcepath = @"\?\Volume{a3c3c244-8b7a-11de-a777-806e6f6e6963}\" 失敗しました!  アクセスが拒否されました。
  4. VSS サービスで作成したボリューム ID の絶対パスで sourcepath = @"\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy30\" に失敗しました!  アクセスが拒否されました。

この問題を解決する方法を教えていただければ、大変助かります。

私の精一杯、

ホアン・アン・グエン

4

1 に答える 1

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について詳しく説明することはできません。

魚の骨

于 2011-01-03T17:34:54.057 に答える