Partager via


MmAllocateNodePagesForMdlEx, fonction (wdm.h)

La routine MmAllocateNodePagesForMdlEx alloue de la mémoire physique non paginée à partir d’un nœud idéal et alloue une structureMDLpour décrire cette mémoire.

Syntaxe

PMDL MmAllocateNodePagesForMdlEx(
  [in] PHYSICAL_ADDRESS    LowAddress,
  [in] PHYSICAL_ADDRESS    HighAddress,
  [in] PHYSICAL_ADDRESS    SkipBytes,
  [in] SIZE_T              TotalBytes,
  [in] MEMORY_CACHING_TYPE CacheType,
  [in] ULONG               IdealNode,
  [in] ULONG               Flags
);

Paramètres

[in] LowAddress

Adresse physique du début de la première plage d’adresses à partir de laquelle les pages allouées peuvent venir. Si MmAllocateNodePagesForMdlEx ne peut pas allouer le nombre demandé d’octets dans la première plage d’adresses, la routine itère via des plages d’adresses supplémentaires pour obtenir plus de pages. À chaque itération, MmAllocateNodePagesForMdlEx ajoute la valeur de SkipBytes à l’adresse de début précédente pour calculer le début de la plage d’adresses suivante.

[in] HighAddress

Adresse physique de la fin de la première plage d’adresses à partir de laquelle les pages allouées peuvent provenir.

[in] SkipBytes

Nombre d’octets à ignorer à partir du début de la plage d’adresses précédente à partir de laquelle les pages allouées peuvent provenir. SkipBytes doit être un multiple entier de la taille de page de mémoire virtuelle, en octets.

[in] TotalBytes

Nombre total d’octets à allouer pour le MDL.

[in] CacheType

Valeur MEMORY_CACHING_TYPE, qui indique le type de mise en cache autorisée pour la mémoire demandée.

[in] IdealNode

Numéro de nœud idéal. Si un système multiprocesseur contient N nœuds, les numéros de nœud valides sont compris entre 0 et N-1. Votre pilote peut appeler la routine KeQueryHighestNodeNumber pour obtenir le numéro de nœud le plus élevé. Un système multiprocesseur monoprocesseur ou non NUMA n’a qu’un seul nœud, nœud 0, à partir duquel allouer de la mémoire. Pour un système multiprocesseur NUMA, l’allocation est effectuée à partir du nœud idéal, si possible. Si la mémoire insuffisante est disponible dans le nœud idéal pour satisfaire la demande d’allocation et que l’appelant ne définit pas l’indicateur de MM_ALLOCATE_FROM_LOCAL_NODE_ONLY, MmAllocateNodePagesForMdlEx essaie d’allouer de la mémoire à partir d’autres nœuds.

[in] Flags

Indicateurs pour cette opération. Définissez ce paramètre sur zéro ou sur l’or au niveau du bit d’un ou plusieurs des bits d’indicateur suivants :

  • MM_DONT_ZERO_ALLOCATION

  • MM_ALLOCATE_FROM_LOCAL_NODE_ONLY

  • MM_ALLOCATE_FULLY_REQUIRED

  • MM_ALLOCATE_NO_WAIT

  • MM_ALLOCATE_PREFER_CONTIGUOUS

  • MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS

  • MM_ALLOCATE_AND_HOT_REMOVE

Pour plus d’informations sur ces indicateurs, consultez MM_ALLOCATE_XXX.

Valeur de retour

MmAllocateNodePagesForMdlEx retourne un pointeur vers une structure MDL si elle réussit. Sinon, si la routine ne parvient pas à allouer de mémoire, la routine retourne NULL.

Une valeur de retour de NULL indique qu’aucune page de mémoire physique n’est disponible dans les plages d’adresses spécifiées ou qu’il n’existe pas suffisamment de pool de mémoires pour allouer la structure MDL.

Si la routine alloue correctement une partie, mais pas toutes, de la mémoire demandée, le MDL décrit autant de mémoire physique que la routine a pu allouer.

Remarques

Dans un système multiprocesseur d’accès à la mémoire non uniforme (NUMA), l’appelant peut spécifier un nœud idéal à partir duquel allouer la mémoire. Un nœud est une collection de processeurs qui partagent un accès rapide à une région de mémoire. Dans un multiprocesseur non NUMA ou un système à processeur unique, MmAllocateNodePagesForMdlEx traite toutes les mémoires comme appartenant à un seul nœud et alloue de la mémoire à partir de ce nœud.

Par défaut, les pages de mémoire physique qui MmAllocateNodePagesForMdlEx retournent pas de pages contiguës. Les appelants peuvent remplacer le comportement par défaut de cette routine en définissant le bit d’indicateur MM_ALLOCATE_PREFER_CONTIGUOUS ou MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS dans le paramètre indicateurs de.

MmAllocateNodePagesForMdlEx ne mappe pas la mémoire physique allouée en mémoire virtuelle. Si nécessaire, l’appelant peut appeler une routine telle que MmMapLockedPagesSpecifyCache pour mapper les pages de mémoire physique décrites par le MDL.

MmAllocateNodePagesForMdlEx est conçu pour les pilotes en mode noyau qui n’ont pas besoin d’adresses virtuelles correspondantes (autrement dit, ils ont besoin de pages physiques et ne doivent pas être contiguës physiquement), et pour les pilotes en mode noyau qui peuvent obtenir des gains de performances considérables si la mémoire physique d’un appareil est allouée dans une plage d’adresses physique spécifique (par exemple, une carte graphique AGP).

Selon la quantité de mémoire physique actuellement disponible dans les plages demandées, MmAllocateNodePagesForMdlEx peut retourner un MDL qui décrit moins de mémoire que ce qui a été demandé. La routine peut également retourner NULL si aucune mémoire n’a été allouée. L’appelant doit vérifier la quantité de mémoire réellement allouée, comme décrit par le MDL.

L’appelant doit utiliser MmFreePagesFromMdl pour libérer les pages de mémoire décrites par un MDL créé par MmAllocateNodePagesForMdlEx. Après avoir appelé MmFreePagesFromMdl, l’appelant doit également appeler ExFreePool pour libérer la mémoire allouée pour la structure MDL.

Par défaut, MmAllocateNodePagesForMdlEx remplit les pages qu’il alloue avec zéros. L’appelant peut spécifier l’indicateur de MM_DONT_ZERO_ALLOCATION pour remplacer cette valeur par défaut et améliorer éventuellement les performances.

Mémoire qui MmAllocateNodePagesForMdlEx alloue est non initialisée si vous spécifiez l’indicateur MM_DONT_ZERO_ALLOCATION. Un pilote en mode noyau doit d’abord zéro cette mémoire si le pilote va rendre la mémoire visible par les logiciels en mode utilisateur (pour éviter la fuite de contenu potentiellement privilégié). Pour plus d’informations sur cet indicateur, consultez MM_ALLOCATE_XXX.

La quantité maximale de mémoire que MmAllocateNodePagesForMdlEx peut allouer dans un seul appel est (4 gigaoctets - PAGE_SIZE). La routine peut satisfaire une demande d’allocation pour ce montant uniquement si suffisamment de pages sont disponibles.

MmAllocateNodePagesForMdlEx s’exécute à IRQL <= APC_LEVEL. Si nécessaire, votre pilote peut appeler MmAllocateNodePagesForMdlEx à DISPATCH_LEVEL. Toutefois, vous pouvez améliorer les performances du pilote en appelant à APC_LEVEL ou en dessous.

Exigences

Exigence Valeur
client minimum pris en charge Disponible à partir de Windows 8.
plateforme cible Universel
d’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 Remarques.)

Voir aussi

ExFreePool

KeQueryHighestNodeNumber

MDL

MEMORY_CACHING_TYPE

MM_ALLOCATE_XXX

MmFreePagesFromMdl

mmMapLockedPagesSpecifyCache