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