Abschließen eines E/A-Vorgangs in einer Rückrufroutine vor der Operation

Um einen E/A-Vorgang abzuschließen , bedeutet, die Verarbeitung für den Vorgang anzuhalten, ihm einen endgültigen NTSTATUS-Wert zuzuweisen und ihn an den Filter-Manager zurückzugeben.

Wenn ein Minifiltertreiber einen E/A-Vorgang abschließt, führt der Filter-Manager Folgendes aus:

  • Sendet den Vorgang nicht an Minifiltertreiber unterhalb des aktuellen Minifiltertreibers, an Legacyfilter oder an das Dateisystem.

  • Ruft die Rückrufroutinen nach der Operation der Minifiltertreiber oberhalb des aktuellen Minifiltertreibers im Minifiltertreiber instance Stapel auf.

  • Ruft nicht die Postoperation-Rückrufroutine des aktuellen Minifiltertreibers für den Vorgang auf, sofern vorhanden.

Die Voroperationsrückrufroutine eines Minifiltertreibers schließt einen E/A-Vorgang durch Ausführen der folgenden Schritte ab:

  1. Festlegen des IoStatus.Status-Felds der Rückrufdatenstruktur auf den endgültigen NTSTATUS-Wert für den Vorgang.

  2. Gibt FLT_PREOP_COMPLETE zurück.

Eine Preoperation-Rückrufroutine, die einen E/A-Vorgang abschließt, kann keinen Vervollständigungskontext ungleich NULL festlegen (im CompletionContext-Ausgabeparameter ).

Ein Minifiltertreiber kann auch einen Vorgang in der Arbeitsroutine für einen zuvor geschriebenen E/A-Vorgang ausführen, indem er die folgenden Schritte ausführt:

  1. Festlegen des IoStatus.Status-Felds der Rückrufdatenstruktur auf den endgültigen NTSTATUS-Wert für den Vorgang.

  2. Übergeben FLT_PREOP_COMPLETE im CallbackStatus-Parameter , wenn die Arbeitsroutine FltCompletePendedPreOperation aufruft.

Beim Abschließen eines E/A-Vorgangs muss ein Minifiltertreiber das IoStatus.Status-Feld der Rückrufdatenstruktur auf den endgültigen NTSTATUS-Wert für den Vorgang festlegen, aber dieser NTSTATUS-Wert kann nicht STATUS_PENDING oder STATUS_FLT_DISALLOW_FAST_IO werden. Für einen Bereinigungs- oder Schließvorgang muss das Feld STATUS_SUCCESS sein. Diese Vorgänge können nicht mit einem anderen NTSTATUS-Wert abgeschlossen werden.

Das Abschließen eines E/A-Vorgangs wird häufig als erfolgreich oder fehlgeschlagen bezeichnet, je nach NTSTATUS-Wert:

  • Wenn ein E/A-Vorgang erfolgreich ist, müssen Sie ihn mit einem erfolgreichen oder informationellen NTSTATUS-Wert abschließen, z. B. STATUS_SUCCESS.

  • Wenn ein E/A-Vorgang fehlschlägt , müssen Sie ihn mit einem Fehler- oder Warnungswert NTSTATUS abschließen, z. B. STATUS_INVALID_DEVICE_REQUEST oder STATUS_BUFFER_OVERFLOW.

NTSTATUS-Werte werden in ntstatus.h definiert. Diese Werte lassen sich in vier Kategorien einteilen: Erfolg, Information, Warnung und Fehler. Weitere Informationen zu diesen Werten finden Sie unter Verwenden von NTSTATUS-Werten.