MmSecureVirtualMemory, fonction (ntddk.h)
Le MmSecureVirtualMemory routine sécurise une plage d’adresses mémoire de l’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 virtuelle à 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 modifiée en PAGE_NOACCESS ou PAGE_READONLY. Toutes les autres modifications de protection sont autorisées. |
PAGE_READONLY | La protection ne peut pas être modifiée en PAGE_NOACCESS. Toutes les autres modifications de protection sont autorisées. |
Valeur de retour
En cas de réussite, MmSecureVirtualMemory retourne une valeur de pointeur opaque que le pilote passe à la routine MmUnsecureVirtualMemory pour non sécurisé 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 mémoires 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 aboutir. Le pilote peut utiliser mmSecureVirtualMemory avec PAGE_READWRITE mode de sonde pour garantir que la mémoire tampon reste 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 MmSecureVirtualMemory avec PAGE_READONLY ne garantit pas que la mémoire tampon reste 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. Elle n'pas empêcher la modification de 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 lorsque le processus se termine.
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 que ce processus ne se termine.
En règle générale, les pilotes doivent référencer le processus lorsqu’ils sécurisent la mémoire, puis appellent ultérieurement KeStackAttachProcess pour basculer vers le contexte de ce processus avant d’appeler MmUnsecureVirtualMemory.
Pour détecter les pilotes de terminaison de processus, vous pouvez 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, elle ne protège pas contre d’autres types d’exceptions. Par exemple, elle ne protège pas contre les exceptions déclenché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.
Exigences
Exigence | Valeur |
---|---|
plateforme cible | Universel |
d’en-tête | ntddk.h (include Ntddk.h) |
bibliothèque | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <=APC_LEVEL |
règles de conformité DDI | HwStorPortProhibitedDDIs(storport), IrqlMmApcLte(wdm) |