The case of the invalid function pointer when shutting down the display control panel - The Old New Thing2 months agohttps://devblogs.microsoft.com/oldnewthing/20260715-00/?p=112535由于无效的窗口过程地址,在销毁属性表时显示控制面板发生崩溃。无效地址是由于64位指针被截断为32位然后进行符号扩展,导致无效的内核模式地址。通过将低32位与进程模块列表中的有效用户模式地址进行匹配,识别正确的窗口过程。该错误是由C++代码中强制转换为LONG而不是LONG_PTR导致的,截断了原始指针。修复方法是在二进制中进行一个字节的补丁:将指令从movsxd(32位符号扩展)改为mov(64位加载)。
Speculating on how the buggy control panel extension truncated a value that it had right in front of it - The Old New Thing2 months agohttps://devblogs.microsoft.com/oldnewthing/20260716-00/?p=112539控制面板扩展程序中的崩溃是由指针截断导致的:64位指针的高32位被丢弃。原始的32位代码使用了带有`GWL_WNDPROC`参数的`SetWindowLong`,并进行了`(LONG)`强制转换,这在32位模式下正常工作。当为64位重新编译时,构建错误提示将`GWL_`重命名为`GWLP_`以标记潜在的指针截断。开发者修复了符号名称,但忽略了将强制转换从`(LONG)`更新为`(LONG_PTR)`,导致了截断错误。这个错误可能是一个疏忽;开发者在其他地方正确地对窗口进行了子类化,但遗漏了这一处。这段代码很可能来自32位系统普遍使用的时代(15-20年前),此时`SetWindowLongPtr`已经存在但未被使用。正确的修复方法是使用带有`LONG_PTR`参数的`SetWindowLongPtr`,以便在64位系统上正确处理指针。