Condividi tramite


Funzione ExAllocatePoolWithTagPriority (wdm.h)

La routine ExAllocatePoolWithTagPriority alloca la memoria del pool del tipo specificato.

Avviso

ExAllocatePoolWithTagPriority è stato deprecato in Windows 10 versione 2004 ed è stato sostituito da ExAllocatePool3. Per altre informazioni, vedere Aggiornamento delle chiamate ExAllocatePool deprecate a ExAllocatePool2 e ExAllocatePool3.

Sintassi

PVOID ExAllocatePoolWithTagPriority(
  [in] __drv_strictTypeMatch(__drv_typeCond)POOL_TYPE        PoolType,
  [in] SIZE_T                                                NumberOfBytes,
  [in] ULONG                                                 Tag,
  [in] __drv_strictTypeMatch(__drv_typeExpr)EX_POOL_PRIORITY Priority
);

Parametri

[in] PoolType

Tipo di memoria del pool da allocare. Per una descrizione dei tipi di memoria del pool disponibili, vedere POOL_TYPE.

È possibile modificare il valore PoolType bit per bit-ORing con il flag POOL_RAISE_IF_ALLOCATION_FAILURE. Questo flag causa la generazione di un'eccezione se la richiesta non può essere soddisfatta.

Analogamente, è possibile modificare il valore PoolType in bit per bit-ORing con il flag POOL_COLD_ALLOCATION come hint per il kernel per allocare la memoria dalle pagine che è probabile che venga eseguito rapidamente il paging. Per ridurre la quantità di memoria del pool residente il più possibile, non è consigliabile fare riferimento a queste allocazioni di frequente. Il flag POOL_COLD_ALLOCATION è solo avviso ed è disponibile a partire da Windows XP.

[in] NumberOfBytes

Numero di byte da allocare.

[in] Tag

Tag del pool da usare per la memoria allocata. Per altre informazioni, vedere il parametro Tag di ExAllocatePoolWithTag.

[in] Priority

Priorità di questa richiesta. Impostare questo parametro su uno dei valori di enumerazione EX_POOL_PRIORITY seguenti.

Valore di priorità Descrizione
LowPoolPriority Specifica che il sistema potrebbe non riuscire a eseguire la richiesta quando viene eseguita su risorse ridotte. Le allocazioni di driver che possono essere recuperate da un errore di allocazione usano questa priorità.
NormalPoolPriority Specifica che il sistema potrebbe non riuscire a eseguire la richiesta quando viene eseguita molto bassa sulle risorse. La maggior parte dei driver deve usare questo valore.
HighPoolPriority Specifica che il sistema non deve avere esito negativo alla richiesta, a meno che non sia completamente esaurito dalle risorse. I driver usano questo valore solo quando è fondamentale che la richiesta abbia esito positivo.

L'enumerazione EX_POOL_PRIORITY definisce le varianti XxxSpecialPoolOverrun e XxxSpecialPoolUnderrun per specificare la modalità di allocazione della memoria quando è abilitato Driver Verifier (o pool speciale). Se il driver specifica XxxSpecialPoolUnderrun, quando lo strumento di gestione della memoria alloca memoria da un pool speciale, lo alloca all'inizio di una pagina fisica. Se il driver specifica XxxSpecialPoolOverrun, lo alloca alla fine di una pagina fisica.

Valore restituito

ExAllocatePoolWithTagPriority restituisce NULL se nel pool libero non è presente memoria insufficiente per soddisfare la richiesta, a meno che non venga specificato POOL_RAISE_IF_ALLOCATION_FAILURE. In caso contrario, la routine restituisce un puntatore alla memoria allocata.

Commenti

I chiamanti di ExAllocatePoolWithTagPriority devono essere in esecuzione in IRQL <= DISPATCH_LEVEL. Un chiamante in esecuzione in DISPATCH_LEVEL deve specificare un valore NonPagedXxx per PoolType. Un chiamante in esecuzione in IRQL <= APC_LEVEL può specificare qualsiasi valore POOL_TYPE , ma è necessario considerare anche IRQL e ambiente per determinare il tipo di pagina.

Se NumberOfBytes è PAGE_SIZE o superiore, viene allocato un buffer allineato alla pagina. Le allocazioni di memoria di PAGE_SIZE o meno vengono allocate all'interno di una pagina e non superano i limiti di pagina. Le allocazioni di memoria di meno di PAGE_SIZE non sono necessariamente allineate a pagine, ma sono allineate ai limiti a 8 byte nei sistemi a 32 bit e ai limiti a 16 byte nei sistemi a 64 bit.

Non impostare NumberOfBytes = 0. Evitare allocazioni di lunghezza zero perché sprecano spazio di intestazione del pool e, in molti casi, indicano un potenziale problema di convalida nel codice chiamante. Per questo motivo, Driver Verifier contrassegna tali allocazioni come possibili errori.

Il sistema imposta automaticamente determinati oggetti evento standard quando la quantità di pool (paging o non di paging) è elevata o bassa. I driver possono attendere che questi eventi ottimizzano l'utilizzo del pool. Per altre informazioni, vedere Oggetti evento standard.

In un'architettura multiprocessore NUMA (Non-Uniform Memory Access), ExAllocatePoolWithTagPriority tenta di allocare memoria locale al processore che chiama ExAllocatePoolWithTagPriority. Se non è disponibile alcuna memoria locale, ExAllocatePoolWithTagPriority alloca la memoria disponibile più vicina.

La memoria allocata da ExAllocatePoolWithTagPriority non è inizializzata. Un driver in modalità kernel deve prima zero questa memoria se lo rende visibile al software in modalità utente (per evitare la perdita di contenuti potenzialmente privilegiati).

Requisiti

Requisito Valore
Piattaforma di destinazione Universale
Intestazione wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL IRQL <= DISPATCH_LEVEL (vedere la sezione Osservazioni)
Regole di conformità DDI HwStorPortProhibitedDDDIs(storport), IrqlExAllocatePool(wdm), IrqlExFree2(wdm), SpNoWait(storport), StorPortStartIo(storport), UnsafeAllocatePool(kmdf), UnsafeAllocatePool(wdm)

Vedi anche

ExAllocatePoolWithTag

ExFreePool

POOL_TYPE