Partager via


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)

Voir aussi

ProbeForWrite