FsRtlpOplockBreakNotify
NTSTATUS __stdcall FsRtlpOplockBreakNotify(_NONOPAQUE_OPLOCK *Oplock, _IO_STACK_LOCATION *IrpSp, _IRP *Irp){
char v6;
unsigned int OplockState;
NTSTATUS v8;
if( !Oplock )
{
Irp->IoStatus.Status = 0;
IofCompleteRequest(Irp, 1);
return 0;
}
ExAcquireFastMutexUnsafe(Oplock->FastMutex);
v6 = 1;
OplockState = Oplock->OplockState;
if( (OplockState & 0x1F00F00) != 0
|| Oplock->RHBreakQueue.Flink != &Oplock->RHBreakQueue
|| (OplockState & 0x20000) != 0 )
{
if( (OplockState & 0x80u) == 0 )
{
v6 = 0;
Irp->IoStatus.Status = 0;
FsRtlpModifyThreadPriorities(Oplock, 0i64, 1u);
FsRtlpOplockSendModernAppTermination(Oplock, 0i64);
v8 = FsRtlpWaitOnIrp(
(__int64)Oplock,
(__int64)Irp,
0i64,
(void(__fastcall *)(void *, _IRP *))FsRtlpNotifyOplockBreakComplete,
0i64,
0i64,
0,
0i64,
0i64,
0i64,
0i64);
goto LABEL_10;
}
Oplock->OplockState = Oplock->OplockState & 0x20 | 1;
Oplock->FileObject = 0i64;
}
Irp->IoStatus.Status = 0;
IofCompleteRequest(Irp, 1);
v8 = 0;
LABEL_10:
if( v6 )
ExReleaseFastMutexUnsafe(Oplock->FastMutex);
return v8;
}Referenced by:
FsRtlpOplockFsctrlInternal