Freigeben über


FsRtlCheckOplockEx2-Funktion (ntifs.h)

FsRtlCheckOplockEx2 synchronisiert das IRP für einen Datei-E/A-Vorgang mit dem aktuellen opportunistischen Sperrzustand (Oplock) der Datei.

Syntax

NTSTATUS FsRtlCheckOplockEx2(
  [in]           POPLOCK                       Oplock,
  [in]           PIRP                          Irp,
  [in]           ULONG                         Flags,
  [in]           ULONG                         FlagsEx2,
  [in, optional] PVOID                         CompletionRoutineContext,
  [in, optional] POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine,
  [in, optional] POPLOCK_FS_PREPOST_IRP        PostIrpRoutine,
  [in]           ULONGLONG                     Timeout,
  [in, optional] PVOID                         NotifyContext,
  [in, optional] POPLOCK_NOTIFY_ROUTINE        NotifyRoutine
);

Parameter

[in] Oplock

Zeigen Sie auf die undurchsichtige Oplockstruktur für die Datei. Dieser Zeiger muss durch einen vorherigen Aufruf von fsRtlInitializeOplockinitialisiert worden sein.

[in] Irp

Zeiger auf das IRP, das den angeforderten E/A-Vorgang deklariert.

[in] Flags

Eine Bitmaske für den zugeordneten Datei-E/A-Vorgang. Ein Dateisystem oder Filtertreiber legt Bits fest, um das Verhalten von FsRtlCheckOplockEx2anzugeben. Flags hat die folgenden Optionen:

Flag-Wert Bedeutung
OPLOCK_FLAG_COMPLETE_IF_OPLOCKED (0x00000001) Gibt an, dass ein Oplock-Unterbrechung fortgesetzt werden kann, ohne den Vorgang zu blockieren oder ausstehend, der den Oplock-Unterbrechung verursacht hat.
OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY (0x00000002) Gibt an, dass FsRtlCheckOplockEx2- nur auf einen Oplock-Schlüssel für die FILE_OBJECT überprüfen soll, die dem IRP zugeordnet ist, auf den der Irp Parameter verweist. FsRtlCheckOplockEx2- muss dann den Schlüssel hinzufügen, wenn ein Schlüssel im IRP bereitgestellt wird. Keine andere Oplock-Verarbeitung erfolgt; d. h., es tritt keine Oplockunterbrechung auf. Wird ab Windows 7 unterstützt.
OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK (0x00000004) Gibt an, dass FsRtlCheckOplockEx2- einen Zustand wiederherstellen soll, der zuvor über einen Aufruf der FsRtlOplockFsctrl Routine eingerichtet wurde. FsRtlOplockFsctrl wird während der Verarbeitung einer IRP_MJ_CREATE Anforderung aufgerufen, die das FILE_OPEN_REQUIRING_OPLOCK Flag im Parameter "Create options" angibt. Das OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK-Flag wird in der Regel bei der endgültigen Verarbeitung einer solchen Erstellungsanforderung verwendet, wenn zuvor ein Fehler aufgetreten ist. Wird ab Windows 7 unterstützt.
OPLOCK_FLAG_IGNORE_OPLOCK_KEYS (0x00000008) Gibt an, dass alle Oplock-Unterbrechungen unabhängig von der Oplock-Taste fortgesetzt werden können. Wird ab Windows 7 unterstützt.
OPLOCK_FLAG_PARENT_OBJECT (0x00000010) Gibt an, dass Oplock- dem übergeordneten (Verzeichnis) der Datei oder des Verzeichnisses zugeordnet ist, an das das IRP im Irp--Parameter weitergeleitet wird. Wird ab Windows 8 unterstützt.
OPLOCK_FLAG_CLOSING_DELETE_ON_CLOSE (0x00000020) Gibt an, dass der in Irp- angegebene Vorgang ein IRP_MJ_CLEANUP für ein Handle ist, das ursprünglich mit dem in den Erstellungsoptionen festgelegten FILE_DELETE_ON_CLOSE Flag geöffnet wurde. Dieses Kennzeichen hat keine Auswirkung, wenn Irp- kein IRP_MJ_CLEANUP Vorgang ist. Die Angabe dieses Kennzeichens kann zu einem Oplock-Unterbrechung führen. Wird ab Windows 8 unterstützt.
OPLOCK_FLAG_REMOVING_FILE_OR_LINK (0x00000040) Gibt die Behandlung eines Oplock-Umbruchs für ein übergeordnetes Verzeichnis beim Löschen einer Datei oder eines Links in diesem Verzeichnis an. Wenn angegeben, muss dieses Kennzeichen mit OPLOCK_FLAG_PARENT_OBJECT kombiniert werden. Dieses Flag muss angegeben werden, wenn das Dateisystem einen Vorgang verarbeitet, der zum Entfernen eines Links oder einer Datei führt. Wird ab Windows 8 unterstützt.

[in] FlagsEx2

Reserviert; muss auf Null festgelegt werden.

[in, optional] CompletionRoutineContext

Zeiger auf aufruferdefinierte Kontextinformationen, die an die Rückrufroutine übergeben werden sollen, auf die der CompletionRoutine Parameter verweist. Dieser Parameter ist optional und kann NULL-werden.

[in, optional] CompletionRoutine

Zeiger auf eine vom Aufrufer bereitgestellte Rückrufroutine. Wenn eine Oplockunterbrechung ausgeführt wird, wird diese Routine aufgerufen, wenn die Unterbrechung abgeschlossen ist. Dieser Parameter ist optional und kann NULL-werden. Wenn es NULL-ist, FsRtlCheckOpLockEx2 synchron ausgeführt wird, wird der Aufrufer in einen Wartezustand versetzt, bis der Oplock-Umbruch abgeschlossen ist.

CompletionRoutine wird wie folgt deklariert:

typedef VOID
(*POPLOCK_WAIT_COMPLETE_ROUTINE) (
      IN PVOID Context,
      IN PIRP Irp
      );

CompletionRoutine hat die folgenden Parameter:

  • Kontext-: Ein Kontextinformationspunkt, der im parameter Context an FsRtlCheckOplockEx2übergeben wurde.
  • Irp-: Ein Zeiger auf das IRP für den E/A-Vorgang.

[in, optional] PostIrpRoutine

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-werden.

PostIrpRoutine wird wie folgt deklariert:

typedef VOID
(*POPLOCK_FS_PREPOST_IRP) (
      IN PVOID Context,
      IN PIRP Irp
      );

PostIrpRoutine hat die folgenden Parameter:

  • Context, bei dem es sich um einen Kontextinformationspunkt handelt, der im parameter Context an FsRtlCheckOplockEx2übergeben wurde.
  • Irp-: Ein Zeiger auf das IRP für den E/A-Vorgang.

[in] Timeout

Wenn keine Null ist, wird ein Timeout (in Millisekunden) angegeben, das auf ein Ereignis wartet, mit dem der Thread des Aufrufers blockiert wird, um auf den Abschluss der Oplock-Unterbrechung zu warten. Dieser Wert wird ignoriert, es sei denn, beide der folgenden Bedingungen sind wahr: CompletionRoutine ist NULL und NotifyRoutine ist nicht NULL.

[in, optional] NotifyContext

Zeiger auf eine OPLOCK_NOTIFY_PARAMS Struktur, die an die Rückrufroutine übergeben werden soll, auf die die NotifyRoutine Parameter verweist. Dieser Parameter ist optional und kann NULL-werden.

[in, optional] NotifyRoutine

Zeigen Sie auf eine vom Anrufer bereitgestellte Rückrufroutine, die für die Oplock-Statusbenachrichtigung aufgerufen werden soll. Dieser Parameter ist optional und kann NULL-werden.

NotifyRoutine wird wie folgt deklariert:

typedef NTSTATUS
(*POPLOCK_NOTIFY_ROUTINE) (
      IN POPLOCK_NOTIFY_PARAMS NotifyParams
      );

NotifyRoutine hat die folgenden Parameter:

  • NotifyParams, die als NotifyContext-parameter festgelegt ist, der an FsRtlCheckOplockEx2übergeben wird.

Rückgabewert

FsRtlCheckOplockEx2 gibt STATUS_SUCCESS oder einen geeigneten NTSTATUS-Code wie einen der folgenden zurück:

Rückgabecode Beschreibung
STATUS_CANCELLED Das IRP wurde abgebrochen. STATUS_CANCELLED ist ein Fehlercode.
STATUS_CANNOT_BREAK_OPLOCK Der Oplockbruch kann nicht erreicht werden. Das IRP ist eine IRP_MJ_CREATE Anforderung. FILE_OPEN_REQUIRING_OPLOCK wurde im Parameter "Create options" für den Vorgang angegeben, und es ist ein gewährter Oplock vorhanden.
STATUS_OPLOCK_BREAK_IN_PROGRESS Eine Oplockpause ist im Gange. Das IRP ist eine IRP_MJ_CREATE Anforderung, und FILE_COMPLETE_IF_OPLOCKED im Parameter zum Erstellen von Optionen für den Vorgang angegeben wurde. STATUS_OPLOCK_BREAK_IN_PROGRESS ist ein Erfolgscode, der zurückgegeben wird, wenn OPLOCK_FLAG_COMPLETE_IF_OPLOCKED festgelegt wurde und ein Oplock unterbrochen wurde.
STATUS_PENDING Es wird eine Oplockunterbrechung ausgeführt, und die Kontrolle über das IRP wurde an das Oplock-Paket übergeben. Wenn CompletionRoutineNULL-ist, FsRtlCheckOplockEx2 Blöcke, während der Oplock-Umbruch verarbeitet wird, anstatt STATUS_PENDING zurückzugeben. STATUS_PENDING ist ein Erfolgscode.

Bemerkungen

Minifilter sollten FltCheckOplockEx- anstelle von FsRtlCheckOplockEx2aufrufen.

FsRtlCheckOplockEx2 synchronisiert das IRP für einen E/A-Vorgang mit dem aktuellen Oplockstatus einer Datei gemäß den folgenden Bedingungen:

  • 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 der Oplock-Umbruch abgeschlossen ist und eine Abschlussroutine in CompletionRoutine angegeben wurde, gibt FsRtlCheckOplockEx2 STATUS_PENDING zurück und ruft die in PostIrpRoutineangegebene Rückrufroutine auf. Wenn der Oplock-Umbruch bestätigt wurde, wird die Rückrufroutine in CompletionRoutine aufgerufen.

  • Wenn der E/A-Vorgang erst fortgesetzt werden kann, wenn der Oplock-Umbruch abgeschlossen ist und CompletionRoutine- nicht angegeben wurde, wird der Thread des Aufrufers blockiert und FsRtlCheckOplockEx2 nur zurückgegeben, wenn der Oplock-Umbruch abgeschlossen ist.

Wenn der Thread des Aufrufers blockiert wird und NotifyRoutine nicht NULL-ist, wird NotifyRoutine aus irgendeinem oder allen der folgenden Gründe aufgerufen, die in NotifyParamsfestgelegt werden:

  • OPLOCK_NOTIFY_BREAK_WAIT_INTERIM_TIMEOUT
  • OPLOCK_NOTIFY_BREAK_WAIT_TERMINATED

Der Aufruf von NotifyRoutine aus einem der oben genannten Gründe tritt nur auf, wenn CompletionRoutine- NULL ist und es erforderlich ist, den Thread des Aufrufers zu blockieren, um auf den Abschluss der Unterbrechung zu warten.

Wenn NotifyRoutine aus gründen der OPLOCK_NOTIFY_BREAK_WAIT_INTERIM_TIMEOUT aufgerufen wird, wird sie immer aus Gründen aufgerufen, OPLOCK_NOTIFY_BREAK_WAIT_TERMINATED, wenn die Wartezeit aus irgendeinem Grund beendet/abgeschlossen wird (dies kann nie sein).

FsRtlCheckOplockEx2 ignoriert die OPLOCK_NOTIFY_BREAK_WAIT_INTERIM_TIMEOUT und OPLOCK_NOTIFY_BREAK_WAIT_TERMINATED Statuscodes, die von NotifyRoutinezurückgegeben werden.

Eine PostIrpRoutine- sollte nur angegeben werden, wenn ein CompletionRoutine- angegeben wurde. Wenn PostIrpRoutine nicht NULL-ist, wird sie aufgerufen, bevor etwas in die wartenden Irp-Warteschlange eingereiht wird.

Wenn das OPLOCK_FLAG_PARENT_OBJECT Flag in Flagsangegeben wird, wird FsRtlCheckOplockEx2 bedingungslos alle vorhandenen übergeordneten Oplocks unterbrechen; d. h., der hauptcode im Irp wird nicht berücksichtigt.

Wenn ein Dateisystem Oplocks verwendet, muss es FsRtlCheckOplockEx2- von allen Verteilerroutinen 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

Weitere Informationen zu Oplocks finden Sie unter Opportunistic Locks.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows 10, Version 2004
Header- ntifs.h

Siehe auch

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

FsRtlCurrentBatchOplock

FsRtlInitializeOplock

FsRtlOplockFsctrl

FsRtlOplockIsFastIoPossible

FsRtlUninitializeOplock

OPLOCK_NOTIFY_PARAMS