pda8888 发表于 2024-3-28 14:32:14

nwinfo 0.9.5.1 bug 汇报

本帖最后由 pda8888 于 2024-3-28 15:38 编辑

请看视频:
请看视频
当使用pnputil /restart-device "硬盘设备之后",nwinfo --disk 出现错误

环境:virtualbox 7.0.14
4个虚拟硬盘,物理编号是0,1,2,3,即 \\.\Physicaldrive0 …… \\.\Physicaldrive3
1个虚拟U盘,物理编号是\\.\Physicaldrive4

先用nwinfo_x64.exe --disk --no-smart --format=json|jq -r -c ".Disks[]|\\"\(.Path)=\(.HWID)\\""
得到:\\.\PhysicalDrive0=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&000000
\\.\PhysicalDrive1=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&010000
\\.\PhysicalDrive2=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&020000
\\.\PhysicalDrive3=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&030000
\\.\PhysicalDrive4=USBSTOR\Disk&Ven_VBOX&Prod_HARDDISK&Rev_1.0\6&36787cab&0


此时输入命令:
pnputil /restart-device "SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&030000"
相当于把3号磁盘禁用再启用。
再用先前相同的命令:nwinfo_x64.exe --disk --no-smart --format=json|jq -r -c ".Disks[]|\\"\(.Path)=\(.HWID)\\""
结果却是:
\\.\PhysicalDrive0=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&000000
\\.\PhysicalDrive1=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&010000
\\.\PhysicalDrive2=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&020000
\\.\PhysicalDrive3=USBSTOR\Disk&Ven_VBOX&Prod_HARDDISK&Rev_1.0\6&36787cab&0
\\.\PhysicalDrive4=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&030000
可以看到,3号和4号物理盘的hwid被互换了,这是不正确的结果。







yyz2191958 发表于 2024-3-28 14:40:46

谢谢分享

zlq_hysy 发表于 2024-3-28 14:47:15

留个脚印,,,,

yc2428 发表于 2024-3-28 14:59:55

谢谢分享

fdongh 发表于 2024-3-28 15:04:53


留个脚印,,,,

pda8888 发表于 2024-3-28 15:14:34

本帖最后由 pda8888 于 2024-3-28 15:37 编辑

补充一下:
这次重启第0个物理磁盘:
x:\>pnputil /restart-device "SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&000000"
Microsoft PnP 工具

正在重启设备:         SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&000000
已成功重启设备。

再用nwinfo与jq列出硬盘信息:
x:\>nwinfo_x64.exe --disk --no-smart --format=json|jq -r -c ".Disks[]|\\"\(.Path)=\(.HWID)\\""

\\.\PhysicalDrive0=USBSTOR\Disk&Ven_VBOX&Prod_HARDDISK&Rev_1.0\6&36787cab&0
\\.\PhysicalDrive1=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&010000
\\.\PhysicalDrive2=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&020000
\\.\PhysicalDrive3=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&030000
\\.\PhysicalDrive4=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&000000
这次轮到第0号硬盘与第4号硬盘的hwid互换了。

红毛樱木 发表于 2024-3-28 15:32:49

在系统自带的   磁盘管理里看下磁盘号到底有没有变呢

pda8888 发表于 2024-3-28 15:35:01

再补充一个在真机环境的情况:
U:\>nwinfo_x64.exe --disk --no-smart --format=json|jq -r -c ".Disks[]|\"\(.Path)=\(.HWID)\""
\\.\PhysicalDrive0=SCSI\Disk&Ven_NVMe&Prod_XPG_GAMMIX_S70_S\5&204bb58c&0&000000
\\.\PhysicalDrive1=SCSI\Disk&Ven_NVMe&Prod_HP_SSD_EX900_500\5&27a2bec5&0&000000
\\.\PhysicalDrive2=SCSI\Disk&Ven_WDS100T1&Prod_X0E-00AFY0\6&1d7f4af2&0&000000

U:\nwinfo>pnputil /restart-device "SCSI\Disk&Ven_NVMe&Prod_HP_SSD_EX900_500\5&27a2bec5&0&000000"
Microsoft PnP 工具

正在重启设备:         SCSI\Disk&Ven_NVMe&Prod_HP_SSD_EX900_500\5&27a2bec5&0&000000
已成功重启设备。


U:\>nwinfo_x64.exe --disk --no-smart --format=json|jq -r -c ".Disks[]|\"\(.Path)=\(.HWID)\""
\\.\PhysicalDrive0=SCSI\Disk&Ven_NVMe&Prod_XPG_GAMMIX_S70_S\5&204bb58c&0&000000
\\.\PhysicalDrive1=SCSI\Disk&Ven_WDS100T1&Prod_X0E-00AFY0\6&1d7f4af2&0&000000
\\.\PhysicalDrive2=SCSI\Disk&Ven_NVMe&Prod_HP_SSD_EX900_500\5&27a2bec5&0&000000
仍然是重启哪个硬盘,它的hwid就会与USB设备的hwid互换。

pda8888 发表于 2024-3-28 15:36:19

红毛樱木 发表于 2024-3-28 15:32
在系统自带的   磁盘管理里看下磁盘号到底有没有变呢

没有变化。
在设备管理器、磁盘管理器里面,都是正确的,没有发生错误变化。

pda8888 发表于 2024-3-28 15:55:03

我拔掉U盘,对第2个硬盘进行restart-device,没有再现错误。
好像没有USB储存,就不会出错这种错误。

红毛樱木 发表于 2024-3-28 16:00:48

pda8888 发表于 2024-3-28 15:36
没有变化。
在设备管理器、磁盘管理器里面,都是正确的,没有发生错误变化。

那应该是BUG了

yuguotqing 发表于 2024-3-28 20:25:00

感谢分享

wang1126 发表于 2024-3-29 08:10:05

谢谢分享

wintoflash 发表于 2024-3-29 11:56:40

nwinfo是通过注册表读hwid的,看来这样不行。

pda8888 发表于 2024-3-29 16:20:55

wintoflash 发表于 2024-3-29 11:56
nwinfo是通过注册表读hwid的,看来这样不行。

明白了,没有重启注册表不生效,是吗?

softwarezheng 发表于 2024-3-30 10:59:43

代码好长啊,看不懂

pda8888 发表于 2024-4-1 16:38:50

本帖最后由 pda8888 于 2024-4-1 17:13 编辑

果然。
在系统启动之初,查询注册表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\Enum,导出是这样的:
Windows Registry Editor Version 5.00


"0"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&000000"
"Count"=dword:00000005
"NextInstance"=dword:00000005
"1"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&010000"
"2"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&020000"
"3"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&030000"
"4"="USBSTOR\\Disk&Ven_VBOX&Prod_HARDDISK&Rev_1.0\\6&36787cab&0"


在使用了一次 pnputil /restart-device "SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&030000" 之后,再查询相同键值,导出,得:
Windows Registry Editor Version 5.00


"0"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&000000"
"Count"=dword:00000005
"NextInstance"=dword:00000005
"1"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&010000"
"2"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&020000"
"3"="USBSTOR\\Disk&Ven_VBOX&Prod_HARDDISK&Rev_1.0\\6&36787cab&0"
"4"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&030000"

此时再使用 pnputil /restart-device "SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&020000" ,即重启“2号”盘,再查询注册表导出,又得到:
Windows Registry Editor Version 5.00


"0"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&000000"
"Count"=dword:00000005
"NextInstance"=dword:00000005
"1"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&010000"
"2"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&030000"
"3"="USBSTOR\\Disk&Ven_VBOX&Prod_HARDDISK&Rev_1.0\\6&36787cab&0"
"4"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&020000"

这规律真是奇怪得很,就是只要重启哪个非USB设备,那个非USB设备就变成第4号盘,第3号变成USB设备,而本来USB设备是排在第4号盘位置上的。

pda8888 发表于 2024-4-1 17:19:15

本帖最后由 pda8888 于 2024-4-1 17:26 编辑

https://learn.microsoft.com/zh-cn/windows-hardware/drivers/install/hklm-system-currentcontrolset-enum-registry-tree
微软官网说:
枚举树保留供操作系统组件使用,其布局可能会更改。 驱动程序和用户模式设备安装组件必须使用系统提供的功能
全文如下:

HKLM\SYSTEM\CurrentControlSet\Enum 注册表树

[*]项目
[*]2023/06/15
[*]4 个参与者
反馈

枚举树保留供操作系统组件使用,其布局可能会更改。 驱动程序和用户模式设备安装组件必须使用系统提供的功能(例如 IoGetDeviceProperty、 CM_Get_DevNode_Registry_Property和 SetupDiGetDeviceRegistryProperty )从此树中提取信息。

备注
驱动程序和 Windows 应用程序不得直接访问 枚举 树。
https://i.ibb.co/nDRrqG7/20240401172526.png



2012飘水 发表于 2024-4-2 20:17:31

学习了,感谢大神们的留言

wintoflash 发表于 2024-4-14 20:51:21

试试
https://github.com/a1ive/nwinfo/releases/tag/latest

pda8888 发表于 2024-4-14 22:19:02

有点好奇,这次不读注册表,是用什么方法呢?
我同时也测试了nirsoft的driverview,它也会有同样的问题。

pda8888 发表于 2024-4-14 22:29:17

刚刚忍不住测试了一下,这次结果正确,我注意到跟0.9.5的不一样是把USB设备列到最前面了,接着是physicaldrive0、physicaldrive1……physicaldriven。

wintoflash 发表于 2024-4-15 06:48:53

pda8888 发表于 2024-4-14 22:19
有点好奇,这次不读注册表,是用什么方法呢?
我同时也测试了nirsoft的driverview,它也会有同样的问题。

用的是Setup API。
Ventoy 可能也有类似的问题。

pda8888 发表于 2024-4-15 12:55:39

调用windowsAPI就对了,微软自己的文档也说了注册表不可靠。微软是自己打脸啊。

yueying223 发表于 2024-4-16 15:26:33

{:1_197:},辛苦了{:1_192:}

lusir401 发表于 5 天前

楼主的缜密分析,和作者积极联手,又给坛友带来了福利。
页: [1]
查看完整版本: nwinfo 0.9.5.1 bug 汇报