1

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

4

1 回答 1

1

你需要使用uint32 索引;

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


关于DiskPart磁盘编号 - 我在文档中没有明确说明磁盘编号是什么意思。但是我在调​​试器下查看,磁盘的 diskpart 格式行如何 - 内部功能

long ListDiskLine(IVdsDisk *)

为此。

在此处输入图像描述

它使用IVdsDisk接口来获取磁盘属性。该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);

前缀中的0x22is0x11*sizeof(WCHAR)和正好是 0x11 (17) 符号。\\?\PhysicalDrive

所以diskpart检索器N来自\\?\PhysicalDriveN,这是从(等于)的DeviceNumber成员获得的数字STORAGE_DEVICE_NUMBERWin32_DiskDrive.Index

最后esi(存储在哪里N)用作:

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

在此处输入图像描述

于 2017-12-06T08:55:48.973 回答