Freigeben über


ProbeForWrite-Funktion (wdm.h)

Warnung

Die Funktion ProbeForWrite wird für die Verwendung in aktueller Software nicht empfohlen und ist nur aus Gründen der Verlaufskompatibilität enthalten. Verwenden Sie stattdessen ProbeForRead beim Überprüfen von Benutzerpuffern. Weitere Informationen finden Sie unter Hinweise.

Die ProbeForWrite-Routine überprüft, ob sich ein Benutzermoduspuffer tatsächlich im Benutzermodusteil des Adressraums befindet, beschreibbar ist und ordnungsgemäß ausgerichtet ist.

Syntax

void ProbeForWrite(
  [in, out] volatile VOID *Address,
  [in]      SIZE_T        Length,
  [in]      ULONG         Alignment
);

Parameter

[in, out] Address

Gibt den Anfang des Benutzermoduspuffers an.

[in] Length

Gibt die Länge des Puffers im Benutzermodus in Bytes an. Weitere Informationen finden Sie im Abschnitt Hinweise.

[in] Alignment

Gibt die erforderliche Ausrichtung des Anfangs des Benutzermoduspuffers in Bytes an.

Rückgabewert

Keine

Bemerkungen

Diese Funktion bietet in der Regel keinen wesentlichen Vorteil gegenüber ProbeForRead , da ein robuster Treiber immer bereit sein muss, Schutzänderungen im virtuellen Adressraum des Benutzermodus zu verarbeiten, einschließlich Schutzänderungen, die die Schreibberechtigung für einen Puffer entfernen, der an einen Treiber übergeben wird, nachdem ein ProbeForWrite-Aufruf ausgeführt wurde. Da ProbeForWrite auf jede Seite im bereitgestellten Puffer zugreift, kann die Leistung aufgrund des Mehraufwands für den Zugriff auf jede Seite beeinträchtigt werden, insbesondere, wenn der bereitgestellte Puffer eine große Region des virtuellen Adressraums beschreibt. Da ProbeForWrite auf jede Seite schreibt, kann derselbe Puffer möglicherweise nicht sicher mit mehreren gleichzeitigen Treiberanforderungen verwendet werden. Aus diesen Gründen sollte neuer Treibercode stattdessen immer ProbeForRead verwenden.

In der folgenden Tabelle sind die Eigenschaften der einzelnen Kernelmoduspuffer-Testroutinen aufgeführt:

Verhalten ProbeForRead ProbeForWrite
Bestätigt, dass der Puffer eine Region im Adressraum des Benutzermodus beschreibt, wenn die Länge ungleich 0 ist x x
Bestätigt, dass Pufferbasisadresse und -länge nicht über den maximalen Zeigerwert umschließen x x
Bestätigt, dass der Puffer an der angeforderten Ausrichtungsgrenze ausgerichtet ist, wenn die Länge ungleich 0 ist x x
Bestätigt, dass der Puffer zunächst beschreibbar ist (kann sich jederzeit ändern, wenn die Benutzermodusanwendung ihren Adressraum erneut schützt) x
Greift auf jede Seite im Puffer zu (zusätzlicher Mehraufwand) x
Ändert jede Seite im Puffer (kann zu unerwartetem Verhalten führen, wenn derselbe Puffer parallel zu mehreren Treiberanforderungen verwendet wird) x

In der Vergangenheit gab es auf bestimmten Prozessoren, die schreibgeschützte Berechtigungen für Kernelmoduscode nicht berücksichtigten, bedeutende funktionale Unterschiede zwischen ProbeForWrite und ProbeForRead. In diesen Fällen hat sich das Betriebssystem zuvor darauf verlassen, dass ProbeForWrite eine explizite Paging-Schreibbarkeitsprüfung durchführte. Diese Unterscheidung ist für Prozessoren, die von Windows NT 4.0 oder höher unterstützt werden, nicht mehr sinnvoll.

Legacy-Hinweise

Kernelmodustreiber können ProbeForWrite verwenden, um den Schreibzugriff auf Puffer zu überprüfen, die im Benutzerbereich zugeordnet sind. Er wird am häufigsten während METHOD_NEITHER E/A verwendet, um den Benutzerpuffer zu überprüfen, auf den Irp-UserBuffer> verweist.

Wenn der angegebene Speicherbereich kein gültiger Adressbereich für den Benutzermodus ist oder nicht beschreibbar ist (kein Zugriff, schreibgeschützt usw.), löst ProbeForWrite die STATUS_ACCESS_VIOLATION Ausnahme aus. Wenn der Anfang des Adressbereichs nicht an der Bytegrenze ausgerichtet ist, die durch Ausrichtung angegeben wird, löst ProbeForWrite die STATUS_DATATYPE_MISALIGNMENT Ausnahme aus.

Treiber müssen ProbeForWrite 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 ProbeForWrite zum Testen eines Puffers, auf den von beiden Felden verwiesen wird, eine Ausnahme aus.

Wenn Length = 0 ist, führt ProbeForWrite 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)

Weitere Informationen

ProbeForRead