Share via


Senden von E/A-Anforderungen an ein allgemeines E/A-Ziel in UMDF

Warnung

UMDF 2 ist die neueste Version von UMDF und ersetzt UMDF 1. Alle neuen UMDF-Treiber sollten mit UMDF 2 geschrieben werden. UMDF 1 werden keine neuen Features hinzugefügt, und die Unterstützung für UMDF 1 für neuere Versionen von Windows 10 ist eingeschränkt. Universelle Windows-Treiber müssen UMDF 2 verwenden.

Die archivierten UMDF 1-Beispiele finden Sie im Windows 11, Version 22H2 – Mai 2022 Treiberbeispiele Update.

Weitere Informationen finden Sie unter Erste Schritte mit UMDF.

Ein UMDF-Treiber kann E/A-Anforderungen entweder synchron oder asynchron an allgemeine E/A-Ziele senden.

Wenn ein Treiber E/A-Anforderungen synchron sendet, sendet ein Treiberthread die Anforderungen einzeln. Der Thread wartet, bis jede Anforderung abgeschlossen ist, bevor er die nächste sendet. Dieser Prozess ist einfacher als das asynchrone Senden der E/A-Anforderungen. Der Treiber kann E/A-Anforderungen synchron senden, wenn er nicht viele Anforderungen sendet und die System- oder Geräteleistung nicht verringert wird, während der Treiber auf jede E/A-Anforderung wartet.

Wenn ein Treiber E/A-Anforderungen asynchron sendet, sendet ein Treiberthread jede Anforderung, sobald die Anforderung zum Senden bereit ist, ohne darauf zu warten, dass zuvor gesendete Anforderungen abgeschlossen sind. Wenn der Treiber viele E/A-Anforderungen in kurzer Zeit verarbeiten muss, kann der Treiber wahrscheinlich nicht warten, bis jede Anforderung abgeschlossen ist, bevor er die nächste Anforderung sendet. Andernfalls kann der Treiber Daten verlieren oder die Leistung seiner Geräte und möglicherweise des gesamten Systems verringert werden.

Bevor ein UMDF-Treiber eine E/A-Anforderung an ein E/A-Ziel senden kann, muss der Treiber die Anforderung formatieren. In der folgenden Tabelle sind die Methoden aufgeführt, die der Treiber aufrufen kann, um E/A-Anforderungen zu formatieren. Der Treiber kann diese Methoden verwenden, um eine Anforderung zu formatieren, die der Treiber in einer seiner E/A-Warteschlangen empfangen hat oder die der Treiber erstellt hat.

Methode Zweck

IWDFIoRequest::FormatUsingCurrentType

Formatiert eine Anforderung, die der Treiber vom Framework empfangen hat, sodass der Treiber die Anforderung unverändert an das Ziel senden kann.

IWDFIoTarget::FormatRequestForIoctl

Formatieren einer Gerätesteuerungsanforderung

IWDFIoTarget::FormatRequestForRead

Formatieren einer Leseanforderung

IWDFIoTarget::FormatRequestForWrite

Formatieren einer Schreibanforderung

IWDFIoTarget2::FormatRequestForFlush

Formatiert eine Anforderung zum Leeren von Puffern.

IWDFIoTarget2::FormatRequestForQueryInformation

Formatiert eine Anforderung zum Abrufen von Dateiinformationen.

IWDFIoTarget2::FormatRequestForSetInformation

Formatiert eine Anforderung zum Festlegen von Dateiinformationen.

Um die E/A-Anforderung an das E/A-Ziel zu senden, ruft der Treiber die IWDFIoRequest::Send-Methode auf. Um die E/A-Anforderung synchron zu senden, übergibt der Treiber das flag WDF_REQUEST_SEND_OPTION_SYNCHRONOUS an den Flags-Parameter . Andernfalls sendet der Treiber die E/A-Anforderung asynchron. Wenn der Treiber die E/A-Anforderung asynchron sendet, erfordert der Treiber in der Regel eine Benachrichtigung, wenn ein anderer Treiber die Anforderung abschließt. Der Treiber sollte eine IRequestCallbackRequestCompletion::OnCompletion-Rückruffunktion definieren und durch Aufrufen der IWDFIoRequest::SetCompletionCallback-Methode registrieren. Weitere Informationen finden Sie unter Abschließen von E/A-Anforderungen.

Ein Treiber, der IWDFIoRequest::Send aufruft, um eine E/A-Anforderung zu senden, kann versuchen, die Anforderung später abzubrechen, indem er die IWDFIoRequest::CancelSentRequest-Methode aufruft . Wenn der Treiber eine E/A-Anforderung abbricht, die der Treiber vom Framework empfangen hat, muss der Treiber die Anforderung immer abschließen, indem er die IWDFIoRequest::Complete - oder IWDFIoRequest::CompleteWithInformation-Methode aufruft, wobei der CompletionStatus-Parameter auf STATUS_CANCELLED festgelegt ist. Wenn der Treiber das Anforderungsobjekt erstellt hat, ruft der Treiber IWDFObject::D eleteWdfObject auf, anstatt die Anforderung abzuschließen.