单二进制选择加入:POOL_NX_OPTIN

若要生成在 Windows 8 和早期版本的 Windows 中运行的单个驱动程序二进制文件,请使用POOL_NX_OPTIN选择加入机制。 这是第三方硬件供应商的移植援助,提供单个驱动程序二进制文件来支持多个 Windows 版本。

若要使用此选择加入机制,请执行以下作:

  • 为要选择加入的所有源文件定义POOL_NX_OPTIN = 1。 为此,请在驱动程序项目的相应属性页中包含以下预处理器定义:

    C_DEFINES=$(C_DEFINES) -DPOOL_NX_OPTIN=1

  • DriverEntry(或等效)例程中,包括以下函数调用:

    ExInitializeDriverRuntime(DrvRtPoolNxOptIn);

    在驱动程序发出任何使用 nonPagedPool 池类型的 分配或对 ExInitializeNPagedLookasideList 例程进行任何调用之前,必须进行此调用。 ExInitializeDriverRuntime 是强制内联函数,可在 Windows 8 或更高版本的 Windows 上调用。

对于大多数驱动程序,这两个任务足以为单个驱动程序二进制文件启用选择加入机制。

实现细节

POOL_NX_OPTIN的工作原理是将 NonPagedPool 替换为全局 POOL_TYPE 变量 ExDefaultNonPagedPoolType,该变量初始化为 NonPagedPoolNx(适用于 Windows 8 及更高版本)或 NonPagedPoolExecute(适用于早期版本的 Windows)。 这种选择加入机制使内核模式驱动程序可以在 Windows 8 上运行,同时增强 NX 池的保护,以及不支持 NX 池的早期版本的 Windows。 将 NonPagedPool 实例 常量名称转换为 NonPagedPoolNx 的宏 还会将 NonPagedPoolCacheAligned 的实例转换为 NonPagedPoolNxCacheAligned

对静态库的支持(.lib 项目)

可以使用 .lib 项目的POOL_NX_OPTIN选择加入机制,但链接到 .lib 的项目通常也必须使用POOL_NX_OPTIN。 至少,实现 DriverEntry 例程的项目必须包含以下函数调用:

ExInitializeDriverRuntime(DrvRtPoolNxOptIn);