我想从C#应用程序使用DiskPart重新分区USB驱动器。这似乎相当简单:我使用Win32_DiskDrive类收集有关插入磁盘的数据,然后使用DiskPart运行将更改分区的脚本。关键点似乎是将我从Win32_DiskDrive中选择的条目映射到DiskPart中的磁盘号。例如,这是DiskPart的输出:
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检索的数据的数字?我想答案是使用“DeviceID”字段,它返回“\\。\ PHYSICALDRIVE0”。最后的索引似乎是我需要将Win32_DiskDrive中的条目与DiskPart中的相关条目相匹配的索引。它是否正确?关键问题是:官方文档中是否有任何地方毫无疑问地说明了这一点?然后我将格式化设备,这样我就不会做错任何事。 感谢。
答案 0 :(得分:1)
您需要使用 uint32索引;
给定驱动器的物理驱动器号。此属性由填充 从{返回的STORAGE_DEVICE_NUMBER结构 IOCTL_STORAGE_GET_DEVICE_NUMBER控制代码。值0xffffffff 表示给定的驱动器未映射到物理驱动器。
关于 DiskPart 磁盘号 - 我在文档中找不到明确说明这里的磁盘号是什么意思。但是我看看调试器下,磁盘的diskpart格式行 - 内部函数
long ListDiskLine(IVdsDisk *)
呼吁这一点。
它使用IVdsDisk
接口获取磁盘属性。调用get IVdsDisk::GetProperties
结构的VDS_DISK_PROP
方法
然后使用 pwszName 成员:
pwszName :操作系统用于标识磁盘的以null结尾的Unicode名称。如果存在,客户端可以使用它 用于确定磁盘的PNP设备编号的属性。这是号码 从
DeviceNumber
的STORAGE_DEVICE_NUMBER
成员中获取 (见[MSDN-STRGEDEVNUM])。对于硬盘,此名称具有格式\\?\PhysicalDriveN
,其中N
表示设备的编号 磁盘。对于DVD / CD驱动器,此名称的格式为\\?\CdRomN
,其中N
表示DVD / CD驱动器的设备编号。客户端可以使用此属性来标识磁盘。
对于硬盘使用下一个代码获取 N :
或将其翻译为 c / c ++
esi = _wtol(pvdp->pwszName + RTL_NUMBER_OF("\\\\?\\PhysicalDrive") - 1);
0x22
为0x11*sizeof(WCHAR)
,\\?\PhysicalDrive
前缀中的符号为0x11(17)。
来自N
的diskpart检索器\\?\PhysicalDriveN
,这就是数字
从 DeviceNumber
的 STORAGE_DEVICE_NUMBER
成员获得(等于Win32_DiskDrive.Index
)
最后esi
(存储N
)用作:
StringCchPrintf(sz, 0x400, L"%s Disk %-3lu %-13.13s %7s %7s %s %s\r\n", *, esi, ..);
ConsolePrintf(sz);