Fonction MmSecureVirtualMemory (ntddk.h)
La routine MmSecureVirtualMemory sécurise une plage d’adresses mémoire d’espace utilisateur afin qu’elle ne puisse pas être libérée et que sa protection de page ne puisse pas être rendue plus restrictive.
Syntaxe
HANDLE MmSecureVirtualMemory(
[in] PVOID Address,
[in] SIZE_T Size,
[in] ULONG ProbeMode
);
Paramètres
[in] Address
Début de la plage d’adresses virtuelles de l’utilisateur à sécuriser.
[in] Size
Taille, en octets, de la plage d’adresses virtuelles à sécuriser.
[in] ProbeMode
Spécifie la protection de page la plus restrictive autorisée. Utilisez PAGE_READWRITE pour spécifier que la plage d’adresses doit rester lisible et accessible en écriture, ou utilisez PAGE_READONLY pour spécifier que la plage d’adresses doit uniquement rester lisible.
ProbeMode | Signification |
---|---|
PAGE_READWRITE | La protection ne peut pas être remplacée par PAGE_NOACCESS ou PAGE_READONLY. Toutes les autres modifications de protection sont autorisées. |
PAGE_READONLY | La protection ne peut pas être remplacée par PAGE_NOACCESS. Toutes les autres modifications de protection sont autorisées. |
Valeur retournée
En cas de réussite, MmSecureVirtualMemory retourne une valeur de pointeur opaque que le pilote transmet à la routine MmUnsecureVirtualMemory pour annuler la sécurité de la plage d’adresses mémoire. Si la routine ne parvient pas à sécuriser la plage d’adresses mémoire, elle retourne NULL.
Remarques
MmSecureVirtualMemory peut être utilisé pour éviter certaines conditions de concurrence sur les tampons en mode utilisateur. Par exemple, si un pilote vérifie si la mémoire tampon est accessible en écriture, mais que le processus en mode utilisateur d’origine modifie la mémoire tampon en lecture seule avant que le pilote puisse écrire dans la mémoire tampon, une condition de concurrence peut en résulter. Le pilote peut utiliser MmSecureVirtualMemory avec PAGE_READWRITE mode sonde pour garantir que la mémoire tampon restera accessible en écriture jusqu’à ce que le pilote appelle MmUnsecureVirtualMemory. La routine protège également contre le processus en mode utilisateur d’origine qui libère la mémoire tampon. Voici quelques instructions sur l’appel de ces routines :
L’appel de MmSecureVirtualMemory avec PAGE_READONLY ne garantit pas que la mémoire tampon restera en lecture seule. Le mode de sonde en lecture seule empêche l’utilisateur de modifier la protection de la mémoire tampon en PAGE_NOACCESS. Cela n’empêche pas de modifier la protection en PAGE_READWRITE (ou PAGE_WRITECOPY, pour les vues mappées).
Si un pilote appelle MmSecureVirtualMemory et n’appelle pas MmUnsecureVirtualMemory, la mémoire est automatiquement non sécurisée à l’arrêt du processus.
Si le pilote appelle MmUnsecureVirtualMemory, il doit l’appeler dans le contexte du processus dans lequel la mémoire a été initialement sécurisée, et avant la fin de ce processus.
En règle générale, les pilotes doivent référencer le processus lorsqu’ils sécurisent la mémoire, puis appeler plus tard KeStackAttachProcess pour basculer vers le contexte de ce processus avant d’appeler MmUnsecureVirtualMemory.
Pour détecter les pilotes d’arrêt de processus peuvent utiliser PsSetCreateProcessNotifyRoutine. Le processus peut également envoyer un IRP avec une routine d’annulation appelée par le gestionnaire d’E/S lorsque le processus se termine. Dans la routine d’annulation, le pilote peut attacher au processus et appeler MmUnsecureVirtualMemory.
Bien que MmSecureVirtualMemory puisse être utilisé pour garantir que la lecture ou l’écriture de la mémoire utilisateur ne déclenche pas d’exception en raison d’autorisations de page insuffisantes, il ne protège pas contre d’autres types d’exceptions. Par exemple, il ne protège pas contre les exceptions levées lorsque le système trouve un bloc de disque incorrect dans le fichier de page. Par conséquent, les pilotes doivent toujours encapsuler tous les accès à la mémoire utilisateur dans un bloc try/except . Pour cette raison, nous recommandons que les pilotes n’utilisent pas cette fonction. Pour plus d’informations, consultez Gestion des exceptions.
Configuration requise
Condition requise | Valeur |
---|---|
Plateforme cible | Universal |
En-tête | ntddk.h (incluez Ntddk.h) |
Bibliothèque | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <=APC_LEVEL |
Règles de conformité DDI | HwStorPortProhibitedDDIs(storport), IrqlMmApcLte(wdm) |