我想使用DiskPart从一个C#应用程序重新划分一个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 0“。末尾的索引似乎是我需要的索引,以便将Win32_DiskDrive的条目与来自DiskPart的相关条目相匹配。这是正确的吗?关键的问题是:在官方文档中是否有明确声明的地方?然后,我将格式化设备,使我不能做任何错误在这里。谢谢。
发布于 2017-12-06 08:55:48
您需要使用uint32索引;
给定驱动器的物理驱动器号。此属性由从STORAGE控件代码返回的IOCTL结构填充。值0 0xffffffff表示给定驱动器不映射到物理驱动器。
关于DiskPart磁盘编号--我在文档中没有清楚地说明磁盘号是什么意思。不过,我在调试器下看,磁盘内部函数的磁盘部分格式行是怎样的?
long ListDiskLine(IVdsDisk *)要求这么做。

它使用IVdsDisk接口获取磁盘属性。IVdsDisk::GetProperties方法调用get VDS_DISK_PROP结构,然后使用pwszName成员:
pwszName:操作系统用于标识磁盘的以空结尾的Unicode名称。如果存在,客户端可以使用此属性来确定磁盘的PNP设备号。这是从
DeviceNumber成员STORAGE_DEVICE_NUMBER获得的数字(参见)。对于硬盘,这个名称具有\\?\PhysicalDriveN格式,其中\\?\PhysicalDriveN表示磁盘的设备号。对于DVD/CD驱动器,此名称具有\\?\CdRomN格式,其中\\?\CdRomN表示DVD/CD驱动器的设备号。客户端可以使用此属性标识磁盘。
用于硬盘的下一段代码用于获取N

或将其翻译为c/c++
esi = _wtol(pvdp->pwszName + RTL_NUMBER_OF("\\\\?\\PhysicalDrive") - 1);0x22是0x11*sizeof(WCHAR),在\\?\PhysicalDrive前缀中正好是0x11 (17)符号。
因此磁盘部分检索器从DeviceNumber STORAGE_DEVICE_NUMBER的N中获得的数字(等于Win32_DiskDrive.Index)。
最后,esi (存储的N)用作:
StringCchPrintf(sz, 0x400, L"%s Disk %-3lu %-13.13s %7s %7s %s %s\r\n", *, esi, ..);
ConsolePrintf(sz);

https://stackoverflow.com/questions/47669877
复制相似问题