Erstellen und Verwenden von Driver-Created Dateiobjekten

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 in neueren Versionen von Windows 10 ist eingeschränkt. Universelle Windows-Treiber müssen UMDF 2 verwenden.

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

Weitere Informationen finden Sie unter Erste Schritte mit UMDF.

Wenn Ihr Treiber eine E/A-Anforderung erstellen und senden muss, die von der Anwendung unabhängig ist, an den nächsten Treiber im Stapel (das Standard-E/A-Ziel), muss der Treiber seine eigenen Dateiobjekte erstellen und schließen.

Erstellen eines Dateiobjekts

Ihr Treiber muss die IWDFDevice::CreateWdfFile-Methode aufrufen, um ein Dateiobjekt für die Verwendung des Treibers zu erstellen. Wenn der Treiber IWDFDevice::CreateWdfFile aufruft, sendet das Framework eine Erstellungsanforderung an den nächsten Treiber im Stapel. Der nächste Treiber im Stapel kann sich im Kernelmodus oder im Benutzermodus befinden.

Diese Verarbeitung von Anforderungserstellungsdateien unterscheidet sich im Windows-Treibermodell (WDM). In WDM bewirkt ein Aufruf der ZwCreateFile-Funktion , dass ein Create-IRP an den Anfang des Kernelmodusstapels wechselt. Die folgende Abbildung zeigt die Verarbeitung von Create-File-Anforderungen in UMDF im Vergleich zu WDM:

Verarbeitung von create-file-Anforderungen in umdf im Vergleich zu wdm.

Durch Aufrufen von IWDFDevice::CreateWdfFile kann der Treiber ein Dateiobjekt erstellen und dann während des Gerätestarts E/A-Anforderungen senden, bevor der gesamte Stapel gestartet wurde.

Der nächste Treiber im Stapel muss bestimmen, ob er die Anforderung zum Erstellen einer Datei verarbeiten kann oder ob er die Anforderung weiter unten im Stapel weiterleiten muss.

Nach dem Aufrufen von IWDFDevice::CreateWdfFile kann ein Treiber den Erstellungsvorgang nicht abbrechen.

Verwenden des File-Objekts

Um eine asynchrone Leseanforderung an den nächsten Treiber zu senden, der darunter gestapelt ist, kann Ihr Treiber das folgende Muster verwenden.

  1. Rufen Sie IWDFDevice::CreateWdfFile auf, um das Dateiobjekt zu erstellen.
  2. Rufen Sie IWDFDevice::GetDefaultIoTarget auf, um die Schnittstelle abzurufen, die den Treiber auf niedrigerer Ebene darstellt.
  3. Rufen Sie IWDFDevice::CreateRequest auf, um ein unformatiertes IWDFIoRequest-Objekt zu erstellen.
  4. Rufen Sie IWDFIoRequest::SetCompletionCallback auf, um eine IRequestCallbackRequestCompletion-Schnittstelle für die OnCompletion-Methode zu registrieren, die das Framework aufruft, wenn eine E/A-Anforderung abgeschlossen wird.
  5. Rufen Sie IWDFIoTarget::FormatRequestForRead auf, und geben Sie einen Zeiger auf die IWDFDriverCreatedFile-Schnittstelle im pFile-Parameter an.
  6. Rufen Sie IWDFIoRequest::Send auf, um die Anforderung zu senden.

Schließen des File-Objekts

Der Treiber, der IWDFDevice::CreateWdfFile aufgerufen hat , muss später IWDFDriverCreatedFile::Close aufrufen.

In der Regel ruft Ihr Treiber IWDFDriverCreatedFile::Close entweder über seine IPnpCallbackHardware::OnReleaseHardware oder IPnpCallbackSelfManagedIo::OnSelfManagedIoCleanup-Rückrufmethode auf.

Wenn der Treiber IWDFDriverCreatedFile::Close aufruft, ruft das Framework die IFileCallbackCleanup::OnCleanupFile-Methode des nächsten Treibers auf. Bei dieser Methode muss der nächste Treiber alle ausstehenden E/A-Anforderungen abbrechen oder abschließen, die dem Dateiobjekt zugeordnet sind. Das Framework bricht dann alle E/A-Anforderungen ab, die vom Treiber erstellt wurden, der IWDFDevice::CreateWdfFile aufgerufen hat. Das Framework bricht keine E/A-Anforderungen ab, die niedrigere Treiber im Stapel möglicherweise dem Dateiobjekt zugeordnet haben. Es liegt in der Verantwortung des Fahrers, solche Anforderungen zu stornieren. Das Dateiobjekt wird erst geschlossen, nachdem alle E/A-Anforderungen abgeschlossen sind, die damit verknüpft sind.

Als Nächstes ruft das Framework die IFileCallbackClose::OnCloseFile-Methode des nächsten Treibers auf. An diesem Punkt garantiert das Framework, dass der nächste Treiber keine zusätzlichen E/A-Anforderungen für dieses Dateiobjekt empfängt.

Nachdem das Framework OnCloseFile aufgerufen hat, zerstört es die IWDFFile-Schnittstelle , die das Dateiobjekt darstellt.

Wenn vom Treiber erstellte Dateiobjekte verbleiben, nachdem die Methoden zum Entfernen von Geräten des Treibers (z . B. IPnpCallbackHardware::OnReleaseHardware und IPnpCallbackSelfManagedIo::OnSelfManagedIoCleanup) zurückgegeben wurden, generiert das Framework einen Treiberstopp. Informationen zur Problembehandlung finden Sie unter Ermitteln, warum UMDF ausstehende Dateien zum Zeitpunkt der Geräteentfernung angibt.