FsRtlpRemoveAndBreakRHIrp
VOID __stdcall FsRtlpRemoveAndBreakRHIrp(
VOID *Link,
_NONOPAQUE_OPLOCK *Oplock,
UINT8 RemoveCancelRoutine,
INT64 CompletionStatus,
UINT64 NewOplockLevel,
UINT64 OutputFlags,
UINT64 AccessMode,
UINT16 ShareMode){
__int64 v8;
int v9;
__int64 v12;
__int64 v13;
_CCHAR v14;
int v15;
v8 = *((_QWORD *)Link + 2);
v9 = CompletionStatus;
*((_QWORD *)Link + 2) = 0i64;
if( RemoveCancelRoutine )
{
*(_BYTE *)(v8 + 69) = KeAcquireQueuedSpinLock(7i64, (INT64)Oplock, RemoveCancelRoutine);
_InterlockedExchange64((volatile __int64 *)(v8 + 104), 0i64);
KeReleaseQueuedSpinLock(LockQueueIoCancelLock, *(_BYTE *)(v8 + 69));
}
FsRtlpOplockDequeueRH((_RH_OP_CONTEXT *)Link);
if( *(_BYTE *)(v8 + 68) )
{
ObfDereferenceObjectWithTag(*((VOID **)Link + 3), 0x746C6644ui64);
if( *((_QWORD *)Link + 5) )
FsRtlpClearOwner(Oplock, (_RH_OP_CONTEXT *)Link);
ExFreePoolWithTag(Link, 0);
v13 = 0i64;
}
else
{
v12 = *(_QWORD *)(v8 + 24);
v13 = 24i64;
*(_QWORD *)(v12 + 16) = 0i64;
*(_DWORD *)v12 = 1572865;
*(_DWORD *)(v12 + 4) = 3;
*(_DWORD *)(v12 + 8) = ((unsigned int)NewOplockLevel >> 12) & 7;
*(_DWORD *)(v12 + 12) = OutputFlags;
if( (OutputFlags & 2) != 0 )
{
*(_DWORD *)(v12 + 16) = AccessMode;
*(_WORD *)(v12 + 20) = ShareMode;
}
if( (OutputFlags & 1) != 0 )
{
*((_DWORD *)Link + 12) = *((_DWORD *)Link + 12) & 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(*((VOID **)Link + 3), 0x746C6644ui64);
if( *((_QWORD *)Link + 5) )
FsRtlpClearOwner(Oplock, (_RH_OP_CONTEXT *)Link);
ExFreePoolWithTag(Link, 0);
}
}
*(_QWORD *)(v8 + 56) = v13;
v15 = -1073741536;
LOBYTE(v14) = 1;
if( !*(_BYTE *)(v8 + 68) )
v15 = v9;
*(_DWORD *)(v8 + 48) = v15;
IofCompleteRequest((PIRP)v8, v14);
}Referenced by:
FsRtlUninitializeOplock
FsRtlpCancelOplockRHIrp
FsRtlpOplockBreakByCacheFlags
FsRtlpOplockCleanup
FsRtlpRequestExclusiveOplock
FsRtlpRequestShareableOplock