【发布时间】:2011-06-12 11:28:11
【问题描述】:
我的问题:
当 win32k.sys 被加载到会话空间时,它在每个会话中得到相同的基地址吗?
详情:
我正在为 Windows(32 位)编写内核模式设备驱动程序。它在系统启动期间作为标准 WDM 驱动程序加载到系统空间(全局内核模式内存)中。
但在某些情况下,我需要访问由 win32k.sys 导出的函数。确切地说,我正在编写一种有时需要伪装成显示驱动程序的驱动程序。
我可能不会静态导入这些函数(意味着通过可执行导入表导入它们)。这是因为 win32k.sys 是在创建会话的后期加载的。此外,它已加载到 会话空间。
不过,我找到了解决方法。在会话创建期间,我动态导入所需的功能。我使用ZwQuerySystemInformation 和SystemModuleInformation 在当前会话中找到win32k.sys 的基地址。然后利用这个基地址分析找到win32k.sys的导出目录,得到需要的函数指针。
目前,对于每个会话,我都会保留一个单独的导入函数数组。然而实际上这些功能在所有会话中总是相同的。意思是——win32k.sys在每个会话中都映射到属于会话空间的同一个地址。
因此,我的问题是,是否可以保证 win32k.sys 将在所有会话中映射到相同的地址?
除了节省一些内存之外,这对我来说会更容易。目前为了调用这样的函数,我需要一个特定于会话的上下文来存储函数指针。
【问题讨论】:
标签: windows session kernel driver