启用单个二进制文件: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);