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