无忧启动论坛

标题: nwinfo 0.9.5.1 bug 汇报 [打印本页]

作者: pda8888    时间: 2024-3-28 14:32
标题: 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

先用
  1. nwinfo_x64.exe --disk --no-smart --format=json|jq -r -c ".Disks[]|\"\(.Path)=\(.HWID)\""
复制代码

得到:
  1. \\.\PhysicalDrive0=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&000000
  2. \\.\PhysicalDrive1=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&010000
  3. \\.\PhysicalDrive2=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&020000
  4. \\.\PhysicalDrive3=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&030000
  5. \\.\PhysicalDrive4=USBSTOR\Disk&Ven_VBOX&Prod_HARDDISK&Rev_1.0\6&36787cab&0
复制代码



此时输入命令:
  1. pnputil /restart-device "SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&030000"
复制代码

相当于把3号磁盘禁用再启用。
再用先前相同的命令:
  1. nwinfo_x64.exe --disk --no-smart --format=json|jq -r -c ".Disks[]|\"\(.Path)=\(.HWID)\""
复制代码

结果却是:
  1. \\.\PhysicalDrive0=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&000000
  2. \\.\PhysicalDrive1=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&010000
  3. \\.\PhysicalDrive2=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&020000
  4. \\.\PhysicalDrive3=USBSTOR\Disk&Ven_VBOX&Prod_HARDDISK&Rev_1.0\6&36787cab&0
  5. \\.\PhysicalDrive4=SCSI\Disk&Ven_VBOX&Prod_HARDDISK\4&1c07620b&0&030000
复制代码

可以看到,3号和4号物理盘的hwid被互换了,这是不正确的结果。








作者: yyz2191958    时间: 2024-3-28 14:40
谢谢分享
作者: zlq_hysy    时间: 2024-3-28 14:47
留个脚印,,,,
作者: yc2428    时间: 2024-3-28 14:59
谢谢分享
作者: fdongh    时间: 2024-3-28 15:04

留个脚印,,,,
作者: pda8888    时间: 2024-3-28 15:14
本帖最后由 pda8888 于 2024-3-28 15:37 编辑

补充一下:
这次重启第0个物理磁盘:
  1. 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列出硬盘信息:
  1. 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
在系统自带的   磁盘管理  里看下磁盘号到底有没有变呢
作者: pda8888    时间: 2024-3-28 15:35
再补充一个在真机环境的情况:
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
红毛樱木 发表于 2024-3-28 15:32
在系统自带的   磁盘管理  里看下磁盘号到底有没有变呢

没有变化。
在设备管理器、磁盘管理器里面,都是正确的,没有发生错误变化。
作者: pda8888    时间: 2024-3-28 15:55
我拔掉U盘,对第2个硬盘进行restart-device,没有再现错误。
好像没有USB储存,就不会出错这种错误。
作者: 红毛樱木    时间: 2024-3-28 16:00
pda8888 发表于 2024-3-28 15:36
没有变化。
在设备管理器、磁盘管理器里面,都是正确的,没有发生错误变化。

那应该是BUG了
作者: yuguotqing    时间: 2024-3-28 20:25
感谢分享
作者: wang1126    时间: 2024-3-29 08:10
谢谢分享
作者: wintoflash    时间: 2024-3-29 11:56
nwinfo是通过注册表读hwid的,看来这样不行。

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

明白了,没有重启注册表不生效,是吗?
作者: softwarezheng    时间: 2024-3-30 10:59
代码好长啊,看不懂
作者: pda8888    时间: 2024-4-1 16:38
本帖最后由 pda8888 于 2024-4-1 17:13 编辑

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

  2. [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\Enum]
  3. "0"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&000000"
  4. "Count"=dword:00000005
  5. "NextInstance"=dword:00000005
  6. "1"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&010000"
  7. "2"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&020000"
  8. "3"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&030000"
  9. "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" 之后,再查询相同键值,导出,得:
  1. Windows Registry Editor Version 5.00

  2. [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\Enum]
  3. "0"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&000000"
  4. "Count"=dword:00000005
  5. "NextInstance"=dword:00000005
  6. "1"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&010000"
  7. "2"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&020000"
  8. "3"="USBSTOR\\Disk&Ven_VBOX&Prod_HARDDISK&Rev_1.0\\6&36787cab&0"
  9. "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号”盘,再查询注册表导出,又得到:
  1. Windows Registry Editor Version 5.00

  2. [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\Enum]
  3. "0"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&000000"
  4. "Count"=dword:00000005
  5. "NextInstance"=dword:00000005
  6. "1"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&010000"
  7. "2"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&030000"
  8. "3"="USBSTOR\\Disk&Ven_VBOX&Prod_HARDDISK&Rev_1.0\\6&36787cab&0"
  9. "4"="SCSI\\Disk&Ven_VBOX&Prod_HARDDISK\\4&1c07620b&0&020000"
复制代码


这规律真是奇怪得很,就是只要重启哪个非USB设备,那个非USB设备就变成第4号盘,第3号变成USB设备,而本来USB设备是排在第4号盘位置上的。
作者: pda8888    时间: 2024-4-1 17:19
本帖最后由 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 注册表树
[size=0.875em]反馈

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

备注
驱动程序和 Windows 应用程序不得直接访问 枚举 树。





作者: 2012飘水    时间: 2024-4-2 20:17
学习了,感谢大神们的留言
作者: wintoflash    时间: 2024-4-14 20:51
试试
https://github.com/a1ive/nwinfo/releases/tag/latest
作者: pda8888    时间: 2024-4-14 22:19
有点好奇,这次不读注册表,是用什么方法呢?
我同时也测试了nirsoft的driverview,它也会有同样的问题。
作者: pda8888    时间: 2024-4-14 22:29
刚刚忍不住测试了一下,这次结果正确,我注意到跟0.9.5的不一样是把USB设备列到最前面了,接着是physicaldrive0、physicaldrive1……physicaldriven
作者: wintoflash    时间: 2024-4-15 06:48
pda8888 发表于 2024-4-14 22:19
有点好奇,这次不读注册表,是用什么方法呢?
我同时也测试了nirsoft的driverview,它也会有同样的问题。

用的是Setup API。
Ventoy 可能也有类似的问题。
作者: pda8888    时间: 2024-4-15 12:55
调用windowsAPI就对了,微软自己的文档也说了注册表不可靠。微软是自己打脸啊。

作者: yueying223    时间: 2024-4-16 15:26
,辛苦了
作者: lusir401    时间: 2024-4-30 08:44
楼主的缜密分析,和作者积极联手,又给坛友带来了福利。




欢迎光临 无忧启动论坛 (http://bbs.c3.wuyou.net/) Powered by Discuz! X3.3