Partager via


Fonction MmAllocatePagesForMdl (wdm.h)

La routine MmAllocatePagesForMdl alloue des pages mémoire physique non paginées, sans remplissage zéro à une MDL.

Syntaxe

PMDL MmAllocatePagesForMdl(
  [in] PHYSICAL_ADDRESS LowAddress,
  [in] PHYSICAL_ADDRESS HighAddress,
  [in] PHYSICAL_ADDRESS SkipBytes,
  [in] SIZE_T           TotalBytes
);

Paramètres

[in] LowAddress

Spécifie l’adresse physique du début de la première plage d’adresses à partir de laquelle les pages allouées peuvent provenir. Si MmAllocatePagesForMdl ne peut pas allouer le nombre d’octets demandé dans la première plage d’adresses, il effectue une itération au sein de plages d’adresses supplémentaires pour obtenir plus de pages. À chaque itération, MmAllocatePagesForMdl ajoute la valeur SkipBytes à l’adresse de début précédente pour obtenir le début de la plage d’adresses suivante.

[in] HighAddress

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

[in] SkipBytes

Spécifie le 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 la page de mémoire virtuelle, en octets.

[in] TotalBytes

Spécifie le nombre total d’octets à allouer pour la MDL.

Valeur retournée

MmAllocatePagesForMdl retourne l’une des valeurs suivantes :

Code de retour Description
Pointeur MDL Le pointeur MDL décrit un ensemble de pages physiques dans la plage d’adresses spécifiée. Si le nombre d’octets demandé n’est pas disponible, la MDL décrit la quantité de mémoire physique disponible.
NULL Il n’y a pas de pages de mémoire physique dans les plages d’adresses spécifiées, ou il n’y a pas suffisamment de pool de mémoire pour la MDL elle-même.

Remarques

Les pilotes qui s’exécutent dans Windows Server 2003 Service Pack 1 (SP1) et les versions ultérieures de Windows doivent utiliser la routine MmAllocatePagesForMdlEx au lieu de MmAllocatePagesForMdl. MmAllocatePagesForMdlEx offre de meilleures performances que MmAllocatePagesForMdl en évitant les vidages inutiles de la mémoire tampon de lookaside de traduction (TLB) et de la mémoire cache.

Les pages de mémoire physique retournées par MmAllocatePagesForMdl ne sont généralement pas des pages contiguës. MmAllocatePagesForMdl remplit toujours les pages allouées dans la MDL retournée avec des zéros.

MmAllocatePagesForMdl est conçu pour être utilisé par les pilotes en mode noyau qui n’ont pas besoin d’adresses virtuelles correspondantes (c’est-à-dire, ils ont besoin de pages physiques et n’ont pas besoin que les pages soient physiquement contiguës) ou par les pilotes en mode noyau qui peuvent obtenir des gains de performances substantiels si la mémoire physique d’un appareil est allouée dans une plage d’adresses physique spécifique. Un pilote pour un carte graphique AGP est un exemple de ce pilote.

Selon la quantité de mémoire physique actuellement disponible dans les plages demandées, MmAllocatePagesForMdl peut retourner une mdL qui décrit moins de mémoire que celle demandée. La routine retourne NULL si aucune mémoire n’a été allouée. L’appelant doit case activée la quantité de mémoire réellement allouée à la MDL.

L’appelant doit utiliser MmFreePagesFromMdl pour libérer les pages mémoire décrites par une MDL créée par MmAllocatePagesForMdl. Après avoir appelé MmFreePagesFromMdl, l’appelant doit également appeler ExFreePool pour libérer la mémoire allouée à la structure MDL elle-même.

Dans Windows 2000 et versions ultérieures de Windows, la quantité maximale de mémoire que MmAllocatePagesForMdl peut allouer en 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.

MmAllocatePagesForMdl s’exécute sur IRQL <= APC_LEVEL. Windows Server 2008 et versions ultérieures du système d’exploitation Windows permettent aux appelants MmAllocatePagesForMdl d’appeler à DISPATCH_LEVEL. Toutefois, vous pouvez améliorer les performances du pilote en appelant à APC_LEVEL ou en dessous.

L’appel de MmAllocatePagesForMdl à partir d’un appel de procédure asynchrone de noyau spécial (APC) peut entraîner une acquisition récursive d’un verrou exclusif, qui se trouve uniquement dans une région critique (API utilisateur ou noyau normal désactivée), mais pas dans une région protégée (toutes les API désactivées).

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 Consultez la section Notes.
Règles de conformité DDI HwStorPortProhibitedDDIs(storport), IrqlMmApcLte(wdm), SpNoWait(storport), StorPortStartIo(storport)

Voir aussi

ExFreePool

MmAllocatePagesForMdlEx

MmFreePagesFromMdl

MmMapLockedPages