Windows Vista Build 5000.0.vbl core.040808-2000:修订间差异

跳转到导航 跳转到搜索
第 23 行: 第 23 行:
默认情况下,此版本有一个严重的 bug,即一旦 Windows 切换到图形模式,它就会挂起,最终出现稳定的蓝色或黑色屏幕,因此在正常情况下无法安装此版本。
默认情况下,此版本有一个严重的 bug,即一旦 Windows 切换到图形模式,它就会挂起,最终出现稳定的蓝色或黑色屏幕,因此在正常情况下无法安装此版本。


== Bug analysis ==
== Bug 分析 ==
'''Module name:''' <code>win32k.sys</code>
'''模块名称:'''<code>win32k.sys</code>


'''Reason:''' An uninitialised variable which causes <code>win32k</code> to raise Access Violation exception (by reading null pointer) and failing without any notice.
'''原因:'''未初始化的变量,导致 win32k 引发 Access Violation 异常(通过读取 null 指针)并在没有任何通知的情况下失败。


When Windows loads, it only shows a blank blue or black background without any cursor or watermark. Keyboard interrupts are also stuck/unregistered. First checks show that kernel idle loop is running fine and processing interrupts. There are no exceptions or bugchecks logged into WinDbg, hence the next check is to set breakpoints on <code>nt!ExRaiseStatus</code> and <code>nt!ExRaiseAccessViolation</code>, which apparently is what <code>win32k</code> is calling and leaving the function it is in. According to the following stack, it is either being called at <code>win32k!EngFreeModule+0x5c9</code> (the preceding instruction), or the called function has called it:
Windows 加载时,它只显示空白的蓝色或黑色背景,没有任何光标或水印。键盘中断也被卡住/未注册。首先检查显示内核空闲循环运行良好并处理中断。WinDbg 中没有异常或错误检查,因此下一个检查是在 <code>nt!ExRaiseStatus</code> <code>nt!ExRaiseAccessViolation</code>,这显然是 <code>win32k</code> 调用并迁离它所在的函数的内容。根据下方的堆栈,它要么在 <code>win32k!EngFreeModule+0x5c9</code>(前面的指令),要么是被调用的函数调用了它:
<pre>
<pre>
f75d6d24 nt!ExRaiseAccessViolation
f75d6d24 nt!ExRaiseAccessViolation
第 38 行: 第 38 行:
</pre>
</pre>


Checking the code, it is calling the function located at <code>win32k!EngMulDiv+0x29c0</code>:
检查代码,它正在调用位于<code>win32k!EngMulDiv+0x29c0</code> 的函数:
<pre>
<pre>
win32k!EngFreeModule+0x5b1:
win32k!EngFreeModule+0x5b1:
第 51 行: 第 51 行:
</pre>
</pre>


Inside that procedure, using a line-by-line tracing where it ends up calling <code>ExRaiseAccessViolation</code> has been found in the following part:
在此过程中,使用逐行跟踪(最终调用 <code>ExRaiseAccessViolation</code>)在以下部分中找到:
<pre>
<pre>
win32k!EngMulDiv+0x2b62:
win32k!EngMulDiv+0x2b62:
第 63 行: 第 63 行:
</pre>
</pre>


Comparing it with [[Windows Vista build 5000 (vbl core.040809-2000)|build 5000 (vbl_core.040809-2000)]]'s <code>win32k.sys</code>, the content of <code>win32k!HT_Get8BPPMaskPalette+0x3261c (bf9c219c)</code> in this build's <code>win32k.sys</code> is 7fff0000 instead of 00000000. At this point, the location of the failure has been pinpointed. With some additional comparison against build 5000 (vbl_core.040808-2000)'s <code>win32k.sys</code>, where that address is being filled up has been found:
[[Windows Vista Build 5000.0.vbl_core.040809-2000)|Build 5000.040809-2000]] <code>win32k.sys</code> 相比,<code>win32k!HT_Get8BPPMaskPalette+0x3261c (bf9c219c)</code> 在此版本的 <code>win32k.sys</code> 中的是 7fff0000 而不是 00000000。此时,已查明故障的位置。通过与 Build 5000.040808-2000 <code>win32k.sys</code> 进行一些额外的比较,发现此地址被填满了:
<gallery>
<gallery>
Snip_0808.jpg|This build's <code>win32k.sys</code>
Snip_0808.jpg|此版本的 <code>win32k.sys</code>
Snip_0809.jpg|[[Windows Vista build 5000 (vbl core.040809-2000)|Build 5000 (vbl_core.040809-2000)]] <code>win32k.sys</code>
Snip_0809.jpg|[[Windows Vista Build 5000.0.vbl_core.040809-2000)|Build 5000.040809-2000)]] <code>win32k.sys</code>
</gallery>
</gallery>


导航菜单