Freigeben über


FltCheckOplock-Funktion (fltkernel.h)

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

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FSCTL_OPBATCH_ACK_CLOSE_PENDING

FSCTL_OPLOCK_BREAK_ACKNOWLEDGE

FSCTL_OPLOCK_BREAK_ACK_NO_2

FSCTL_OPLOCK_BREAK_NOTIFY

FSCTL_REQUEST_BATCH_OPLOCK

FSCTL_REQUEST_FILTER_OPLOCK

FSCTL_REQUEST_OPLOCK_LEVEL_1

FSCTL_REQUEST_OPLOCK_LEVEL_2

FltCheckOplockEx

FltCurrentBatchOplock

FltInitializeOplock

FltOplockFsctrl

FltOplockIsFastIoMöglich

FltUninitializeOplock

FsRtlCheckOplock

PFLT_PRE_OPERATION_CALLBACK