2017-12-06 12 views
1

C#アプリケーションからDiskPartを使用してUSBドライブを再分割したいとします。これはかなり簡単です:私は、Win32_DiskDriveクラスを使用してプラグインされたディスクに関するデータを収集し、DiskPartを使用してパーティションを変更するスクリプトを実行します。クリティカルポイントは、私がWin32_DiskDriveから選択したエントリをDiskPartのディスク番号にマッピングするものです。たとえば、これはDiskPartの出力です。DiskPartを使用してUSBデバイスを再分割する

DISKPART> list disk 

    Disk ### Status   Size  Free  Dyn Gpt 
    -------- ------------- ------- ------- --- --- 
* Disk 0 Online   100 GB  0 B 
    Disk 1 Online   14 GB  0 B 

ディスクを番号で選択する必要があります。しかし、Win32_DiskDriveを使って取得したデータからその番号を取得するのはどこですか?私は答えが "\\。\ PHYSICALDRIVE0"を返す "DeviceID"フィールドを使用していると思います。最後のインデックスは、Win32_DiskDriveのエントリをDiskPartの関連エントリに一致させるために必要なインデックスのようです。これは正しいです?クリティカルな質問は、公式の文書のどこにこれが疑うことなく記載されているのですか?私はここで何もできないようにデバイスをフォーマットします。おかげさまで

答えて

1

使用する必要がありますuint32インデックス;

特定のドライブの物理ドライブ番号。このプロパティは、 IOCTL_STORAGE_GET_DEVICE_NUMBER制御コードから返されたSTORAGE_DEVICE_NUMBER構造体によって埋められます。値0xffffffff は、指定されたドライブが物理ドライブにマップされないことを示します。


についてのDiskPartディスク番号 - 私は、ディスクの数がここで意味が何であるかを知らせる明確なドキュメントに記載されていません。しかし、私はデバッガの下で、どのようにディスクのためのdiskpart形式の行を見る - 内部機能

これが呼び出されます。

enter image description here

それは、getディスクのプロパティのIVdsDiskインタフェースを使用していました。 IVdsDisk::GetProperties方法は取得VDS_DISK_PROP構造 を呼びかけ、その後pwszNameメンバー使用:

pwszName:NULLで終了するUnicode名オペレーティングシステムがディスクを識別するために使用するが。存在する場合、クライアントはこの プロパティを使用してディスクのPNPデバイス番号を判断できます。これは、STORAGE_DEVICE_NUMBERDeviceNumber部材([MSDN-STRGEDEVNUM]を参照)から得られた数 あります。ハードディスクの場合、この名前の形式は \\?\PhysicalDriveNです。Nは、 ディスクのデバイス番号を示します。 DVD/CDドライブの場合、この名前の形式は\\?\CdRomNです。ここで、 Nは、DVD/CDドライブのデバイス番号を示します。クライアントはこのプロパティを使用してディスクを識別できます。Nを得るために、次のコードを使用したハードディスク用

C/C++

esi = _wtol(pvdp->pwszName + RTL_NUMBER_OF("\\\\?\\PhysicalDrive") - 1); 

にこれを変換する場合

enter image description here

をかは0x220x11*sizeof(WCHAR)と正確です0×11(17)は\\?\PhysicalDriveのプレフィックスです。

よう\\?\PhysicalDriveNこのからDISKPARTレトリーバーNSTORAGE_DEVICE_NUMBERDeviceNumber部材(Win32_DiskDrive.Indexにそう等しい)

、最終的にesi(記憶N)から得られた数を として使用される。

StringCchPrintf(sz, 0x400, L"%s Disk %-3lu %-13.13s %7s %7s %s %s\r\n", *, esi, ..); 
ConsolePrintf(sz); 

enter image description here

+0

ありがとうございますが、問題は残っているようです。 「Index」はDiskPartが参照する値であることを示す文書がありますか? –

+0

@LucaCarlon - DiskPart *のディスク番号について説明している文書は見つかりませんでしたが、これはとにかく 'STORAGE_DEVICE_NUMBER'の' DeviceNumber'メンバーであることをリサーチに示しています - Win32_DiskDrive.Indexと同じです。 – RbMm

+0

偉大な分析!ありがとう! –

関連する問題