FsRtlCheckOplockEx-Funktion (ntifs.h)

Die FsRtlCheckOplockEx-Routine synchronisiert das IRP für einen Datei-I/O-Vorgang mit dem aktuellen opportunistischen Sperrzustand (Oplock) der Datei.

Syntax

NTSTATUS FsRtlCheckOplockEx(
  [in]           POPLOCK                       Oplock,
  [in]           PIRP                          Irp,
  [in]           ULONG                         Flags,
  [in, optional] PVOID                         Context,
  [in, optional] POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine,
  [in, optional] POPLOCK_FS_PREPOST_IRP        PostIrpRoutine
);

Parameter

[in] Oplock

Ein undurchsichtiger opportunistischer Sperrzeiger für die Datei. Dieser Zeiger muss durch einen vorherigen Aufruf von FsRtlInitializeOplock initialisiert worden sein.

[in] Irp

Ein Zeiger auf das IRP für den I/O-Vorgang.

[in] Flags

Eine Bitmaske für den zugeordneten Datei-I/O-Vorgang. Ein Dateisystem oder Filtertreiber legt Bits fest, um das Verhalten von FsRtlCheckOplockEx anzugeben. Der Parameter "Flags " weist die folgenden Optionen auf:

OPLOCK_FLAG_COMPLETE_IF_OPLOCKED (0x00000001)

Gibt an, dass ein opportunistischer Sperrbruch fortgesetzt werden kann, ohne den Vorgang zu blockieren oder ausstehend, der den Oplockbruch verursacht hat.

OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY (0x00000002)

Unterstützt ab Windows 7.

Gibt an, dass FsRtlCheckOplockEx nur auf einen opportunistischen Sperrschlüssel auf der FILE_OBJECT überprüft werden soll, die dem IRP zugeordnet ist, auf das der Irp-Parameter verweist. FsRtlCheckOplockEx muss dann den Schlüssel hinzufügen, wenn eine in der IRP bereitgestellt wird. Es tritt keine andere Oplock-Verarbeitung auf; das heißt, es tritt keine opportunistische Sperrpause auf.

OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK (0x00000004)

Unterstützt ab Windows 7.

Gibt an, dass FsRtlCheckOplockEx einen zustand zurücksetzen 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 "Optionen erstellen" angibt. Das OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK Flag wird in der Regel bei der endgültigen Verarbeitung einer solchen Erstellungsanforderung verwendet, wenn sie zuvor fehlgeschlagen ist.

OPLOCK_FLAG_IGNORE_OPLOCK_KEYS (0x00000008)

Unterstützt ab Windows 7.

Gibt an, dass alle opportunistischen Sperrunterbrechungen unabhängig von der opportunistischen Sperrtaste fortgesetzt werden können.

OPLOCK_FLAG_PARENT_OBJECT (0x00000010)

Unterstützt ab Windows 8.

Gibt an, dass Oplock dem übergeordneten (Verzeichnis) der Datei oder des Verzeichnisses zugeordnet ist, an das das IRP im Irp-Parameter weitergeleitet wird.

OPLOCK_FLAG_CLOSING_DELETE_ON_CLOSE (0x00000020)

Unterstützt ab Windows 8.

Gibt an, dass der in Irp angegebene Vorgang ein IRP_MJ_CLEANUP für einen Handle ist, der ursprünglich mit dem in den Erstellungsoptionen festgelegten FILE_DELETE_ON_CLOSE Flag geöffnet wurde. Dieses Flag als kein Effekt, wenn Irp kein IRP_MJ_CLEANUP-Vorgang ist. Wenn Sie dieses Kennzeichen angeben, kann es zu einem opportunistischen Sperrbruch führen.

Unterstützt ab Windows 8.

Gibt die Behandlung eines opportunistischen Sperrumbruchs in einem übergeordneten Verzeichnis an, wenn eine Datei oder ein Link in diesem Verzeichnis gelöscht wird. Wenn angegeben, muss dieses Kennzeichen mit OPLOCK_FLAG_PARENT_OBJECT kombiniert werden. Dieses Kennzeichen muss angegeben werden, wenn das Dateisystem einen Vorgang verarbeitet, der zum Entfernen eines Links oder einer Datei führt.

[in, optional] Context

Ein Zeiger zum Aufrufen definierter Kontextinformationen, die an die Rückrufroutine - und PostIrpRoutine-Parameter übergeben werden sollen.

[in, optional] CompletionRoutine

Ein Zeiger auf eine caller-bereitgestellte Rückrufroutine. Wenn ein opportunistischer Sperrbruch ausgeführt wird, wird diese Routine aufgerufen, wenn die Unterbrechung abgeschlossen ist. Dieser Parameter ist optional und kann NULL sein. Wenn es NULL ist, wird der Aufrufer in einen Wartezustand versetzt, bis der opportunistische Sperrbruch abgeschlossen ist.

Diese Routine wird wie folgt deklariert:

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

Diese Routine weist die folgenden Parameter auf:

Kontext

Ein Kontextinformationspunkt, der im Kontextparameter an FsRtlCheckOplockEx übergeben wurde.

Irp

Ein Zeiger auf das IRP für den I/O-Vorgang.

[in, optional] PostIrpRoutine

Ein Zeiger auf eine vom Anrufer bereitgestellte Rückrufroutine, die aufgerufen werden soll, wenn der I/O-Vorgang in eine Arbeitswarteschlange gepostet wird. Dieser Parameter ist optional und kann NULL sein.

Diese Routine wird wie folgt deklariert:

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

Kontext

Ein Kontextinformationspunkt, der im Kontextparameter an FsRtlCheckOplockEx übergeben wurde.

Irp

Ein Zeiger auf das IRP für den I/O-Vorgang.

Rückgabewert

FsRtlCheckOplockEx gibt STATUS_SUCCESS oder einen entsprechenden NTSTATUS-Code wie einen der folgenden zurück:

Rückgabecode Beschreibung
STATUS_CANCELLED
Die IRP wurde abgebrochen. STATUS_CANCELLED ist ein Fehlercode.
STATUS_CANNOT_BREAK_OPLOCK
Der opportunistische Sperrbruch (Oplock) kann nicht erreicht werden. Das IRP ist eine IRP_MJ_CREATE Anforderung. FILE_OPEN_REQUIRING_OPLOCK wurde im Parameter "Optionen erstellen" für den Vorgang angegeben, und es gibt einen gewährten Oplock.
STATUS_OPLOCK_BREAK_IN_PROGRESS
Ein opportunistischer Sperrbruch ist im Gange. Das IRP ist eine IRP_MJ_CREATE Anforderung, und FILE_COMPLETE_IF_OPLOCKED wurde im Parameter "Optionen erstellen" für den Vorgang angegeben. STATUS_OPLOCK_BREAK_IN_PROGRESS ist ein Erfolgscode, der zurückgegeben wird, wenn OPLOCK_FLAG_COMPLETE_IF_OPLOCKED festgelegt wurde, und eine opportunistische Sperre wurde unterbrochen.
STATUS_PENDING
Ein opportunistischer Sperrbruch ist im Gange, und die Kontrolle des IRP wurde an das Oplock-Paket übergeben. Wenn "CompletionRoutine" NULL ist, blockiert FsRtlCheckOplockEx, während der opportunistische Sperrumbruch verarbeitet wird, anstatt STATUS_PENDING zurückzugeben. STATUS_PENDING ist ein Erfolgscode.

Bemerkungen

FsRtlCheckOplockEx synchronisiert das IRP für einen I/O-Vorgang mit dem aktuellen opportunistischen Sperrzustand einer Datei gemäß den folgenden Bedingungen:

  • Wenn der I/O-Vorgang dazu führt, dass die opportunistische Sperre aufgebrochen wird, wird der opportunistische Sperrbruch initiiert.
  • Wenn der I/O-Vorgang erst fortgesetzt werden kann, wenn der opportunistische Sperrumbruch abgeschlossen ist und eine Abschlussroutine in CompletionRoutine angegeben wurde, gibt FsRtlCheckOplockEx STATUS_PENDING zurück und ruft die in PostIrpRoutine angegebene Rückrufroutine auf. Wenn die opportunistische Sperrunterbrechung bestätigt wurde, wird die Rückrufroutine in CompletionRoutine aufgerufen.
  • • Wenn der I/O-Vorgang erst fortgesetzt werden kann, wenn der opportunistische Sperrumbruch abgeschlossen ist und "CompletionRoutine " nicht angegeben wurde, wird FsRtlCheckOplockEx erst zurückgegeben, wenn der opportunistische Sperrumbruch bestätigt wird.
Eine PostIrpRoutine sollte nur angegeben werden, wenn eine CompletionRoutine angegeben wurde.

Wenn ein Dateisystem oder Filtertreiber opportunistische Sperren verwendet, muss fsRtlCheckOplockEx von allen Verteilerroutinen für I/O-Vorgänge aufgerufen werden, die opportunistische Sperrunterbrechungen verursachen können. Diese Regel gilt für die folgenden Arten von I/O-Vorgängen, da diese Vorgänge opportunistische Sperrunterbrechungen 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 opportunistischen Sperren finden Sie in der Microsoft Windows SDK Dokumentation.

Minifilter sollten FltCheckOplockEx anstelle von FsRtlCheckOplockEx aufrufen.

Anforderungen

   
Unterstützte Mindestversion (Client) Die FsRtlCheckOplockEx-Routine ist ab Windows Vista verfügbar.
Zielplattform Universell
Header ntifs.h (einschließlich Ntifs.h)
Bibliothek NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL

Weitere Informationen

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