Partager via


Fonction MmProbeAndLockPages (wdm.h)

La routine MmProbeAndLockPages sonde les pages de mémoire virtuelle spécifiées, les rend résidentes et les verrouille en mémoire (par exemple pour un transfert DMA). Cela garantit que les pages ne peuvent pas être libérées et réaffectées pendant qu’un pilote de périphérique (ou du matériel) les utilise toujours.

Syntaxe

void MmProbeAndLockPages(
  [in, out] PMDL            MemoryDescriptorList,
  [in]      KPROCESSOR_MODE AccessMode,
  [in]      LOCK_OPERATION  Operation
);

Paramètres

[in, out] MemoryDescriptorList

Pointeur vers un MDL qui spécifie une mémoire tampon virtuelle. Si la routine verrouille correctement les pages en mémoire, le MDL est mis à jour pour décrire les pages physiques sous-jacentes.

[in] AccessMode

Mode d’accès dans lequel sonder les arguments, KernelMode ou UserMode.

[in] Operation

Type d’opération pour lequel l’appelant souhaite que les droits d’accès soient sondés et que les pages soient verrouillées. Définissez ce paramètre sur IoReadAccess, IoWriteAccess ou IoModifyAccess. IoReadAccess indique que le pilote peut examiner le contenu de la mémoire tampon, mais ne peut pas modifier le contenu. IoWriteAccess et IoModifyAccess, qui sont équivalents, indiquent que le pilote dispose à la fois d’un accès en lecture et en écriture à la mémoire tampon.

Valeur de retour

None

Remarques

Le pilote de niveau le plus élevé d’une chaîne de pilotes en couches qui utilisent des E/S directes appelle cette routine. Les pilotes qui utilisent des E/S mises en mémoire tampon n’appellent jamais MmProbeAndLockPages.

MmProbeAndLockPages effectue les opérations suivantes :

  1. Si la plage de mémoire spécifiée est paginée sur un magasin de stockage (disque, réseau, etc.), MmProbeAndLockPages la rend résidente.
  2. La routine confirme ensuite que les pages autorisent l’opération spécifiée par le paramètre Operation .
  3. Si la plage de mémoire autorise l’opération spécifiée, la routine verrouille les pages en mémoire afin qu’elles ne puissent pas être paginées. Utilisez la routine MmUnlockPages pour déverrouiller les pages.
  4. Enfin, la routine met à jour le tableau de numéros de trame de page (PFN) dans le MDL pour décrire les pages physiques verrouillées.
Un appel réussi à MmProbeAndLockPages verrouille les pages dans un MDL et définit la structure MDL à l’état verrouillé. Chaque appel de ce type doit être mis en correspondance par un appel correspondant à MmUnlockPages qui déverrouille les pages et définit le MDL à l’état déverrouillé. Une fois qu’un appel MmProbeAndLockPages définit une MDL à l’état verrouillé, un deuxième appel à MmProbeAndLockPages pour verrouiller le même MDL n’est pas autorisé tant que MmUnlockPages n’est pas appelé pour la première fois pour déverrouiller le MDL.

Si au moins deux dll MDL décrivent la même page physique, la page peut être verrouillée plusieurs fois, une fois pour chaque MDL. La page est déverrouillée lorsque la dernière MDL est définie sur l’état déverrouillé.

Une routine telle que MmBuildMdlForNonPagedPool ou IoBuildPartialMdl met à jour un MDL pour décrire les pages qui sont non paginables ou déjà verrouillées. Un appel à MmProbeAndLockPages ou MmUnlockPages pour verrouiller ou déverrouiller une telle MDL n’est pas autorisé.

Les appels à MmProbeAndLockPages doivent être placés dans un bloc try/except . Si les pages ne prennent pas en charge l’opération spécifiée, la routine déclenche le STATUS_ACCESS_VIOLATION ou d’autres exceptions. Pour plus d’informations, consultez Gestion des exceptions.

Les appelants de MmProbeAndLockPages doivent s’exécuter sur IRQL <= APC_LEVEL pour les adresses paginables, ou sur IRQL <= DISPATCH_LEVEL pour les adresses non paginables.

Cette routine ne fournit aucune garantie concernant l’adresse virtuelle qui décrit ces pages (autrement dit, l’adresse virtuelle peut être démaquée, réutilisée, etc.). Toutefois, il est garanti que les pages physiques soient verrouillées en cas de retour réussi.

Pour éviter les erreurs de page, utilisez VirtualLock pour verrouiller l’adresse virtuelle afin qu’elle ne soit pas supprimée, sauf si l’application la déverrouille ou la libère explicitement en appelant VirtualFree ou UnmapViewOfFile.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Disponible à partir de Windows 2000.
Plateforme cible Universal
En-tête wdm.h (inclure 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)

Voir aussi

IoBuildPartialMdl

MmBuildMdlForNonPagedPool

MmUnlockPages