启用单个二进制文件: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该变量初始化为 Windows) 及更高版本的 Windows 8 和更高版本的 NonPagedPoolNx (,或者初始化为早期版本的 Windows) 的 NonPagedPoolExecute (。 通过此选择加入机制,内核模式驱动程序可以在Windows 8、NX 池的增强保护以及不支持 NX 池的早期版本的 Windows 上运行。 将 NonPagedPool 常量名称的实例转换为 NonPagedPoolNx 的宏还会将 NonPagedPoolCacheAligned 的实例转换为 NonPagedPoolNxCacheAligned

支持静态库 (.lib 项目)

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

ExInitializeDriverRuntime(DrvRtPoolNxOptIn);