Fonction ExAllocatePoolWithQuotaTag (wdm.h)
La routine ExAllocatePoolWithQuotaTag alloue de la mémoire du pool, en facturant le quota par rapport au processus actuel.
Avertissement
ExAllocatePoolWithQuotaTag a été déprécié dans Windows 10 version 2004 et a été remplacé par ExAllocatePool2. Pour plus d’informations, consultez Mise à jour des appels ExAllocatePool déconseillés vers ExAllocatePool2 et ExAllocatePool3.
Syntaxe
PVOID ExAllocatePoolWithQuotaTag(
[in] __drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType,
[in] SIZE_T NumberOfBytes,
[in] ULONG Tag
);
Paramètres
[in] PoolType
Spécifie le type de mémoire du pool à allouer. Pour obtenir une description des types de mémoire de pool disponibles, consultez POOL_TYPE.
Vous pouvez modifier la valeur PoolType en oRing cette valeur au niveau du bit avec l’indicateur POOL_QUOTA_FAIL_INSTEAD_OF_RAISE. Cet indicateur amène la routine à retourner une valeur NULL si la demande ne peut pas être satisfaite.
De même, vous pouvez modifier la valeur PoolType en oRing cette valeur au niveau du bit avec l’indicateur POOL_COLD_ALLOCATION comme indicateur au noyau pour allouer la mémoire des pages susceptibles d’être paginées rapidement. Pour réduire autant que possible la quantité de mémoire du pool résident, vous ne devez pas référencer ces allocations fréquemment. L’indicateur POOL_COLD_ALLOCATION est uniquement consultatif et est pris en charge dans Windows XP et les versions ultérieures du système d’exploitation Windows.
[in] NumberOfBytes
Spécifie le nombre d'octets à allouer.
[in] Tag
Spécifie la balise de pool pour la mémoire allouée. Pour plus d’informations, consultez le paramètre Tag de ExAllocatePoolWithTag.
Valeur retournée
ExAllocatePoolWithQuotaTag retourne un pointeur vers le pool alloué.
Si la demande ne peut pas être satisfaite, ExAllocatePoolWithQuotaTag lève une exception, sauf si POOL_QUOTA_FAIL_INSTEAD_OF_RAISE est spécifié. L’utilisation de POOL_QUOTA_FAIL_INSTEAD_OF_RAISE est préférable pour des raisons de performances.
Remarques
Cette routine est appelée par les pilotes de niveau supérieur qui allouent de la mémoire pour satisfaire une demande dans le contexte du processus qui a initialement effectué la demande d’E/S. Les pilotes de niveau inférieur appellent à la place ExAllocatePoolWithTag .
Si NumberOfBytes est PAGE_SIZE ou supérieur, une mémoire tampon alignée sur la page est allouée. Les allocations de mémoire de PAGE_SIZE ou moins sont allouées au sein d’une page et ne dépassent pas les limites de la page. Les allocations de mémoire inférieures à PAGE_SIZE ne sont pas nécessairement alignées sur les pages, mais sont alignées sur les limites de 8 octets dans les systèmes 32 bits et sur les limites de 16 octets dans les systèmes 64 bits.
Le système associe la balise de pool à la mémoire allouée. Les outils de programmation, tels que WinDbg, peuvent afficher la balise de pool associée à chaque mémoire tampon allouée. La valeur de Balise est normalement affichée dans l’ordre inverse. Par exemple, si un appelant passe « Fred » en tant que balise, il apparaît sous la forme « derF » si le pool est vidé ou lors du suivi de l’utilisation du pool dans le débogueur.
La mémoire tampon allouée peut être libérée avec ExFreePool ou ExFreePoolWithTag.
Ne définissez pas NumberOfBytes = 0. Évitez les allocations de longueur nulle, car elles gaspillent l’espace d’en-tête du pool et, dans de nombreux cas, indiquent un problème de validation potentiel dans le code appelant. Pour cette raison, driver Verifier signale ces allocations comme erreurs possibles.
Le système définit automatiquement certains objets d’événement standard lorsque la quantité de pool (paginée ou non paginée) est élevée ou faible. Les pilotes peuvent attendre que ces événements ajustent l’utilisation de leur pool. Pour plus d’informations, consultez Objets d’événements standard.
Dans une architecture multiprocesseur d’accès mémoire non uniforme (NUMA), ExAllocatePoolWithQuotaTag tente d’allouer de la mémoire locale au processeur qui appelle ExAllocatePoolWithQuotaTag. Si aucune mémoire locale n’est disponible, ExAllocatePoolWithQuotaTag alloue la mémoire disponible la plus proche.
La mémoire allouée par ExAllocatePoolWithQuotaTag est non initialisée. Un pilote en mode noyau doit d’abord zéro cette mémoire s’il veut la rendre visible pour les logiciels en mode utilisateur (afin d’éviter la fuite de contenu potentiellement privilégié).
Les appelants d’ExAllocatePoolWithQuotaTag doivent s’exécuter sur IRQL <= DISPATCH_LEVEL. Un appelant qui s’exécute à DISPATCH_LEVEL doit spécifier une valeur Xxxnon paginé pour PoolType. Un appelant qui s’exécute sur IRQL <= APC_LEVEL peut spécifier n’importe quelle valeur POOL_TYPE, mais l’irQL et l’environnement doivent également être pris en compte pour déterminer le type de pool.
Configuration requise
Condition requise | Valeur |
---|---|
Plateforme cible | Universal |
En-tête | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
Bibliothèque | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL (voir la section Notes) |
Règles de conformité DDI | HwStorPortProhibitedDDIs(storport), SpNoWait(storport), StorPortStartIo(storport), UnsafeAllocatePool(kmdf) |