从 API 查询 NVIDIA 驱动信息
在开发 nvwupd 的途中获得的新知识
老黄提供了一套公开的 API 用于驱动下载页面,可以直接调用这些 API 来获取驱动信息。
nvwupd
nvwupd 是在 Windows 平台下使用的,因为不装 GeForce Experience 的情况下不能快速更新驱动,不能查找驱动更新,只能自己去 nv drv 网站去找最新的驱动版本然后和自己的对比。。。
明明 CS2 都能在驱动过期时候提醒,懒狗v社都做了,似乎也是通过 api 获取的,不然就要让员工手动维护一份GPU核心和最新驱动的对照表了。
有的显卡驱动停更了,比如10系往前,还能玩 CS2 但是不能用最新的驱动,这时候不能爆出来更新驱动提示
nvwupd 是用 C# & .NET -> WinUI 3写的,大量vibe coding,不过模型性能高,再加上小规模,也没有多大问题
现阶段(26.01.31)是还在高速开发,现有问题是驱动下载好exe开不起来,也许是之前下一半搞错了。现在的响应流直接被存入到文件中,不经过校验完整性、哈希之后再存入文件(或者一个.downloading再重命名),导致了有时候就下了半个文件,PE头还正确有的,然后就能启动但是直接crash。
然后还在计划加入一个断点续传、终止下载的按钮,还有在后台作为服务定期检查更新,使用 Windows 通知发更新通知。
从 API 获取核心信息
翻了一堆nv的blog,翻到这些,够用了。
https://www.nvidia.com/Download/API/
| 请求 | 作用 |
|---|---|
lookupValueSearch.aspx?TypeID=2 |
获取产品系列列表(psid) |
lookupValueSearch.aspx?TypeID=3 |
获取具体产品列表(pfid) |
lookupValueSearch.aspx?TypeID=4 |
获取操作系统列表(osid) |
processFind.aspx |
根据参数查询驱动列表 |
接下来的内容放到 nvwupd docs 里了,开仓库能看
获取操作系统的 osid
[Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12
(Invoke-RestMethod -Uri "https://www.nvidia.com/Download/API/lookupValueSearch.aspx?TypeID=4" -Headers @{"User-Agent"="Mozilla/5.0"}).LookupValueSearch.LookupValues.LookupValue | ? { $_.Name -match '^Windows' }返回结果:
Code Name Value
---- ---- -----
10.0 Windows 10 32-bit 56
10.0 Windows 10 64-bit 57
10.0 Windows 11 135
6.1 Windows 7 32-bit 18
6.1 Windows 7 64-bit 19
6.3 Windows 8.1 32-bit 40
6.3 Windows 8.1 64-bit 41
6.2 Windows 8 32-bit 27
6.2 Windows 8 64-bit 28
6.0 Windows Vista 32-bit 9
6.0 Windows Vista 64-bit 10
5.1 Windows XP 6
5.2 Windows XP 64-bit 7
nt-6.1 Windows Server 2008 16
6.1-64 Windows Server 2008 x64 17
6.1-64-R2 Windows Server 2008 R2 64 21
6.2-1 Windows Server 2012 32
6.2-R2 Windows Server 2012 R2 64 44
10.0-NT Windows Server 2016 74
10.0-NT Windows Server 2019 119
10.0-NT Windows Server 2022 134
10.0-NT Windows Server 2025 153
5.2 Windows Server 2003 15
5.2 Windows Server 2003 x64 8
5.0 Windows 2000 5
4.9 Windows ME 4
4.1 Windows 98 3
4.0 Windows NT4 2
4.0 Windows 95 1真是 Windows 全系都有。Windows 11 为 135
获取 psid
比如,40系
[Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12
(Invoke-RestMethod -Uri "https://www.nvidia.com/Download/API/lookupValueSearch.aspx?TypeID=2" -Headers @{"User-Agent"="Mozilla/5.0"}).LookupValueSearch.LookupValues.LookupValue | ? { $_.Name -match 'GeForce' -and $_.Name -match 'RTX\s*40' }返回结果:
RequiresProduct : True
ParentID : 1
IsSelectLess : False
Name : GeForce RTX 40 Series (Notebooks)
Value : 129
RequiresProduct : True
ParentID : 1
IsSelectLess : False
Name : GeForce RTX 40 Series
Value : 127因此40系移动端的 psid 为 129,桌面端为 127
获取 pfid
示例是 GeForce RTX 4060 Laptop GPU
注意:笔记本 GPU 的名称字符串通常没有 NVIDIA 前缀,但台式机版本有
[Net.ServicePointManager]::SecurityProtocol=[Net.SecurityProtocolType]::Tls12
(Invoke-RestMethod -Uri "https://www.nvidia.com/Download/API/lookupValueSearch.aspx?TypeID=3" -Headers @{"User-Agent"="Mozilla/5.0"}).LookupValueSearch.LookupValues.LookupValue | ? { $_.Name -eq "GeForce RTX 4060 Laptop GPU" }返回结果:
ParentID Name Value
-------- ---- -----
129 GeForce RTX 4060 Laptop GPU 1007构造请求
现在这种情况就是在 Windows 11 + 4060 Laptop 获取更新,我们知道了:
- psid = 129
- pfid = 1007
- osid = 135
然后就使用processFind了,构造完成就是 https://www.nvidia.com/Download/processFind.aspx?dtcid=1&lang=zh-hans&lid=1&osid=135&pfid=1007&psid=129,访问即可查询到可用的驱动列表。