使用DiskPart重新分区USB设备

时间:2017-12-06 08:29:34

标签: c# windows winapi disk-partitioning

我想从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中的相关条目相匹配的索引。它是否正确?关键问题是:官方文档中是否有任何地方毫无疑问地说明了这一点?然后我将格式化设备,这样我就不会做错任何事。 感谢。

1 个答案:

答案 0 :(得分:1)

您需要使用 uint32索引;

  

给定驱动器的物理驱动器号。此属性由填充   从{返回的STORAGE_DEVICE_NUMBER结构   IOCTL_STORAGE_GET_DEVICE_NUMBER控制代码。值0xffffffff   表示给定的驱动器未映射到物理驱动器。

关于 DiskPart 磁盘号 - 我在文档中找不到明确说明这里的磁盘号是什么意思。但是我看看调试器下,磁盘的diskpart格式行 - 内部函数

long ListDiskLine(IVdsDisk *)

呼吁这一点。

enter image description here

它使用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

enter image description here

或将其翻译为 c / c ++

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

0x220x11*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);

enter image description here