Condividi tramite


Single Binary Opt-In: POOL_NX_OPTIN

Per compilare un singolo file binario di driver che viene eseguito sia in Windows 8 che nelle versioni precedenti di Windows, usare il meccanismo di consenso esplicito POOL_NX_OPTIN. Si tratta di un aiuto di conversione per i fornitori di hardware di terze parti che forniscono un singolo binario driver per supportare più versioni di Windows.

Per usare questo meccanismo di consenso esplicito, eseguire le operazioni seguenti:

  • Definire POOL_NX_OPTIN = 1 per tutti i file di origine che si desidera acconsentire esplicitamente. A tale scopo, includere la definizione del preprocessore seguente nella pagina delle proprietà appropriata per il progetto driver:

    C_DEFINES=$(C_DEFINES) -DPOOL_NX_OPTIN=1

  • Nella routine DriverEntry (o equivalente) includere la chiamata di funzione seguente:

    ExInitializeDriverRuntime(DrvRtPoolNxOptIn);

    Questa chiamata deve verificarsi prima che il driver effettui le allocazioni che utilizzano il tipo di pool nonPagedPool o effettua qualsiasi chiamata alla routineExInitializeNPagedLookasideList. ExInitializeDriverRuntime è una funzione inline forzata e può essere chiamata in Windows 8 o versioni successive di Windows.

Per la maggior parte dei driver, queste due attività sono sufficienti per abilitare il meccanismo di consenso esplicito per il singolo driver binario.

Dettagli sull'implementazione

POOL_NX_OPTIN funziona sostituendo NonPagedPool con una variabile POOL_TYPE globale, ExDefaultNonPagedPoolType, che viene inizializzata per NonPagedPoolNx (per Windows 8 e versioni successive di Windows) o per NonPagedPoolExecute (per le versioni precedenti di Windows). Questo meccanismo di consenso esplicito consente al driver in modalità kernel di eseguire entrambi in Windows 8, con la protezione avanzata del pool NX e nelle versioni precedenti di Windows, che non supportano il pool NX. La macro che converte le istanze del nome costante NonPagedPool in NonPagedPoolNx converte anche istanze di NonPagedPoolCacheAligned in NonPagedPoolNxCacheAligned.

Supporto per librerie statiche (progetti con estensione lib)

È possibile usare il meccanismo di consenso esplicito POOL_NX_OPTIN per un progetto .lib, ma i progetti che si collegano a .lib devono in genere usare anche POOL_NX_OPTIN. Come minimo, il progetto che implementa la routine DriverEntry deve contenere la chiamata di funzione seguente:

ExInitializeDriverRuntime(DrvRtPoolNxOptIn);