ProbeForRead-Funktion (wdm.h)
Die ProbeForRead-Routine überprüft, ob sich ein Benutzermoduspuffer tatsächlich im Benutzerteil des Adressraums befindet und ordnungsgemäß ausgerichtet ist.
Syntax
void ProbeForRead(
[in] const volatile VOID *Address,
[in] SIZE_T Length,
[in] ULONG Alignment
);
Parameter
[in] Address
Gibt den Anfang des Benutzermoduspuffers an.
[in] Length
Gibt die Länge des Puffers im Benutzermodus in Bytes an.
[in] Alignment
Gibt die erforderliche Ausrichtung des Anfangs des Benutzermoduspuffers in Bytes an.
Rückgabewert
Keine
Bemerkungen
Wenn sich der angegebene Speicherbereich nicht innerhalb des Adressbereichs des Benutzermodus befindet, löst ProbeForRead die STATUS_ACCESS_VIOLATION Ausnahme aus. Wenn der Anfang des Adressbereichs nicht an der Bytegrenze ausgerichtet ist, die durch Ausrichtung angegeben wird, löst ProbeForRead die STATUS_DATATYPE_MISALIGNMENT Ausnahme aus.
Kernelmodustreiber müssen ProbeForRead verwenden, um den Lesezugriff auf Puffer zu überprüfen, die im Benutzerbereich zugeordnet sind. Es wird am häufigsten während METHOD_NEITHER E/A verwendet, um den Benutzerpuffer zu überprüfen, auf den von Irp -> UserBuffer verwiesen wird.
Treiber müssen ProbeForRead in einem try/except-Block aufrufen. Wenn die Routine eine Ausnahme auslöst, sollte der Treiber die IRP mit dem entsprechenden Fehler abschließen. Beachten Sie, dass nachfolgende Zugriffe des Treibers auf den Benutzermoduspuffer auch innerhalb eines try/except-Blocks gekapselt werden müssen: Bei einer schädlichen Anwendung kann ein anderer Thread jederzeit gelöscht, ersetzt oder den Schutz von Benutzeradressbereichen geändert werden (auch nach oder während eines Aufrufs von ProbeForRead oder ProbeForWrite). Weitere Informationen finden Sie unter Behandeln von Ausnahmen.
Verwenden Sie diese Routine nicht für Kernelmodusadressen. Es löst eine Ausnahme aus.
Wenn Irp-RequestorMode> = KernelMode, die Felder Irp-AssociatedIrp.SystemBuffer> und Irp-UserBuffer> keine Benutzermodusadressen enthalten, löst ein Aufruf von ProbeForRead zum Testen eines Puffers, auf den von beiden Felden verwiesen wird, eine Ausnahme aus.
Wenn Length = 0 ist, führt ProbeForRead keine Überprüfung der Adresse durch. In diesem Fall löst die Routine keine Ausnahme für eine Adresse aus, die falsch ausgerichtet ist oder sich außerhalb des Bereichs gültiger Benutzeradressen befindet.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Verfügbar ab Windows 2000. |
Zielplattform | Universell |
Header | wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h) |
Bibliothek | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= APC_LEVEL |
DDI-Complianceregeln | HwStorPortProhibitedDIs(storport), IrqlExApcLte2(wdm) |