Partager via


Fonction IoBuildPartialMdl (wdm.h)

La routine IoBuildPartialMdl génère une nouvelle liste de descripteurs de mémoire (MDL) qui représente une partie d’une mémoire tampon décrite par une MDL existante.

Syntaxe

void IoBuildPartialMdl(
  [in]      PMDL  SourceMdl,
  [in, out] PMDL  TargetMdl,
  [in]      PVOID VirtualAddress,
  [in]      ULONG Length
);

Paramètres

[in] SourceMdl

Pointeur vers une MDL qui décrit la mémoire tampon d’origine, dont une sous-plage doit être mappée.

[in, out] TargetMdl

Pointeur vers une MDL allouée par l’appelant. Cette MDL doit être suffisamment grande pour décrire les pages de la sous-plage spécifiées par VirtualAddress et Length.

[in] VirtualAddress

Pointeur vers l’adresse virtuelle de base pour la sous-plage à décrire par TargetMdl.

[in] Length

Spécifie la longueur, en octets, à mapper par TargetMdl. Cette valeur, en combinaison avec VirtualAddress, doit spécifier une mémoire tampon qui est une sous-plage appropriée de la mémoire tampon décrite par SourceMdl. Si Length est égal à zéro, la sous-plage à mapper commence à VirtualAddress et inclut la plage restante décrite par SourceMdl.

Valeur de retour

None

Remarques

Cette routine génère une MDL cible qui décrit une sous-plage de la mémoire tampon décrite par le MDL source. Cette sous-plage est spécifiée par les paramètres VirtualAddress et Length . Les paramètres SourceMdl et TargetMdl pointent vers le MDL source et le MDL cible.

Un pilote peut utiliser IoBuildPartialMdl pour fractionner une demande de transfert volumineuse en demandes de transfert plus petites. Les pages physiques décrites par la MDL source doivent être verrouillées avant que le pilote appelle IoBuildPartialMdl. En règle générale, la MDL source décrit une mémoire tampon dans l’espace d’adressage utilisateur, et le pilote appelle la routine MmProbeAndLockPages pour verrouiller les pages de cette mémoire tampon. Toutefois, le pilote peut générer la MDL source à partir de la mémoire non paginée en appelant la routine MmBuildMdlForNonPagedPool, MmAllocatePagesForMdlEx ou MmAllocatePagesForMdl .

Lors de la création d’une MDL partielle :

  • Si la MDL d’origine a déjà été mappée dans l’espace système, la MDL partielle partage ce mappage et il n’est pas nécessaire de la mapper à nouveau.
  • Si la MDL d’origine n’a pas été mappée dans l’espace système, la MDL partielle ne l’est pas non plus. Si vous avez besoin d’une adresse en mode système, appelez MmGetSystemAddressForMdlSafe sur la MDL partielle.
  • Si vous ne savez pas laquelle des opérations ci-dessus s’applique, il est prudent d’appeler MmGetSystemAddressForMdlSafe . Si une MDL partielle est générée à partir d’un MDL source déjà mappé dans l’espace d’adressage système, MmGetSystemAddressForMdlSafe utilise le mappage de source existant. Sinon, MmGetSystemAddressForMdlSafe crée un mappage.

Pour éviter la fuite de ce nouveau mappage, les pilotes doivent appeler MmPrepareMdlForReuse avant de réutiliser une MDL partielle. En outre, la routine IoFreeMdl libère le mappage d’espace d’adressage système pour une MDL partielle, si un tel mappage existe.

Pour plus d’informations sur les DLL, consultez Utilisation de MDL.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Disponible à partir de Windows 2000.
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
Règles de conformité DDI MdlAfterReqCompletedIntIoctlA(kmdf), MdlAfterReqCompletedIoctlA(kmdf), MdlAfterReqCompletedReadA(kmdf), MdlAfterReqCompletedWriteA(kmdf)

Voir aussi

IoFreeMdl

MmAllocatePagesForMdl

MmAllocatePagesForMdlEx

MmBuildMdlForNonPagedPool

MmGetSystemAddressForMdlSafe

MmPrepareMdlForReuse

MmProbeAndLockPages