Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ein Minifiltertreiber ruft FltCheckOplock auf, um die Rückrufdatenstruktur für einen IRP-basierten Datei-E/A-Vorgang mit dem aktuellen opportunistischen Sperrzustand (Oplock) der Datei zu synchronisieren.
Syntax
FLT_PREOP_CALLBACK_STATUS FLTAPI FltCheckOplock(
[in] POPLOCK Oplock,
[in] PFLT_CALLBACK_DATA CallbackData,
[in, optional] PVOID Context,
[in, optional] PFLTOPLOCK_WAIT_COMPLETE_ROUTINE WaitCompletionRoutine,
[in, optional] PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE PrePostCallbackDataRoutine
);
Parameter
[in] Oplock
Ein undurchsichtiger Oplockzeiger für die Datei. Dieser Zeiger muss durch einen vorherigen Aufruf von FltInitializeOplockinitialisiert worden sein.
[in] CallbackData
Ein Zeiger auf die Rückrufdatenstruktur (FLT_CALLBACK_DATA) für den E/A-Vorgang.
[in, optional] Context
Ein Zeiger auf aufruferdefinierte Kontextinformationen, die an die Rückrufroutinen übergeben werden sollen, die WaitCompletionRoutine und PrePostCallbackDataRoutine verweisen. Der Filter-Manager behandelt diese Informationen als undurchsichtig.
[in, optional] WaitCompletionRoutine
Ein Zeiger auf eine vom Aufrufer bereitgestellte Rückrufroutine. Wenn eine Oplockunterbrechung ausgeführt wird, ruft der Filter-Manager diese Routine auf, wenn der Oplock-Umbruch abgeschlossen ist. Dieser Parameter ist optional und kann NULL sein. Wenn er NULL ist, wird der Aufrufer in einen Wartezustand versetzt, bis die Oplock-Unterbrechung abgeschlossen ist.
Diese Routine wird wie folgt deklariert:
typedef VOID
(*PFLTOPLOCK_WAIT_COMPLETE_ROUTINE) (
IN PFLT_CALLBACK_DATA CallbackData,
IN PVOID Context
);
wo:
CallbackData ist ein Zeiger auf eine FLT_CALLBACK_DATA Struktur für den E/A-Vorgang.
Context ist ein Kontextinformationszeiger, der im Context-Parameter an FltCheckOplock übergeben wurde.
[in, optional] PrePostCallbackDataRoutine
Ein Zeiger auf eine vom Anrufer bereitgestellte Rückrufroutine, die aufgerufen werden soll, wenn der E/A-Vorgang in eine Arbeitswarteschlange gepostet wird. Dieser Parameter ist optional und kann NULL sein.
Diese Routine wird wie folgt deklariert:
typedef VOID
(*PFLTOPLOCK_PREPOST_CALLBACKDATA_ROUTINE) (
IN PFLT_CALLBACK_DATA CallbackData,
IN PVOID Context
);
wo:
CallbackData ist ein Zeiger auf eine FLT_CALLBACK_DATA Struktur für den E/A-Vorgang.
Context ist ein Kontextinformationszeiger, der im Context-Parameter an FltCheckOplock übergeben wurde.
Rückgabewert
FltCheckOplock gibt einen der folgenden FLT_PREOP_CALLBACK_STATUS Codes zurück:
| Rückgabecode | Beschreibung |
|---|---|
| FLT_PREOP_COMPLETE | FltCheckOplock hat einen Fehler bei der Poolzuordnung festgestellt, oder ein Aufruf der FsRtlCheckOplock-Funktion hat einen Fehler zurückgegeben. FltCheckOplock legt den Fehlercode im Status-Member der IO_STATUS_BLOCK-Struktur des IoStatus-Members der FLT_CALLBACK_DATA Callback-Datenstruktur fest. Der CallbackData-Parameter verweist auf diesen FLT_CALLBACK_DATA. |
| FLT_PREOP_PENDING | Es wurde eine Oplockunterbrechung initiiert, was dazu führte, dass der Filter-Manager den E/A-Vorgang in eine Arbeitswarteschlange einfügte. Der E/A-Vorgang wird durch die Rückrufdaten dargestellt, auf die der CallbackData Parameter verweist. |
| FLT_PREOP_SUCCESS_NO_CALLBACK | Der E/A-Vorgang wurde sofort ausgeführt. Beachten Sie, dass es sich bei diesem Vorgang um einen Erstellungsvorgang handelt, der FILE_COMPLETE_IF_OPLOCKED im Parameter "create-options" angegeben hat, möglicherweise ein Oplockbruch ausgeführt wird, obwohl der Vorgang sofort ausgeführt wurde. Um zu bestimmen, ob dies der Fall ist, sollte der Aufrufer den Status im Status-Element der IO_STATUS_BLOCK-Struktur des IoStatus-Elements der FLT_CALLBACK_DATA-Rückrufdatenstruktur überprüfen. |
Bemerkungen
Ein Minifiltertreiber ruft FltCheckOplock auf, um einen IRP-basierten E/A-Vorgang mit dem aktuellen Oplock-Zustand einer Datei gemäß den folgenden Bedingungen zu synchronisieren:
Wenn der E/A-Vorgang dazu führt, dass der Oplock abgebrochen wird, wird der Oplock-Umbruch initiiert.
Wenn der E/A-Vorgang erst fortgesetzt werden kann, wenn die Oplock-Unterbrechung abgeschlossen ist, gibt FltCheckOplock FLT_PREOP_PENDING zurück und ruft die Rückrufroutine auf, auf die der PrePostCallbackDataRoutine-Parameter zeigt.
Wenn ein Minifiltertreiber Oplocks verwendet, muss er FltCheckOplock von allen Pre-Operation-Callback-Routinen (PFLT_PRE_OPERATION_CALLBACK) für E/A-Vorgänge aufrufen, die Oplock-Unterbrechungen verursachen können. Diese Regel gilt für die folgenden Typen von E/A-Vorgängen, da diese Vorgänge oplock-Unterbrechungen verursachen können:
- IRP_MJ_CLEANUP
- IRP_MJ_CREATE
- IRP_MJ_FILE_SYSTEM_CONTROL
- IRP_MJ_FLUSH_BUFFERS
- IRP_MJ_LOCK_CONTROL
- IRP_MJ_READ
- IRP_MJ_SET_INFORMATION
- IRP_MJ_WRITE
- IRP_MJ_ACQUIRE_FOR_SECTION_SYNCHRONIZATION
Der E/A-Vorgang muss eine IRP-basierte E/A-Operation sein. Um zu bestimmen, ob eine bestimmte Rückrufdatenstruktur einen IRP-basierten E/A-Vorgang darstellt, verwenden Sie das FLT_IS_IRP_OPERATION Makro.
Minifilter dürfen FltCheckOp lock nicht erneut innerhalb des in WaitCompletionRoutineangegebenen Rückruf aufrufen. Dies kann zu einer Deadlock-Bedingung führen, wenn das Oplock-Paket den Abschlussrückruf aufruft, bevor FltCheckOplock zurückgibt.
Ausführliche Informationen zu opportunistischen Sperren finden Sie in der Microsoft Windows SDK-Dokumentation.
Anforderungen
| Anforderung | Wert |
|---|---|
| Zielplattform- | universell |
| Header- | fltkernel.h (einschließlich Fltkernel.h) |
| IRQL- | <= APC_LEVEL |
Siehe auch
FSCTL_OPBATCH_ACK_CLOSE_PENDING