Partilhar via


Opt-in binário único: POOL_NX_OPTIN

Para criar um único binário de driver que seja executado no Windows 8 e em versões anteriores do Windows, use o mecanismo de aceitação POOL_NX_OPTIN. Esta é uma ajuda de portabilidade para fornecedores de hardware de terceiros que fornecem um único binário de driver para suportar várias versões do Windows.

Para usar esse mecanismo de aceitação, faça o seguinte:

  • Defina POOL_NX_OPTIN = 1 para todos os arquivos de origem que você deseja aceitar. Para fazer isso, inclua a seguinte definição de pré-processador na página de propriedades apropriada para seu projeto de driver:

    C_DEFINES=$(C_DEFINES) -DPOOL_NX_OPTIN=1

  • Na sua rotina DriverEntry (ou equivalente), inclua a seguinte chamada de função:

    ExInitializeDriverRuntime(DrvRtPoolNxOptIn);

    Essa chamada deve ocorrer antes que o driver faça qualquer alocação que use o tipo de pool NonPagedPool ou faça chamadas para a rotinaExInitializeNPagedLookasideList. ExInitializeDriverRuntime é uma função force inline e pode ser chamada no Windows 8 ou em versões posteriores do Windows.

Para a maioria dos drivers, essas duas tarefas são suficientes para habilitar o mecanismo de aceitação para o binário de driver único.

Detalhes da implementação

POOL_NX_OPTIN funciona substituindo NonPagedPool por uma variável POOL_TYPE global, ExDefaultNonPagedPoolType, que é inicializada para NonPagedPoolNx (para Windows 8 e versões posteriores do Windows) ou para NonPagedPoolExecute (para versões anteriores do Windows). Esse mecanismo de aceitação permite que o driver do modo kernel seja executado no Windows 8, com a proteção aprimorada do pool NX, e em versões anteriores do Windows, que não suportam o pool NX. A macro que converte instâncias do NonPagedPool nome constante para NonPagedPoolNx também converte instâncias de NonPagedPoolCacheAligned para NonPagedPoolNxCacheAligned.

Suporte para bibliotecas estáticas (projetos .lib)

Você pode usar o mecanismo de aceitação POOL_NX_OPTIN para um projeto .lib, mas os projetos vinculados ao .lib geralmente também devem usá-POOL_NX_OPTIN. No mínimo, o projeto que implementa a rotina deDriverEntry dodeve conter a seguinte chamada de função:

ExInitializeDriverRuntime(DrvRtPoolNxOptIn);