16 #define LEVEL_1_OPLOCK 0x2 17 #define BATCH_OPLOCK 0x4 18 #define FILTER_OPLOCK 0x8 19 #define LEVEL_2_OPLOCK 0x10 21 #define EXCLUSIVE_LOCK 0x40 22 #define PENDING_LOCK 0x80 24 #define BROKEN_TO_LEVEL_2 0x100 25 #define BROKEN_TO_NONE 0x200 26 #define BROKEN_TO_NONE_FROM_LEVEL_2 0x400 27 #define BROKEN_TO_CLOSE_PENDING 0x800 28 #define BROKEN_ANY (BROKEN_TO_LEVEL_2 | BROKEN_TO_NONE | BROKEN_TO_NONE_FROM_LEVEL_2 | BROKEN_TO_CLOSE_PENDING) 90 DPRINT(
"FsRtlRemoveAndCompleteWaitIrp(%p)\n", WaitCtx);
101 Irp->IoStatus.Information = WaitCtx->SavedInformation;
106 WaitCtx->CompletionRoutine(WaitCtx->CompletionContext,
Irp);
135 NextEntry = NextEntry->
Flink)
139 if (WaitCtx->
Irp->Cancel)
158 DPRINT(
"FsRtlWaitOnIrp(%p, %p, %p, %p, %p, %p)\n", Oplock,
Irp,
CompletionContext,
CompletionRoutine,
PostIrpRoutine, WaitEvent);
245 DPRINT(
"FsRtlOplockBreakNotify(%p, %p, %p)\n", Oplock,
Stack,
Irp);
268 Oplock->FileObject =
NULL;
287 DPRINT(
"FsRtlRemoveAndCompleteIrp(%p)\n",
Irp);
334 NextEntry = NextEntry->
Flink)
380 if (Oplock->FileObject !=
Stack->FileObject)
444 for (NextEntry = Oplock->WaitListHead.
Flink;
445 NextEntry != &Oplock->WaitListHead;
446 NextEntry = NextEntry->
Flink)
458 Oplock->FileObject =
NULL;
480 DPRINT(
"FsRtlOpBatchBreakClosePending(%p, %p, %p)\n", Oplock,
Stack,
Irp);
509 Oplock->FileObject =
NULL;
512 for (NextEntry = Oplock->WaitListHead.
Flink;
513 NextEntry != &Oplock->WaitListHead;
514 NextEntry = NextEntry->
Flink)
548 DPRINT(
"FsRtlAllocateOplock()\n");
618 NextEntry = NextEntry->
Flink)
650 if (IntOplock ==
NULL)
751 if (IntOplock ==
NULL)
824 DPRINT(
"FsRtlOplockCleanup(%p, %p)\n", Oplock,
Stack);
834 for (NextEntry = Oplock->SharedListHead.
Flink;
835 NextEntry != &Oplock->SharedListHead;
836 NextEntry = NextEntry->
Flink)
856 if (Oplock->FileObject ==
Stack->FileObject)
872 Oplock->ExclusiveIrp =
NULL;
882 Oplock->FileObject =
NULL;
886 for (NextEntry = Oplock->WaitListHead.
Flink;
887 NextEntry != &Oplock->WaitListHead;
888 NextEntry = NextEntry->
Flink)
913 DPRINT(
"FsRtlOplockBreakToNone(%p, %p, %p, %p, %p, %p)\n", Oplock,
Stack,
Irp,
Context,
CompletionRoutine,
PostIrpRoutine);
935 if (Oplock->ExclusiveIrp->Cancel)
944 Oplock->ExclusiveIrp =
NULL;
948 Oplock->FileObject =
NULL;
951 for (NextEntry = Oplock->WaitListHead.
Flink;
952 NextEntry != &Oplock->WaitListHead;
953 NextEntry = NextEntry->
Flink)
971 Oplock->ExclusiveIrp =
NULL;
978 for (NextEntry = Oplock->SharedListHead.
Flink;
979 NextEntry != &Oplock->SharedListHead;
980 NextEntry = NextEntry->
Flink)
1003 Oplock->FileObject =
NULL;
1010 if (Oplock->FileObject ==
Stack->FileObject)
1046 DPRINT(
"FsRtlOplockBreakToII(%p, %p, %p, %p, %p, %p)\n", Oplock,
Stack,
Irp,
Context,
CompletionRoutine,
PostIrpRoutine);
1064 Oplock->FileObject =
NULL;
1080 if (Oplock->ExclusiveIrp->Cancel)
1089 Oplock->ExclusiveIrp =
NULL;
1091 Oplock->FileObject =
NULL;
1094 for (NextEntry = Oplock->WaitListHead.
Flink;
1095 NextEntry != &Oplock->WaitListHead;
1096 NextEntry = NextEntry->
Flink)
1121 Oplock->ExclusiveIrp =
NULL;
1182 #define BreakToIIIfRequired \ 1183 if (IntOplock->Flags != LEVEL_2_OPLOCK || IntOplock->FileObject != Stack->FileObject) \ 1184 return FsRtlOplockBreakToII(IntOplock, Stack, Irp, Context, CompletionRoutine, PostIrpRoutine) 1186 #define BreakToNoneIfRequired \ 1187 if (IntOplock->Flags == LEVEL_2_OPLOCK || IntOplock->FileObject != Stack->FileObject) \ 1188 return FsRtlOplockBreakToNone(IntOplock, Stack, Irp, Context, CompletionRoutine, PostIrpRoutine) 1192 IntOplock = *Oplock;
1195 if (IntOplock ==
NULL)
1330 if (
Stack->Parameters.SetFile.AdvanceOnly)
1342 #undef BreakToIIIfRequired 1343 #undef BreakToNoneIfRequired 1370 DPRINT(
"FsRtlCurrentBatchOplock(%p)\n", Oplock);
1372 IntOplock = *Oplock;
1375 if (IntOplock !=
NULL &&
1405 DPRINT(
"FsRtlInitializeOplock(%p)\n", Oplock);
1441 IntOplock = *Oplock;
1446 switch (
Stack->Parameters.FileSystemControl.FsControlCode)
1570 DPRINT(
"FsRtlOplockIsFastIoPossible(%p)\n", Oplock);
1572 IntOplock = *Oplock;
1575 if (IntOplock !=
NULL &&
1608 DPRINT(
"FsRtlUninitializeOplock(%p)\n", Oplock);
1610 IntOplock = *Oplock;
1613 if (IntOplock ==
NULL)
1628 NextEntry = NextEntry->
Flink)
1640 Irp->IoStatus.Information = 0;
1649 NextEntry = NextEntry->
Flink)
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
#define IRP_MJ_FLUSH_BUFFERS
_In_ WDFREQUEST _In_opt_ PFN_WDF_REQUEST_COMPLETION_ROUTINE _In_opt_ __drv_aliasesMem WDFCONTEXT CompletionContext
NTSTATUS FsRtlOpBatchBreakClosePending(IN PINTERNAL_OPLOCK Oplock, IN PIO_STACK_LOCATION Stack, IN PIRP Irp)
LIST_ENTRY SharedListHead
#define STATUS_INVALID_PARAMETER
#define BooleanFlagOn(F, SF)
struct _LIST_ENTRY * Blink
FORCEINLINE VOID InsertHeadList(_Inout_ PLIST_ENTRY ListHead, _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
struct _INTERNAL_OPLOCK INTERNAL_OPLOCK
NTSTATUS FsRtlAcknowledgeOplockBreak(IN PINTERNAL_OPLOCK Oplock, IN PIO_STACK_LOCATION Stack, IN PIRP Irp, IN BOOLEAN SwitchToLevel2)
VOID NTAPI IoAcquireCancelSpinLock(OUT PKIRQL Irql)
#define FILE_OPLOCK_BROKEN_TO_LEVEL_2
#define FSCTL_OPLOCK_BREAK_ACK_NO_2
#define POOL_COLD_ALLOCATION
NTSTATUS NTAPI FsRtlOplockBreakToII(IN PINTERNAL_OPLOCK Oplock, IN PIO_STACK_LOCATION Stack, IN PIRP Irp, IN PVOID Context, IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL)
struct _WAIT_CONTEXT * PWAIT_CONTEXT
#define STATUS_INVALID_OPLOCK_PROTOCOL
#define FSCTL_OPBATCH_ACK_CLOSE_PENDING
VOID NTAPI FsRtlUninitializeOplock(IN POPLOCK Oplock)
BOOLEAN NTAPI IoIsOperationSynchronous(IN PIRP Irp)
#define InsertTailList(ListHead, Entry)
IoSetCancelRoutine(Irp, CancelRoutine)
#define BreakToIIIfRequired
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
#define FSCTL_REQUEST_BATCH_OPLOCK
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
#define FILE_RESERVE_OPFILTER
VOID FASTCALL ExReleaseFastMutex(IN PFAST_MUTEX FastMutex)
#define FSCTL_SET_ZERO_DATA
#define FILE_WRITE_ATTRIBUTES
VOID FASTCALL ExReleaseFastMutexUnsafe(IN OUT PFAST_MUTEX FastMutex)
VOID NTAPI FsRtlCancelExclusiveIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
ULONG_PTR SavedInformation
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
NTSTATUS NTAPI FsRtlOplockFsctrl(IN POPLOCK Oplock, IN PIRP Irp, IN ULONG OpenCount)
_In_ PDEVICE_OBJECT DeviceObject
#define IO_DISK_INCREMENT
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
#define FSCTL_OPLOCK_BREAK_NOTIFY
VOID FsRtlWaitOnIrp(IN PINTERNAL_OPLOCK Oplock, IN PIRP Irp, IN PVOID CompletionContext, IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine, IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine, IN PKEVENT WaitEvent)
_In_ PMEMORY_AREA _In_ PVOID _In_ BOOLEAN Locked
VOID NTAPI FsRtlCancelWaitIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSTATUS FsRtlOplockBreakNotify(IN PINTERNAL_OPLOCK Oplock, IN PIO_STACK_LOCATION Stack, IN PIRP Irp)
VOID(NTAPI * POPLOCK_WAIT_COMPLETE_ROUTINE)(_In_ PVOID Context, _In_ PIRP Irp)
#define FILE_OVERWRITE_IF
#define _SEH2_AbnormalTermination()
#define STATUS_OPLOCK_NOT_GRANTED
VOID FsRtlRemoveAndCompleteWaitIrp(IN PWAIT_CONTEXT WaitCtx)
#define IoCompleteRequest
NTSTATUS FsRtlRequestOplockII(IN POPLOCK Oplock, IN PIO_STACK_LOCATION Stack, IN PIRP Irp)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
#define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE
VOID FsRtlOplockCleanup(IN PINTERNAL_OPLOCK Oplock, IN PIO_STACK_LOCATION Stack)
VOID FASTCALL IofCompleteRequest(IN PIRP Irp, IN CCHAR PriorityBoost)
enum _FILE_INFORMATION_CLASS FILE_INFORMATION_CLASS
struct _LIST_ENTRY * Flink
struct _INTERNAL_OPLOCK * PINTERNAL_OPLOCK
_Must_inspect_result_ _In_opt_ WDFKEY _In_ PCUNICODE_STRING _In_ ACCESS_MASK _In_ ULONG _Out_opt_ PULONG CreateDisposition
_Must_inspect_result_ _In_ ULONG Flags
#define FSCTL_REQUEST_OPLOCK_LEVEL_2
VOID FASTCALL ExAcquireFastMutexUnsafe(IN OUT PFAST_MUTEX FastMutex)
struct _WAIT_CONTEXT WAIT_CONTEXT
VOID NTAPI FsRtlInitializeOplock(IN OUT POPLOCK Oplock)
#define IRP_MJ_FILE_SYSTEM_CONTROL
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
#define BROKEN_TO_CLOSE_PENDING
#define ObDereferenceObject
NTSTATUS FsRtlRequestExclusiveOplock(IN POPLOCK Oplock, IN PIO_STACK_LOCATION Stack, IN PIRP Irp, IN ULONG Flags)
BOOLEAN NTAPI FsRtlCurrentBatchOplock(IN POPLOCK Oplock)
#define FILE_READ_ATTRIBUTES
#define ExAllocatePoolWithTag(hernya, size, tag)
VOID FsRtlRemoveAndCompleteIrp(IN PIRP Irp)
#define BROKEN_TO_LEVEL_2
#define BreakToNoneIfRequired
POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine
#define FSCTL_REQUEST_OPLOCK_LEVEL_1
VOID NTAPI FsRtlCompletionRoutinePriv(IN PVOID Context, IN PIRP Irp)
ClearFlag(Dirent->Flags, DIRENT_FLAG_NOT_PERSISTENT)
#define FILE_SHARE_VALID_FLAGS
VOID NTAPI IoReleaseCancelSpinLock(IN KIRQL Irql)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
#define KeInitializeEvent(pEvt, foo, foo2)
VOID FASTCALL ExAcquireFastMutex(IN PFAST_MUTEX FastMutex)
#define FO_CLEANUP_COMPLETE
#define InitializeListHead(ListHead)
_In_ WDFREQUEST _In_opt_ PFN_WDF_REQUEST_COMPLETION_ROUTINE CompletionRoutine
#define FSCTL_REQUEST_FILTER_OPLOCK
NTSTATUS NTAPI FsRtlOplockBreakToNone(IN PINTERNAL_OPLOCK Oplock, IN PIO_STACK_LOCATION Stack, IN PIRP Irp, IN PVOID Context, IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL)
#define STATUS_OPLOCK_BREAK_IN_PROGRESS
#define IRP_MJ_LOCK_CONTROL
#define ObReferenceObject
#define IRP_MJ_SET_INFORMATION
#define RtlZeroMemory(Destination, Length)
#define BROKEN_TO_NONE_FROM_LEVEL_2
NTSTATUS NTAPI FsRtlCheckOplock(IN POPLOCK Oplock, IN PIRP Irp, IN PVOID Context, IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL, IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL)
#define POOL_RAISE_IF_ALLOCATION_FAILURE
#define FILE_OPLOCK_BROKEN_TO_NONE
#define KeGetCurrentThread
VOID NTAPI FsRtlNotifyCompletion(IN PVOID Context, IN PIRP Irp)
VOID(NTAPI * POPLOCK_FS_PREPOST_IRP)(_In_ PVOID Context, _In_ PIRP Irp)
#define ExFreePoolWithTag(_P, _T)
VOID NTAPI FsRtlCancelOplockIIIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define FILE_COMPLETE_IF_OPLOCKED
_In_ PIRP _In_opt_ PVOID _In_opt_ POPLOCK_WAIT_COMPLETE_ROUTINE _In_opt_ POPLOCK_FS_PREPOST_IRP PostIrpRoutine
BOOLEAN NTAPI FsRtlOplockIsFastIoPossible(IN POPLOCK Oplock)
#define IRP_SYNCHRONOUS_PAGING_IO
PINTERNAL_OPLOCK FsRtlAllocateOplock(VOID)
PULONG MinorVersion OPTIONAL