Windows 版本与内部版本:什么会出问题,何时出问题
为什么内存读取程序依赖被读取机器的 Windows 内部版本、24H2 和 25H2 这类功能更新会改变什么、怎么查看自己的版本号,以及两台机器为什么需要不同的更新策略。
简短回答
Windows 不同内部版本之间,内核结构的布局会变化,所以游戏主机上的一次功能更新,可能让内存读取程序在重新构建之前无法工作。用 winver 查看版本号;某个版本确认可用时,副机(第二台电脑)就暂缓更新;游戏主机则要保持最新,以满足反作弊的要求。
本页内容10
为什么 Windows 内部版本对读取程序很重要?
内存读取程序并不向 Windows 索取数据。它在物理内存里找到页表、进程列表、模块列表这类内核结构,再按偏移量逐级遍历。这些结构是内核内部的东西,Microsoft 在任何一次发布中都可以随意改变它们的布局。布局一变,读取程序构建时所依据的偏移量就会指向错误的位置。于是软件在最早的一步就失败了,因为拿不到页表基址,其他什么都解析不了。所以你运行哪个 Windows 版本会带来实实在在的后果,而不是个人喜好问题。
哪台机器的 Windows 版本有影响?
要解析的内核结构位于被读取内存的那台机器上,而负责读取的软件运行在副机上。这个软件基本上只需要一个受支持的 Windows,并装好对应的运行库。所以,游戏主机上的功能更新,改变的是读取程序要解析的那些结构本身。副机上的功能更新影响相对小,但对驱动和运行库仍是实实在在的风险——这就是每台机器都需要各自决定更新策略的原因。
如何查看确切的 Windows 内部版本
版本、功能更新和内部版本是三个不同的数字。只报一句“Windows 11”的工单往往很难处理,所以三个都要报。
- 按 Windows + R,输入 winver,回车
- 查看版本类型(家庭版、专业版等)、功能更新标识(例如 24H2),以及“OS 内部版本”那一行,包括小数点后面的数字
- 如果需要可复制的文本,打开“设置”>“系统”>“系统信息”,查看“Windows 规格”
- 把内部版本号和更新修订号一起记下来,因为修订号(小数点后面的部分)对应的是某一个具体的累积更新
- 把它记在你存放固件笔记的同一个地方,每次 Windows 更新后随之更新这条记录
- 开工单时,附上两台机器完整的内部版本字符串,而不是只报你认为出问题的那一台
用命令行查看内部版本
以注册表里的值为准,因为 Windows Update 本身就是从这里读取的。DisplayVersion 是功能更新标识,CurrentBuild 是内部版本号,UBR 是更新修订号,也就是 winver 里小数点后面的数字。
winver
systeminfo | findstr /B /C:"OS Name" /C:"OS Version"
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v DisplayVersion
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentBuild
reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v UBR功能更新会改变什么?
每月的累积更新通常只是给 Windows 打补丁,不会动读取程序所依赖的结构。功能更新就不同了:它们用“年份 + 上/下半年”来标记,比如 24H2 和 25H2,每一个都带来新的内核。布局变化正是集中在这里,这也解释了一个很常见的规律:几个月都用得好好的,某天夜里自动装了个功能更新,第二天早上软件就找不到页表基址了。这不是被检测到了,板卡也没坏。软件需要一个基于新内核构建的更新版本,内存映射(MMAP)可能也需要重新生成。
两台机器分别怎么处理更新
两列代表两种不同的风险状况,所以给两台机器套用同一套更新策略是错误的。
| 问题 | 游戏主机 | 副机 |
|---|---|---|
| 要保持最新吗? | 要。反作弊和游戏本身都要求一个最新的、受支持的 Windows,游戏主机系统版本过旧,本身就会导致启动失败 | 不要自动更新。一旦某个版本确认能配合你的软件正常工作,就有充分理由让它停留在这个版本 |
| 原因 | 保持更新是你要玩的游戏本身的要求,而且在日常使用的机器上运行不受支持的版本,本身就是安全问题 | 它只跑一个工具。在这台机器上,更新唯一给你带来的,就是驱动和运行库出问题的风险 |
| 功能更新的风险 | 内核结构布局变化——这正是读取程序失效的原因,只能等软件更新 | USB 控制器驱动被回滚、FTDI 驱动变更,以及运行库版本变化 |
| 怎么暂缓更新 | 最多暂停一小段时间,不要长期拖着。如果需要等一周看兼容性消息,用系统自带的暂停功能 | 用 Windows 自带的设置暂停更新,并专门推迟功能更新 |
| 更新后出了问题 | 改机器上的任何设置之前,先看状态面板上你那款游戏的状态 | 在认定板卡本身变差之前,先重新检查 FTDI 驱动、端口协商到的速率和运行库 |
两列都不意味着永久关闭更新:一个不再接收安全更新的 Windows 版本就是隐患,哪怕只是一台跑工具的机器。
提示
如何暂缓更新,又不落下安全补丁
在副机上,合理的做法是推迟更新,而不是彻底放弃更新。用 Windows 本身提供的暂停功能和功能更新推迟选项,同时让累积安全更新照常安装。功能更新要等到你的软件提供商表示已支持新内核之后再装。这样该打的安全补丁都打上了,又避开了唯一会让读取程序失效的那类更新。彻底关掉 Windows Update,会让你停留在一个不再接收修复的版本上,这比等上一个周末划不来得多。
与 Windows 版本和更新相关的问题
如果下面某个问题是在更新后第二天早上出现的,先排查这些原因,再去看硬件。
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| Windows 功能更新后立刻出现 Unable to locate valid DTB | 被读取机器上的内核结构布局变了,软件里的偏移量不再匹配 | 查看状态面板,等待支持新内核的软件版本发布,发布后再重新生成内存映射 |
| 更新后出现 Failed to find base address,但没有 DTB 报错 | 是游戏更新而不是 Windows 更新,或者内存映射是在系统变更之前生成的 | 确认当前游戏版本受支持,然后重新生成内存映射;不要为此去改固件设置 |
| 副机更新后读取速率骤降 | Windows 替换或回滚了 USB 控制器驱动或桥接芯片驱动 | 重新检查 FTDI 驱动版本和端口协商到的速率,然后重装订单附带的驱动版本 |
| 更新后加载器无法启动,没有硬件报错 | 某个运行库被替换或删除了——Visual C++ 运行库或 WebView 运行时 | 重装下载页列出的运行库,重启后再试,在此之前不要动其他东西 |
| 一台机器上一切正常,另一台所谓一模一样的机器上却不行 | 两台机器的内部版本或更新修订号不同 | 对比两台机器完整的内部版本号加 UBR 字符串,因为它们很少像大家以为的那样完全一致 |
Windows 版本常见问题
副机应该装哪个 Windows 版本?
装一个仍在接收安全更新、且在你的软件当前要求中列为受支持的 64 位 Windows 版本。安装之前先查软件自己的文档,而不是装上最新版然后祈祷能用。
24H2、25H2 这类更新一定会搞坏我的配置吗?
不一定,但内核布局变化集中在功能更新里,所以这类更新最有可能搞坏配置。在被读取的机器上安装之前,先看提供商公布的状态。
要不要彻底关闭 Windows Update?
不要。推迟功能更新,但让安全更新照常安装,因为一个不再接收修复的版本是实实在在的风险。这套配置里没有任何东西值得你去跑一台不打补丁的机器。
更新把东西搞坏了,能回滚吗?
功能更新之后,Windows 会提供一个有期限的回滚窗口,有时确实管用,但只能把它当作短期的补救手段,而不是计划。做决定之前先看提供商的状态说明。
副机需要和游戏主机装同一个 Windows 版本吗?
不需要,两者互不相干。读取程序必须理解的是游戏主机的内部版本,而副机的版本只需要能运行软件及其运行库。
资料来源
除上面链接的来源外,这些内容来自实机测试:团队实际遇到过功能更新让读取程序失效,并记下了哪些版本能用。Microsoft 不公开读取程序所依赖的内核布局。
- 01Windows Update and FTDI drivers (Hackaday, 2014)
Windows Update 推送的 FTDI 驱动导致原本正常的设备失效的案例
hackaday.com
继续阅读
仍然没有解决?在 Discord 提交工单
全部指南