Win32 内核模式接口( Win32 Kernel-mode Interface )
从前面对 SDT 的讨论,可看出存在着与 Native API 相关的第二个主内核模式接口( main Kernel-mode Interface ) 。该接口将 Win32 子系统的图形设备接口( Graphics Device Interface, GDI )、窗口管理器(即 User 模块)连接至内核组件 ---Win32K (即 Win32k.sys ) .,该组件随同 Windows NT 4.0 引入 。引入该组件是为了克服 Win32 图形引擎固有的性能限制(由于 Windows NT 子系统的最初设计导致) 。在 Windows NT 3.x 中,Win32 子系统采用的是客户 - 服务器模式( Client-Server model ),这样就必须从用户模式切换到内核模式才能进行内核调用( Kernel Involved ) 。通过将图形引擎的绝大部分移至内核组件 ---Win32k.sys,从而避免了大部分因内核切换导致的性能损失 。
Win32K 分派 ID ( Win32K Dispatch IDs )
现在该介绍 Win32k.sys 了,也是该更新 图 2-1 的时候了 。图 2-2 基于 图 2-1,但在 ntoskrnl.exe 左面加入了 Win32k.sys。同时我还加入了从 GDI32.DLL 和 USER32.DLL 指向 Win32k.sys 的箭头 。当然,这不是百分之百正确,因为这些模块中的 INT 2eh 调用实际上指向 ntoskrnl.exe,在 ntoskrnl.exe 中才有该中断的处理例程 。然而,调用最后还是由 Win32k.sys 管理,这也是箭头这样指的原因 。
稍早提到过,Win32K 接口同样基于 INT 2eh 分派器( INT 2eh Dispatcher ),这与 Native API 非常相似 。仅有的区别在于 Win32K 使用另一区段的分派 ID。尽管与所有 Native API 调用相关的分派 ID 都位于 0x0000----0x0FFF,而 Win32K 分派 ID 位于 0x1000---0x1FFF 之间 。如 图 2-2 所示,Win32K 的主要客户端是 GDI32.DLL 和 USER32.DLL。因此,通过反编译这些模块(指 gdi32.dll 和 user32.dll )可能会找到与 Win32K 分派 ID 相关的符号化名称 。通过反编译可发现在这些模块( gdi32.dll 和 user32.dll )的导出节( export sections )中仅包含 INT 2eh 调用的一个很小的子集,看来是时候再次使用内核调试器了 。如 示例 2-3 所示,我通过使用 dd W32pServiceTable 命令,来确定 Win32k.sys 的符号是可用的,在此之前请先使用 .reload 命令以加载所有可用符号文件 。
在 示例 2-3 的最后三行中,我使用 ln 命令显示与 W32pServiceTable 的第一个入口地址相关的符号 。显然,可看到分派 ID 为 0 的 Win32K 函数为 NtGdiAbortDoc()。你可以针对所有 639 个 ID 来重复此过程,但是最好能自动进行符号的查找 。现在,我已经为你完成了这项工作,所有分派 ID 对应的符号名称都收录在 附录 B 的 表 B-2 中 。符号从 gdi32.dll 和 user32.dll 映射到 win32k.sys 十分简单: GDI 符号可通过在其前面添加 NtGdi 前缀就可转换为 Win32K 符号,USER 符号则添加 NtUser 前缀 。然而,有一少部分例外 。例如,如果一个 GDI 符号以 Gdi 开始,那么其前缀就减少为 Nt,这可能是为了避免出现 NtGdiGdi 这样的字符序列 。在其他的一些例子中,字符的大小写会有些不同(比如 EnableEUDC() 转化后则变成了 NtGdiEnableEudc() ),或者用符号名称尾部的 W 来表示没有对应的 Unicode 函数(如,CopyAcceleratorTableW() 转化后成为 NtUserCopyAcceleratorTable() ) 。
【1 《Undocumented Windows 2000 Secrets》翻译 --- 第二章】提供 Win32K API 的详细文档需要很大的努力 。这些函数几乎是 Native API 的三倍 。或许某天有人会为这些 API 编写一本不错的参考手册,就像 Gary Nebbett 编写的 Native API 手册 。不过,在本书范围内,有关这些 API 的信息已经足够了 。
推荐阅读
- 浅谈非系统管理员用户本地登录Windows 2000 server
- 同床异梦秋瓷炫多少期
- Windows 2000进程细述
- 《Undocumented Windows 2000 Secrets》翻译 --- 3
- Windows2000的日志文件详述及删除方法
- 命令篇 Windows 2000/XP的CMD命令教程 (3)
- 2 《Undocumented Windows 2000 Secrets》翻译 --- 第三章
- 如何安装/卸载 Windows 2000 的公钥证书颁发机构
- 使用 Windows 2000 备份程序备份和还原系统状态
- 8 《Undocumented Windows 2000 Secrets》翻译 --- 第四章
