Funzione ExAllocatePoolWithTagPriority (wdm.h)
La routine ExAllocatePoolWithTagPriority alloca la memoria del pool del tipo specificato.
Avvertimento
ExAllocatePoolWithTagPriority è stato deprecato in Windows 10 versione 2004 ed è stato sostituito da ExAllocatePool3. Per altre informazioni, vedere Aggiornamento di chiamate ExAllocatePool deprecatePool 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 con questo valore con il flag di POOL_RAISE_IF_ALLOCATION_FAILURE. Questo flag genera un'eccezione se la richiesta non può essere soddisfatta.
Analogamente, è possibile modificare il valore poolType bit per bit con questo valore con il flag POOL_COLD_ALLOCATION come hint al kernel per allocare la memoria dalle pagine che probabilmente verranno visualizzate rapidamente. 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 consultivo 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 priorità | Descrizione |
---|---|
LowPoolPriority | Specifica che il sistema potrebbe non riuscire a eseguire la richiesta quando è insufficiente nelle risorse. Le allocazioni dei driver che possono essere ripristinate da un errore di allocazione usano questa priorità. |
NormalPoolPriority | Specifica che il sistema potrebbe non riuscire a eseguire la richiesta quando viene eseguito molto basso nelle risorse. La maggior parte dei driver deve usare questo valore. |
HighPoolPriority | Specifica che il sistema non deve avere esito negativo per la 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 XxxSpecialPoolOverrun e XxxSpecialPoolUnderrun varianti per specificare la modalità di allocazione della memoria quando Driver Verifier (o pool speciale) è abilitato. Se il driver specifica XxxSpecialPoolUnderrun, quando il gestore di memoria alloca memoria da pool speciale, lo alloca all'inizio di una pagina fisica. Se il driver specifica XxxSpecialPoolOverrun, il gestore della memoria lo alloca alla fine di una pagina fisica.
Valore restituito
exAllocatePoolWithTagPriority restituisce NULL se nel pool libero non è disponibile 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.
Osservazioni
I chiamanti di ExAllocatePoolWithTagPriority devono essere eseguiti 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 lo spazio di intestazione del pool e, in molti casi, indicano un potenziale problema di convalida nel codice chiamante. Per questo motivo, Driver Verifier flag tali allocazioni il più possibile errori.
Il sistema imposta automaticamente determinati oggetti evento standard quando la quantità di pool (di paging o non di paging) è elevata o bassa. I driver possono attendere che questi eventi possano ottimizzare 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 che ExAllocatePoolWithTagPriority alloca 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).
Fabbisogno
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 | HwStorPortProhibitedDDIs(storport), IrqlExAllocatePool(wdm), IrqlExFree2(wdm), SpNoWait(storport), StorPortStartIo(storport), UnsafeAllocatePool(kmdf), UnsafeAllocatePool(wdm) |