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:
Festlegen des IoStatus.Status-Felds der Rückrufdatenstruktur auf den endgültigen NTSTATUS-Wert für den Vorgang.
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:
Festlegen des IoStatus.Status-Felds der Rückrufdatenstruktur auf den endgültigen NTSTATUS-Wert für den Vorgang.
Ü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.