Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le 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 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 de mémoire 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 les pages verrouillées. Définissez ce paramètre sur IoReadAccess, l'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, ce qui est équivalent, indiquent que le pilote dispose à la fois d’un accès en lecture et en écriture à la mémoire tampon.
Valeur de retour
Aucun
Remarques
Le pilote de niveau le plus élevé dans 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 dans un magasin de stockage (disque, réseau, et ainsi de suite), 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éro de cadre de page (PFN) dans le MDL pour décrire les pages physiques verrouillées.
Si deux MDL ou plus 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 le dernier MDL est défini sur l’état déverrouillé.
Une routine telle que MmBuildMdlForNonPagedPool ou IoBuildPartialMdl met à jour un MDL pour décrire les pages non modifiables ou déjà verrouillées. Un appel à MmProbeAndLockPages ou MmUnlockPages pour verrouiller ou déverrouiller un tel 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 la STATUS_ACCESS_VIOLATION ou d’autres exceptions. Pour plus d’informations, consultez Gestion des exceptions.
Les appelants de mmProbeAndLockPages doivent s’exécuter à IRQL <= APC_LEVEL pour les adresses paginables, ou à IRQL <= DISPATCH_LEVEL pour les adresses non paginables.
Cette routine ne fournit aucune garantie sur l’adresse virtuelle qui décrit ces pages (autrement dit, l’adresse virtuelle peut être non mappée, réutilisée, etc.). Toutefois, les pages physiques sont garanties d’être verrouillées lors du 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.