Partilhar via


Aceitação binária única: POOL_NX_OPTIN

Para criar um binário de driver único executado no Windows 8 e em versões anteriores do Windows, use o mecanismo de aceitação POOL_NX_OPTIN. Esse é um auxílio de portabilidade para fornecedores de hardware de terceiros que fornecem um binário de driver único para dar suporte a 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

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

    ExInitializeDriverRuntime(DrvRtPoolNxOptIn);

    Essa chamada deve ocorrer antes que o driver faça alocações que usem o tipo de pool NonPagedPool ou faça chamadas para a rotina ExInitializeNPagedLookasideList . ExInitializeDriverRuntime é uma função embutida forçada e pode ser chamada em Windows 8 ou 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 de implementação

POOL_NX_OPTIN funciona substituindo NonPagedPool por uma variável de 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 em Windows 8, com a proteção aprimorada do pool de NX e em versões anteriores do Windows, que não dão suporte ao pool de NX. A macro que converte instâncias do nome da constante NonPagedPool em NonPagedPoolNx também converte instâncias de NonPagedPoolCacheAligned em NonPagedPoolNxCacheAligned.

Suporte para bibliotecas estáticas (projetos .lib)

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

ExInitializeDriverRuntime(DrvRtPoolNxOptIn);