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 :
- 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.
- La routine confirme ensuite que les pages autorisent l’opération spécifiée par le paramètre Operation .
- 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.
- 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.
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) |