Partager via


Fonction MmAdvanceMdl (wdm.h)

La routine MmAdvanceMdl avance le début de la plage de mémoire virtuelle d’un MDL par le nombre d’octets spécifié.

Syntaxe

NTSTATUS MmAdvanceMdl(
  [in, out] PMDL  Mdl,
  [in]      ULONG NumberOfBytes
);

Paramètres

[in, out] Mdl

Spécifie le MDL à avancer.

[in] NumberOfBytes

Spécifie le nombre d’octets permettant d’avancer le début du MDL.

Valeur retournée

MmAdvanceMdl retourne un code NTSTATUS. Les valeurs de retour possibles sont les suivantes :

Code de retour Description
STATUS_SUCCESS
La routine a réussi à avancer le début de la MDL.
STATUS_INVALID_PARAMETER_2
L’appelant a tenté d’avancer le début de la MDL au-delà de la fin.

Remarques

MmAdvanceMdl avance uniquement le début de la plage d’adresses de mémoire virtuelle. L’adresse de fin reste la même et la longueur de la plage est réduite en conséquence.

Un pilote de niveau supérieur peut utiliser MmAdvanceMdl dans des conditions de mémoire faible lorsqu’un pilote de niveau inférieur ne peut qu’exécuter partiellement une demande de lecture/écriture. Le pilote de niveau supérieur peut utiliser MmAdvanceMdl pour passer au-delà de la partie de la mémoire tampon qui a déjà été lue ou écrite, puis rééditer l’IRP pour terminer la demande. (Le pilote peut, bien sûr, répéter ce processus autant de fois que nécessaire.)

Si MmAdvanceMdl passe au-delà de la page initiale, toutes les pages passées par MmAdvanceMdl sont immédiatement déverrouillées et l’adresse virtuelle système qui mappe la MDL et l’adresse de l’utilisateur sont également ajustées.

L’utilisation de MmAdvanceMdl peut ralentir les performances du système. Il doit être utilisé uniquement lorsque toutes les conditions suivantes sont remplies :

  • Le pilote de niveau supérieur, dans sa propre gestion des E/S, ne peut effectuer certaines demandes d’E/S qu’après avoir transféré une quantité fixe de données, mais le pilote de niveau inférieur ne transfère que des données en plus petites quantités. (Par exemple, un pilote de transport réseau pour les protocoles SPX ou NBT. Chaque protocole prend en charge la transmission de messages fiable pour les messages qui sont plus volumineux qu’une trame Ethernet. Le pilote de transport ne peut effectuer une demande de lecture pour un tel message qu’une fois qu’il a réassembler le message à partir de plusieurs trames Ethernet.)
  • Le pilote de niveau supérieur a déjà essayé et n’a pas pu allouer une nouvelle MDL pour transférer un fragment de données à partir d’une demande d’E/S incomplète. (Si le pilote réussit à allouer une nouvelle MDL, il doit utiliser ce MDL et IoBuildPartialMdl pour effectuer la demande d’E/S au lieu de MmAdvanceMdl.)
  • Le pilote de niveau supérieur doit continuer à progresser, même dans des conditions de mémoire faible.
Les pilotes qui ne remplissent pas ces conditions doivent utiliser la routine IoBuildPartialMdl pour effectuer des opérations d’E/S partiellement réussies.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Disponible dans Windows XP et les versions ultérieures de Windows.
Plateforme cible Universal
En-tête wdm.h (inclure Wdm.h, Ntddk.h, Ntifs.h)
Bibliothèque NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <=DISPATCH_LEVEL

Voir aussi

IoBuildPartialMdl