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);