关于 XP SP3 系统下 NtUserCreateWindowEx 原型分析(修正版) 第 1 页 共 7 页 关于 XP SP3 系统下 NtUserCreateWindowEx 原型分析 修正版 By HSQ 说明:其实以前就因为需要用到这个函数来处理一些特定窗口,苦于没有该 API 原型,最后自己也是草草的 DBG了一下,可弄错来的结果还是有偏差。最近再次用那些东西试试效果,居然发现用起来完全形同虚设。可能是系统升级后,原来蒙的偏移量改变了。乘着闲来无事,干脆下决心给彻底弄清楚其原型。顺便将分析过程记录存档,以便共享后来者和遗忘是查阅。 1. 其最终由 WIN32K.SYS 实现 2. 调用流程 关于 XP SP3 系统下 NtUserCreateWindowEx 原型分析(修正版) 第 2 页 共 7 页 3. 参数传递经过 3.1 CreateWindowEx(CreateWindowExW/A) 先从 2k 源码看参数传递过程开始分析 注意:在 2K 中没有 CreateWindowExW/A 之分,这也正是需要对 NtUserCreateWindowEx进行重新分析的原因 CreateWindowEx没有对参数进行任何处理,而是追加一个参数后直接调用_CreateWindowEx 3.2 _CreateWindowEx 可见,在 2k 时,是通过是否定义了的调用: 关于 XP SP3 系统下 NtUserCreateWindowEx 原型分析(修正版) 第 3 页 共 7 页 对于,其他参数都沿袭 2K。 _CreateWindowEx进行一些处理后接着开始进入下一层调用,这里 XP 与 2K 处理有些差异。 3.3 NtUserCreateWindowEx(VerNtUserCreateWindowEx) A. 在 2K 中,到次就直接进入了 NtUserCreateWindowEx流程 NtUserCreateWindowEx的原型: 关于 XP SP3 系统下 NtUserCreateWindowEx 原型分析(修正版) 第 4 页 共 7 页 至此,用户层的处理已经结束。 B.而在 XP 中,却还得经过一个 VerNtUserCreateWindowEx调用才会进入 NtUserCreateWindowEx流程。结合2K 的源码,拿 IDA 的 F5 初步分析,猜测 VerNtUserCreateWindowEx应该就是以前 NtUserCreateWindowEx的伪函数 再看看该处使用到的一些字符结构 由此可见 PLARGE_STRING 是 PLARGE_ANSI_STRING 与 PLARGE_UNICODE_STRING 的通用结构,而 VerNtUserCreateWindowEx内代码片无非是根据上层函数传入的关于 XP SP3 系统下 NtUserCreateWindowEx 原型分析(修正版) 第 5 页 共 7 页 在此基础上,用 IDA 进行分析看得出 NtUserCreateWindowEx的最终原型基本为, 4. 最终整理 XP SP3...