FsRtlpRemoveAndBreakRHIrp
VOID __fastcall FsRtlpRemoveAndBreakRHIrp(
_LIST_ENTRY *Link,
_NONOPAQUE_OPLOCK *Oplock,
UINT8 RemoveCancelRoutine,
INT64 CompletionStatus,
UINT64 NewOplockLevel,
UINT64 OutputFlags,
UINT64 AccessMode,
UINT16 ShareMode){
_LIST_ENTRY *Flink;
int v9;
_LIST_ENTRY *Blink;
__int64 v13;
int v14;
Flink = Link[1].Flink;
v9 = CompletionStatus;
Link[1].Flink = 0i64;
if( RemoveCancelRoutine )
{
BYTE5(Flink[4].Flink) = KeAcquireQueuedSpinLock(7ui64);
_InterlockedExchange64((volatile __int64 *)&Flink[6].Blink, 0i64);
KeReleaseQueuedSpinLock(7ui64, BYTE5(Flink[4].Flink));
}
FsRtlpOplockDequeueRH((_RH_OP_CONTEXT *)Link);
if( BYTE4(Flink[4].Flink) )
{
ObfDereferenceObjectWithTag(Link[1].Blink, 0x746C6644ui64);
if( Link[2].Blink )
FsRtlpClearOwner((INT64)Oplock, (INT64)Link);
ExFreePoolWithTag(Link, 0);
v13 = 0i64;
}
else
{
Blink = Flink[1].Blink;
v13 = 24i64;
Blink[1].Flink = 0i64;
LODWORD(Blink->Flink) = 1572865;
HIDWORD(Blink->Flink) = 3;
LODWORD(Blink->Blink) = ((unsigned int)NewOplockLevel >> 12) & 7;
HIDWORD(Blink->Blink) = OutputFlags;
if( (OutputFlags & 2) != 0 )
{
LODWORD(Blink[1].Flink) = AccessMode;
WORD2(Blink[1].Flink) = ShareMode;
}
if( (OutputFlags & 1) != 0 )
{
LODWORD(Link[3].Flink) = (__int64)Link[3].Flink & 0xFF0FFFFF | ((_DWORD)NewOplockLevel != 0 ? 0x100000 : 0x800000);
FsRtlpOplockEnqueueRH(&Oplock->RHBreakQueue, Link, (unsigned int)-(int)NewOplockLevel);
FsRtlpModifyThreadPriorities(Oplock, (_RH_OP_CONTEXT *)Link, 1u);
FsRtlpOplockSendModernAppTermination(Oplock, (_RH_OP_CONTEXT *)Link);
}
else
{
ObfDereferenceObjectWithTag(Link[1].Blink, 0x746C6644ui64);
if( Link[2].Blink )
FsRtlpClearOwner((INT64)Oplock, (INT64)Link);
ExFreePoolWithTag(Link, 0);
}
}
Flink[3].Blink = (_LIST_ENTRY *)v13;
v14 = -1073741536;
if( !BYTE4(Flink[4].Flink) )
v14 = v9;
LODWORD(Flink[3].Flink) = v14;
IofCompleteRequest((_IRP *)Flink, 1);
}Referenced by:
FsRtlUninitializeOplock
FsRtlpCancelOplockRHIrp
FsRtlpOplockBreakByCacheFlags
FsRtlpOplockCleanup
FsRtlpRequestExclusiveOplock
FsRtlpRequestShareableOplock