Funzione ExAllocatePoolWithQuotaTag (wdm.h)
Il ExAllocatePoolWithQuotaTag routine alloca la memoria del pool, caricando la quota rispetto al processo corrente.
Avvertimento
ExAllocatePoolWithQuotaTag è stato deprecato in Windows 10 versione 2004 ed è stato sostituito da ExAllocatePool2. Per altre informazioni, vedere Aggiornamento di chiamate ExAllocatePool deprecatePool deprecate a ExAllocatePool2 e ExAllocatePool3.
Sintassi
PVOID ExAllocatePoolWithQuotaTag(
[in] __drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType,
[in] SIZE_T NumberOfBytes,
[in] ULONG Tag
);
Parametri
[in] PoolType
Specifica il 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 POOL_QUOTA_FAIL_INSTEAD_OF_RAISE. Questo flag fa sì che la routine restituisca un valore NULL 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 è supportato in Windows XP e versioni successive del sistema operativo Windows.
[in] NumberOfBytes
Specifica il numero di byte da allocare.
[in] Tag
Specifica il tag del pool per la memoria allocata. Per altre informazioni, vedere il parametro tag di ExAllocatePoolWithTag.
Valore restituito
exAllocatePoolWithQuotaTag restituisce un puntatore al pool allocato.
Se la richiesta non può essere soddisfatta, exAllocatePoolWithQuotaTag genera un'eccezione a meno che non venga specificata POOL_QUOTA_FAIL_INSTEAD_OF_RAISE. L'uso di POOL_QUOTA_FAIL_INSTEAD_OF_RAISE è preferibile per motivi di prestazioni.
Osservazioni
Questa routine viene chiamata dai driver di livello più alto che allocano memoria per soddisfare una richiesta nel contesto del processo che ha originariamente effettuato la richiesta di I/O. I driver di livello inferiore chiamano ExAllocatePoolWithTag.
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.
Il sistema associa il tag del pool alla memoria allocata. Gli strumenti di programmazione, ad esempio WinDbg, possono visualizzare il tag del pool associato a ogni buffer allocato. Il valore di Tag viene in genere visualizzato in ordine inverso. Ad esempio, se un chiamante passa "Fred" come Tag, viene visualizzato come "derF" se il pool viene sottoposto a dump o quando si monitora l'utilizzo del pool nel debugger.
Il buffer allocato può essere liberato con exFreePool o ExFreePoolWithTag.
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), ExAllocatePoolWithQuotaTag tenta di allocare memoria locale al processore che sta chiamando ExAllocatePoolWithQuotaTag. Se non è disponibile alcuna memoria locale, ExAllocatePoolWithQuotaTag alloca la memoria disponibile più vicina.
La memoria che ExAllocatePoolWithQuotaTag alloca viene annullata. 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).
I chiamanti di ExAllocatePoolWithQuotaTag 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 pool.
Fabbisogno
Requisito | Valore |
---|---|
piattaforma di destinazione | Universale |
intestazione | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
libreria | NtosKrnl.lib |
dll | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL (vedere la sezione Osservazioni) |
regole di conformità DDI | HwStorPortProhibitedDDIs(storport), SpNoWait(storport), StorPortStartIo(storport), UnsafeAllocatePool(kmdf) |