Participación binaria única: POOL_NX_OPTIN

Para crear un archivo binario de controlador único que se ejecute tanto en Windows 8 como en versiones anteriores de Windows, use el mecanismo de participación de POOL_NX_OPTIN. Se trata de una ayuda de portabilidad para proveedores de hardware de terceros que suministran un único archivo binario de controladores para admitir varias versiones de Windows.

Para usar este mecanismo de participación, haga lo siguiente:

  • Defina POOL_NX_OPTIN = 1 para todos los archivos de origen que desee participar. Para ello, incluya la siguiente definición de preprocesador en la página de propiedades adecuada para el proyecto de controlador:

    C_DEFINES=$(C_DEFINES) -DPOOL_NX_OPTIN=1

  • En la rutina DriverEntry (o equivalente), incluya la siguiente llamada de función:

    ExInitializeDriverRuntime(DrvRtPoolNxOptIn);

    Esta llamada debe producirse antes de que el controlador realice las asignaciones que usen el tipo de grupo NonPagedPool o realice cualquier llamada a la rutina ExInitializeNPagedLookasideList . ExInitializeDriverRuntime es una función forzada insertada y se puede llamar a en Windows 8 o versiones posteriores de Windows.

Para la mayoría de los controladores, estas dos tareas son suficientes para habilitar el mecanismo de participación para el binario del controlador único.

Detalles de la implementación

POOL_NX_OPTIN funciona reemplazando NonPagedPool por una variable de POOL_TYPE global, ExDefaultNonPagedPoolType, que se inicializa en NonPagedPoolNx (para Windows 8 y versiones posteriores de Windows) o en NonPagedPoolExecute (para versiones anteriores de Windows). Este mecanismo de participación permite que el controlador en modo kernel se ejecute en Windows 8, con la protección mejorada del grupo de NX y en versiones anteriores de Windows, que no admiten el grupo de NX. La macro que convierte instancias del nombre de constante NonPagedPool en NonPagedPoolNx también convierte instancias de NonPagedPoolCacheAligned en NonPagedPoolNxCacheAligned.

Compatibilidad con bibliotecas estáticas (proyectos .lib)

Puede usar el mecanismo de participación de POOL_NX_OPTIN para un proyecto .lib, pero los proyectos que se vinculan a .lib generalmente también deben usar POOL_NX_OPTIN. Como mínimo, el proyecto que implementa la rutina DriverEntry debe contener la siguiente llamada de función:

ExInitializeDriverRuntime(DrvRtPoolNxOptIn);