【MICROSOFT】Windows 类额外字节滥用兼容说明
微软回顾了 Windows 早期对窗口类(class)额外字节字段被滥用以存储指针的历史,指出为了兼容 16 位程序,系统仍允许修改某些旧字段,但在 32/64 位中已封堵该漏洞。文章强调开发者常把可隐藏指针的地方当作私有存储位,并解释了为何某些兼容开放被保留或关闭。
微软回顾了 Windows 早期对窗口类(class)额外字节字段被滥用以存储指针的历史,指出为了兼容 16 位程序,系统仍允许修改某些旧字段,但在 32/64 位中已封堵该漏洞。文章强调开发者常把可隐藏指针的地方当作私有存储位,并解释了为何某些兼容开放被保留或关闭。
背景
- Windows 的窗口类(class)结构允许指定“额外字节”(extra bytes),最初用于存放小整数或近指针。
- 随着指针大小演进,ID 字段扩展为指针大小以适应存放指针的习惯。
历史兼容问题
- 在 16 位 Windows 的 SetClassWord 中,存在一个兼容备注:某个应用依赖能修改 GWW_CBCLSEXTRA 的值。
- 修改该值并不会改变类分配的内存大小(注册时已确定),但程序把它当作私有存储位来使用。
- 因兼容性,Windows 允许 16 位程序修改该字段,但在 32 位和 64 位环境下该修改已被阻止。
教训与建议
- 任何能“藏指针”的位置都会被滥用——这是长期观察到的现象。
- 不要把未指定为存储指针的系统字段当作私有数据槽;应使用受支持的 API(如窗口/类专用的用户数据接口)来保存应用状态。
- 随着平台演进,依赖未文档或边缘行为的做法可能被封堵或导致兼容性问题。
结论
- 微软在维护兼容性与修补滥用之间保持平衡:关掉明显危险的漏洞(32/64 位),但保留对早期程序的部分兼容性。
- 开发者应遵循文档化的方法来存储与管理指针和私有数据,避免依赖历史实现细节。
历史兼容性虽必要,但不要把系统结构当作私有数据存储位。
不错过任何一条 AI 大事
订阅 AIFlux 早报,每天 3 分钟看懂产业动态。

