找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: wintoflash

[原创] 开源的硬件信息工具nwinfo [20260406]

   火... [复制链接]
 楼主| 发表于 2025-12-16 15:59:07 | 显示全部楼层
0cat0 发表于 2025-12-16 16:09
1楼下载的最新版,运行程序后,再运行CPU-Z最新版,提示:

删掉cpuid*.sys
下载1楼的HwIo驱动,解压到nwinfo同一目录

点评

OK,没有问题了  详情 回复 发表于 2025-12-16 16:07
回复

使用道具 举报

发表于 2025-12-16 16:07:45 | 显示全部楼层
wintoflash 发表于 2025-12-16 15:59
删掉cpuid*.sys
下载1楼的HwIo驱动,解压到nwinfo同一目录

OK,没有问题了
回复

使用道具 举报

发表于 2025-12-16 20:20:57 | 显示全部楼层
回复

使用道具 举报

发表于 2025-12-16 20:55:36 | 显示全部楼层
开源的硬件信息工具nwinfo [20251204]。感谢分享!
回复

使用道具 举报

发表于 2025-12-17 02:56:48 | 显示全部楼层
wintoflash 发表于 2025-12-16 09:40
是的。和nwinfo分别放两个仓库不方便开发,所以直接全放nwinfo里面了。

另外读取部分磁盘SMART的时候还是需要WMI。如果前面没初始化,还是得卡半天。。。
---------------------------
应该就是这地方的磁盘号没获取正确,导致别的信息都要从后面重新获取的吧。
整个逻辑不知道是啥样的,定位改这个问题我就折腾了一天一夜。。。。 主要还是我太菜了

点评

还是不要在这上面纠结吧。万一哪天作者又更新了,这些全都得重新改。 我都在研究怎么把那个C#的项目改成Native AOT编译了。  详情 回复 发表于 2025-12-17 09:29
回复

使用道具 举报

 楼主| 发表于 2025-12-17 09:29:55 | 显示全部楼层
红毛樱木 发表于 2025-12-17 03:56
另外读取部分磁盘SMART的时候还是需要WMI。如果前面没初始化,还是得卡半天。。。
-------------------- ...

还是不要在这上面纠结吧。万一哪天作者又更新了,这些全都得重新改。
我都在研究怎么把那个C#的项目改成Native AOT编译了。

点评

试试,看看还有哪里遗漏的地方。 stdafx.h 里的系统版本限制应该也可以解除了  详情 回复 发表于 2025-12-17 18:35
别啊别啊。 把这个改了提交给作者,吹牛必须比他快。 我在改在改  详情 回复 发表于 2025-12-17 12:15
回复

使用道具 举报

发表于 2025-12-17 12:15:00 | 显示全部楼层
wintoflash 发表于 2025-12-17 09:29
还是不要在这上面纠结吧。万一哪天作者又更新了,这些全都得重新改。
我都在研究怎么把那个C#的项目改成 ...

别啊别啊。    把这个改了提交给作者,吹牛必须比他快。  我在改在改
回复

使用道具 举报

发表于 2025-12-17 18:35:47 | 显示全部楼层
本帖最后由 红毛樱木 于 2025-12-18 21:57 编辑
wintoflash 发表于 2025-12-17 09:29
还是不要在这上面纠结吧。万一哪天作者又更新了,这些全都得重新改。
我都在研究怎么把那个C#的项目改成 ...

AtaSmart.zip (59.49 KB, 下载次数: 6)


试试,看看还有哪里遗漏的地方。
stdafx.h 里的系统版本限制应该也可以解除了
--------------
优化了一下
AtaSmart_20251218.zip (60.22 KB, 下载次数: 0)


点评

老哥牛逼,我有空试下。最近流感了没怎么搞。  详情 回复 发表于 2025-12-17 21:00
回复

使用道具 举报

 楼主| 发表于 2025-12-17 21:00:38 | 显示全部楼层
红毛樱木 发表于 2025-12-17 19:35
试试,看看还有哪里遗漏的地方。
stdafx.h 里的系统版本限制应该也可以解除了

老哥牛逼,我有空试下。最近流感了没怎么搞。

点评

我感觉可以改造的更彻底,第一次枚举设备列表初始化的时候,把后面的所有数据一次性填完,然后把后面的代码可以全抛弃了  详情 回复 发表于 2025-12-18 13:37
回复

使用道具 举报

发表于 2025-12-18 13:37:23 来自手机 | 显示全部楼层
wintoflash 发表于 2025-12-17 21:00
老哥牛逼,我有空试下。最近流感了没怎么搞。

我感觉可以改造的更彻底,第一次枚举设备列表初始化的时候,把后面的所有数据一次性填完,然后把后面的代码可以全抛弃了
回复

使用道具 举报

发表于 2025-12-26 16:39:48 | 显示全部楼层
老铁  看你github里 1.5.2是有问题下架了还是准备大改 咋没发布新的测试版了

点评

为了防止AI胡乱引用,不再每次推送代码的同时发布release了。 最新构建(包括exe和动态库)可以在actions里面下载,比如 https://github.com/a1ive/nwinfo/actions/runs/20516653177。这样方便下载历史版本进行比较  详情 回复 发表于 2025-12-26 20:44
回复

使用道具 举报

发表于 2025-12-26 20:10:07 | 显示全部楼层
继续完善
AtaSmart_20251226.zip (59.94 KB, 下载次数: 3)

点评

话说你那边测试可以正常识别用Intel RST组了RAID的硬盘吗?我有两个盘组了RAID,libcdi好像只能识别那个RAID设备,识别不到它下面的两个盘。CrystalDiskInfo可以。  详情 回复 发表于 2025-12-26 21:49
可以啊。快了3.5秒。 [attachimg]569744[/attachimg] CAtaSmart::GetSmartInfoWmi 这里面也用到了WMI,不嫌麻烦的话也可以看看。  详情 回复 发表于 2025-12-26 20:37
回复

使用道具 举报

 楼主| 发表于 2025-12-26 20:37:21 | 显示全部楼层

可以啊。快了3.5秒。
cdi.png
CAtaSmart::GetSmartInfoWmi 这里面也用到了WMI,不嫌麻烦的话也可以看看。

点评

CAtaSmart::GetSmartInfoWmi ---------- 我测试好像代码跑不到这里。  详情 回复 发表于 2025-12-26 21:01
回复

使用道具 举报

 楼主| 发表于 2025-12-26 20:44:07 | 显示全部楼层
2012jiashanni 发表于 2025-12-26 17:39
老铁  看你github里 1.5.2是有问题下架了还是准备大改 咋没发布新的测试版了

为了防止AI胡乱引用,同时为了将来上架微软商店,不再每次推送代码的同时发布release了。
最新构建(包括exe和动态库)可以在actions里面下载,比如 https://github.com/a1ive/nwinfo/actions/runs/20516653177。这样方便下载历史版本进行比较。
也可以用下面的链接直接下载最新构建:
DLL动态库:https://nightly.link/a1ive/nwinf ... /master/Library.zip
nwinfo.exe:https://nightly.link/a1ive/nwinf ... d/master/nwinfo.zip
回复

使用道具 举报

发表于 2025-12-26 21:01:36 | 显示全部楼层
wintoflash 发表于 2025-12-26 20:37
可以啊。快了3.5秒。

CAtaSmart::GetSmartInfoWmi 这里面也用到了WMI,不嫌麻烦的话也可以看看。

CAtaSmart::GetSmartInfoWmi
----------
我测试好像代码跑不到这里。

点评

CAtaSmart::GetSmartAttributeSi 打不开句柄时会走GetSmartAttributeWmi,然后走到GetSmartInfoWmi,概率很低。 Silicon Image的设备会用到。 查了一下,Silicon Image是生产SATA RAID卡的厂商,2015年倒闭了。那  详情 回复 发表于 2025-12-26 21:45
回复

使用道具 举报

 楼主| 发表于 2025-12-26 21:45:48 | 显示全部楼层
红毛樱木 发表于 2025-12-26 22:01
CAtaSmart::GetSmartInfoWmi
----------
我测试好像代码跑不到这里。

CAtaSmart::GetSmartAttributeSi 打不开句柄时会走GetSmartAttributeWmi,然后走到GetSmartInfoWmi,概率很低。
Silicon Image的设备会用到。
查了一下,Silicon Image是生产SATA RAID卡的厂商,2015年倒闭了。那没事了,可以全删掉。
回复

使用道具 举报

 楼主| 发表于 2025-12-26 21:49:49 | 显示全部楼层

话说你那边测试可以正常识别用Intel RST组了RAID的硬盘吗?我有两个盘组了RAID,libcdi好像只能识别那个RAID设备,识别不到它下面的两个盘。CrystalDiskInfo可以。

点评

我借到一个设备远程试了下。 用你的原始的 libcdi 也识别不了RAID 0下的盘, CrystalDiskInfo 是可以的。  详情 回复 发表于 2025-12-27 14:28
我的两个NVME盘是挂在VMD模式(等同于RST吧)下的,仅仅是挂在下面,没真组RAID,我这里目前可以识别正常。今晚我改后发上来的新的cpp也不能识别你的RST下的盘吗?  详情 回复 发表于 2025-12-26 22:32
回复

使用道具 举报

发表于 2025-12-26 22:12:44 | 显示全部楼层
不错的工具,很专业和实用!
回复

使用道具 举报

发表于 2025-12-26 22:32:26 | 显示全部楼层
wintoflash 发表于 2025-12-26 21:49
话说你那边测试可以正常识别用Intel RST组了RAID的硬盘吗?我有两个盘组了RAID,libcdi好像只能识别那个R ...

我的两个NVME盘是挂在VMD模式(等同于RST吧)下的,仅仅是挂在下面,没真组RAID,我这里目前可以识别正常。今晚我改后发上来的新的cpp也不能识别你的RST下的盘吗?

点评

也不能。没组raid之前是可以的。组raid之后只能识别到一个盘,smart无效。  详情 回复 发表于 2025-12-26 22:34
回复

使用道具 举报

 楼主| 发表于 2025-12-26 22:34:10 | 显示全部楼层
红毛樱木 发表于 2025-12-26 23:32
我的两个NVME盘是挂在VMD模式(等同于RST吧)下的,仅仅是挂在下面,没真组RAID,我这里目前可以识别正常。 ...

也不能。没组raid之前是可以的。组raid之后只能识别到一个raid盘,smart无效。

点评

我忘记真实的RAID模式下,磁盘是不是被这里过滤掉了。你看下  详情 回复 发表于 2025-12-27 00:04
哦哦哦,那需要再看看代码再研究下,应该是靠后的代码问题,有空再继续。  详情 回复 发表于 2025-12-26 23:22
回复

使用道具 举报

发表于 2025-12-26 23:22:37 | 显示全部楼层
wintoflash 发表于 2025-12-26 22:34
也不能。没组raid之前是可以的。组raid之后只能识别到一个raid盘,smart无效。

哦哦哦,那需要再看看代码再研究下,应该是靠后的代码问题,有空再继续。
回复

使用道具 举报

发表于 2025-12-27 00:04:55 | 显示全部楼层
wintoflash 发表于 2025-12-26 22:34
也不能。没组raid之前是可以的。组raid之后只能识别到一个raid盘,smart无效。
  1. if ((DoCM_Get_DevNode_Registry_PropertyW(&dnDevInst, (DEVINSTID_W)DeviceInstanceId, CM_DRP_CLASSGUID, szClassGUID) == CR_SUCCESS) && (!_wcsicmp(szClassGUID, L"{4d36e967-e325-11ce-bfc1-08002be10318}") || !_wcsicmp(szClassGUID, L"{4d36e96a-e325-11ce-bfc1-08002be10318}") || !_wcsicmp(szClassGUID, L"{4d36e97b-e325-11ce-bfc1-08002be10318}") || !_wcsicmp(szClassGUID, L"{36fc9e60-c465-11cf-8056-444553540000}") || !_wcsicmp(szClassGUID, L"{6bdd1fc1-810f-11d0-bec7-08002be2092f}") || !_wcsicmp(szClassGUID, L"{a0a588a4-c46f-4b37-b7ea-c82fe89870c6}")))
复制代码


我忘记真实的RAID模式下,磁盘是不是被这里过滤掉了。你看下

回复

使用道具 举报

发表于 2025-12-27 14:28:13 | 显示全部楼层
本帖最后由 红毛樱木 于 2025-12-27 15:29 编辑
wintoflash 发表于 2025-12-26 21:49
话说你那边测试可以正常识别用Intel RST组了RAID的硬盘吗?我有两个盘组了RAID,libcdi好像只能识别那个R ...

我借到一个设备远程试了下。 用你的原始的 libcdi(好像一直有这个问题,一直不行) 也识别不了RAID 0下的盘,  CrystalDiskInfo 是可以的。--------
暂时定位到和
DWORD CsmiType = 0;
有关,因为会导致  BOOL CAtaSmart::AddDiskCsmi(INT scsiPort)  直接
if(CsmiType == CSMI_TYPE_DISABLE)
{
        return FALSE;
}

--------
另外测试
CrystalDiskInfo 可以是因为默认勾选了  Intel/AMD RAID (CSMI) ,如果去掉这个勾选项则一样不能识别。

点评

OK。 在cdi_init_smart中,ptr->Init的前面加上 就可以检测到了。  详情 回复 发表于 2025-12-27 19:11
回复

使用道具 举报

发表于 2025-12-27 14:55:30 | 显示全部楼层
请问最新测试版是不支持cpuidx64.sys了吗 我命令行运行后显示     Driver: 'NOT FOUND' 而使用HwIox64.sys后则正常

点评

[attachimg]569784[/attachimg] 没有问题啊  详情 回复 发表于 2025-12-27 18:40
回复

使用道具 举报

 楼主| 发表于 2025-12-27 18:40:16 | 显示全部楼层
2012jiashanni 发表于 2025-12-27 15:55
请问最新测试版是不支持cpuidx64.sys了吗 我命令行运行后显示     Driver: 'NOT FOUND' 而使用HwIox64.sys ...

Snipaste_2025-12-27_18-39-30.png
没有问题啊
回复

使用道具 举报

 楼主| 发表于 2025-12-27 19:11:18 | 显示全部楼层
红毛樱木 发表于 2025-12-27 15:28
我借到一个设备远程试了下。 用你的原始的 libcdi(好像一直有这个问题,一直不行) 也识别不了RAID 0下 ...

OK。
在cdi_init_smart中,ptr->Init的前面加上
  1. ptr->CsmiType = CAtaSmart::CSMI_TYPE_ENABLE_AUTO;
复制代码

就可以检测到了。

点评

另外还有一个发现。 我测试日志模式下, DebugPrint 在有中文的时候写入log文件乱码了,CrystalDiskInfo 没有乱码。都是ANSI的.log文本  详情 回复 发表于 2025-12-27 19:28
回复

使用道具 举报

发表于 2025-12-27 19:28:08 | 显示全部楼层
本帖最后由 红毛樱木 于 2025-12-27 19:30 编辑
wintoflash 发表于 2025-12-27 19:11
OK。
在cdi_init_smart中,ptr->Init的前面加上

另外还有一个发现。
我测试日志模式下,  DebugPrint 在有中文的时候写入log文件乱码了,CrystalDiskInfo 没有乱码。都是ANSI的.log文本-----------
看你解决了,那应该在 CDI_FLAG_ENABLE_xx 那里加多几个开关了。

点评

DebugPrint函数中,_tfopen_s(&fp, file, _T("ac"));改为_tfopen_s(&fp, file, _T("a, ccs=UTF-8"));就行了。 CrystalDiskInfo 不乱码,是因为执行了_tsetlocale(LC_ALL, _T(""));。但是我觉得这种操作会带来副作用  详情 回复 发表于 2025-12-28 10:48
回复

使用道具 举报

 楼主| 发表于 2025-12-28 10:48:26 | 显示全部楼层
红毛樱木 发表于 2025-12-27 20:28
另外还有一个发现。
我测试日志模式下,  DebugPrint 在有中文的时候写入log文件乱码了,CrystalDiskInf ...

DebugPrint函数中,_tfopen_s(&fp, file, _T("ac"));改为_tfopen_s(&fp, file, _T("a, ccs=UTF-8"));就行了。
CrystalDiskInfo 不乱码,是因为执行了_tsetlocale(LC_ALL, _T(""));。但是我觉得这种操作会带来副作用。

点评

setlocale( LC_ALL, "" ); 将区域设置设定为默认值,该值是从操作系统获得的用户默认的 ANSI 代码页。 区域设置名称设置为由 GetUserDefaultLocaleName 返回的值。 代码页设置为由 GetACP 返回的值。 ----------  详情 回复 发表于 2025-12-28 14:46
回复

使用道具 举报

发表于 2025-12-28 14:46:48 | 显示全部楼层
wintoflash 发表于 2025-12-28 10:48
DebugPrint函数中,_tfopen_s(&fp, file, _T("ac"));改为_tfopen_s(&fp, file, _T("a, ccs=UTF-8"));就行 ...

setlocale( LC_ALL, "" );

将区域设置设定为默认值,该值是从操作系统获得的用户默认的 ANSI 代码页。 区域设置名称设置为由 GetUserDefaultLocaleName 返回的值。 代码页设置为由 GetACP 返回的值。
-------------
https://learn.microsoft.com/zh-c ... ocale?view=msvc-170

我也用这个,看资料完全没问题呀。优点明显

点评

在DLL里面用这个不合适。如果是/MD编译,setlocale会改变主程序的区域设置。  详情 回复 发表于 2025-12-28 19:59
回复

使用道具 举报

 楼主| 发表于 2025-12-28 19:59:07 | 显示全部楼层
本帖最后由 wintoflash 于 2025-12-28 21:04 编辑
红毛樱木 发表于 2025-12-28 15:46
setlocale( LC_ALL, "" );

将区域设置设定为默认值,该值是从操作系统获得的用户默认的 ANSI 代码页。 ...

在DLL里面用这个不合适。如果是/MD编译,setlocale会改变主程序的区域设置。非东亚地区很多情况下用的是UTF-8代码页,不是ANSI。对于GUI程序影响还不是很大,对CLI程序影响很大。

点评

这样呀,那确实应该保持原样。 不过既然程序已经用 UNICODE 了,所以这里libcdi的 DebugPrint 直接用UNICODE更合适,也不要用UTF-8了  详情 回复 发表于 2025-12-28 20:15
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-4-17 12:02

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表