FsRtlpRemoveAndCompleteRHIrp
INT8 __fastcall FsRtlpRemoveAndCompleteRHIrp(
VOID *P,
_NONOPAQUE_OPLOCK *Oplock,
INT64 a3,
UINT64 a4,
INT64 a5,
INT64 a6,
INT16 a7){
__int64 v7;
unsigned int v9;
int v10;
INT8 v12;
_KIRQL v13;
__int64 v14;
__int64 v15;
_CCHAR v16;
v7 = *((_QWORD *)P + 2);
*((_QWORD *)P + 2) = 0i64;
v9 = a4;
v10 = a3;
v12 = 1;
IoAcquireCancelSpinLock((PKIRQL)(v7 + 69));
_InterlockedExchange64((volatile __int64 *)(v7 + 104), 0i64);
LOBYTE(v13) = *(_BYTE *)(v7 + 69);
IoReleaseCancelSpinLock(v13);
FsRtlpOplockDequeueRH((_RH_OP_CONTEXT *)P);
if( *(_BYTE *)(v7 + 68) )
{
v10 = -1073741536;
v12 = 0;
HalPutDmaAdapter(*((PADAPTER_OBJECT *)P + 3));
if( *((_QWORD *)P + 5) )
FsRtlpClearOwner(Oplock, (_RH_OP_CONTEXT *)P);
ExFreePoolWithTag(P, 0);
v15 = 0i64;
}
else
{
v14 = *(_QWORD *)(v7 + 24);
v15 = 24i64;
*(_QWORD *)(v14 + 16) = 0i64;
*(_DWORD *)v14 = 1572865;
*(_DWORD *)(v14 + 4) = 3;
*(_DWORD *)(v14 + 8) = (v9 >> 12) & 7;
*(_DWORD *)(v14 + 12) = a5;
if( (a5 & 2) != 0 )
{
*(_DWORD *)(v14 + 16) = a6;
*(_WORD *)(v14 + 20) = a7;
}
if( (a5 & 1) != 0 )
{
*((_DWORD *)P + 12) = *((_DWORD *)P + 12) & 0xFF0FFFFF | (v9 != 0 ? 0x100000 : 0x800000);
FsRtlpOplockEnqueueRH(&Oplock->RHBreakQueue, P, 1i64);
FsRtlpModifyThreadPriorities(Oplock, (_RH_OP_CONTEXT *)P, 1u);
FsRtlpOplockSendModernAppTermination(Oplock, (_RH_OP_CONTEXT *)P);
}
else
{
HalPutDmaAdapter(*((PADAPTER_OBJECT *)P + 3));
if( *((_QWORD *)P + 5) )
FsRtlpClearOwner(Oplock, (_RH_OP_CONTEXT *)P);
ExFreePoolWithTag(P, 0);
}
}
*(_QWORD *)(v7 + 56) = v15;
LOBYTE(v16) = 1;
*(_DWORD *)(v7 + 48) = v10;
IofCompleteRequest((PIRP)v7, v16);
return v12;
}Referenced by:
FsRtlUninitializeOplock
FsRtlpCancelOplockRHIrp
FsRtlpOplockBreakByCacheFlags
FsRtlpOplockCleanup
FsRtlpRequestExclusiveOplock
FsRtlpRequestShareableOplock