ProbeForRead, fonction (wdm.h)
La routine ProbeForRead vérifie qu’une mémoire tampon en mode utilisateur réside réellement dans la partie utilisateur de l’espace d’adressage et est correctement alignée.
Syntaxe
void ProbeForRead(
[in] const volatile VOID *Address,
[in] SIZE_T Length,
[in] ULONG Alignment
);
Paramètres
[in] Address
Spécifie le début de la mémoire tampon en mode utilisateur.
[in] Length
Spécifie la longueur, en octets, de la mémoire tampon en mode utilisateur.
[in] Alignment
Spécifie l’alignement requis, en octets, du début de la mémoire tampon en mode utilisateur.
Valeur de retour
None
Remarques
Si la plage de mémoire spécifiée ne se trouve pas dans la plage d’adresses en mode utilisateur, ProbeForRead déclenche l’exception STATUS_ACCESS_VIOLATION. Si le début de la plage d’adresses n’est pas aligné sur la limite d’octets spécifiée par l’alignement, ProbeForRead déclenche l’exception STATUS_DATATYPE_MISALIGNMENT.
Les pilotes en mode noyau doivent utiliser ProbeForRead pour valider l’accès en lecture aux mémoires tampons allouées dans l’espace utilisateur. Il est le plus souvent utilisé pendant METHOD_NEITHER E/S pour valider la mémoire tampon utilisateur pointée par Irp -> UserBuffer.
Les pilotes doivent appeler ProbeForRead à l’intérieur d’un bloc try/except . Si la routine déclenche une exception, le pilote doit terminer l’IRP avec l’erreur appropriée. Notez que les accès ultérieurs du pilote à la mémoire tampon en mode utilisateur doivent également être encapsulés dans un bloc try/except : une application malveillante peut avoir un autre thread supprimant, remplaçant ou modifiant la protection des plages d’adresses utilisateur à tout moment (même après ou pendant un appel à ProbeForRead ou ProbeForWrite). Pour plus d’informations, consultez Gestion des exceptions.
N’utilisez pas cette routine sur les adresses en mode noyau ; elle lève une exception.
Si Irp-RequestorMode> = KernelMode, les champs Irp-AssociatedIrp.SystemBuffer> et Irp-UserBuffer> ne contiennent pas d’adresses en mode utilisateur, et un appel à ProbeForRead pour sonder une mémoire tampon pointée par l’un ou l’autre champ déclenche une exception.
Si Length = 0, ProbeForRead ne vérifie pas l’adresse. Dans ce cas, la routine ne déclenche pas d’exception pour une adresse mal alignée ou en dehors de la plage d’adresses utilisateur valides.
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Disponible à partir de Windows 2000. |
Plateforme cible | Universal |
En-tête | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
Bibliothèque | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= APC_LEVEL |
Règles de conformité DDI | HwStorPortProhibitedDDIs(storport), IrqlExApcLte2(wdm) |