IopFreeIrp

VOID __stdcall IopFreeIrp(IRP *Irp){
  CHAR v1; 
  char v3; 
  __int64 v4; 
  struct _KPRCB *CurrentPrcb; 
  char v6; 
  __int16 v7; 
  __int64 v8; 
  __int64 v9; 
  __int64 v10; 
  __int64 v11; 
  char v12; 
  if( *(_WORD *)Irp != 6 )
    KeBugCheckEx(0x44u, (ULONG_PTR)Irp, 0x257Cui64, 0i64, 0i64);
  *(_WORD *)Irp = 0;
  v3 = *((_BYTE *)Irp + 71);
  if( (v3 & 0x40) != 0 )
  {
    IopFreeIrpExtension((__int64)Irp, -1, 1);
    v3 = *((_BYTE *)Irp + 71);
  }
  if( (v3 & 0x21) == 33 )
  {
    IopFreeReserveIrp(Irp, v1);
  }
  else
  {
    v4 = *((unsigned __int16 *)Irp + 2);
    if( (unsigned int)v4 >= (unsigned int)KeNumberProcessors_0 )
    {
      CurrentPrcb = KeGetCurrentPrcb();
    }
    else
    {
      _mm_lfence();
      CurrentPrcb = *(&KiProcessorBlock + v4);
    }
    v6 = *((_BYTE *)Irp + 71);
    if( (v6 & 8) != 0 )
    {
      *((_BYTE *)Irp + 71) = v6 ^ 8;
      _InterlockedIncrement((volatile signed __int32 *)CurrentPrcb + 2919);
      v6 = *((_BYTE *)Irp + 71);
    }
    if( (v6 & 4) != 0
      && ((IopIrpStackProfilerFlags & 3) == 0
       || (v7 = *((_WORD *)Irp + 1), v7 == 72 * (char)IopLargeIrpStackLocations + 208)
       || v7 == 72 * (char)IopMediumIrpStackLocations + 208
       || v7 == 280) )
    {
      v8 = *((unsigned __int16 *)Irp + 1);
      if( (unsigned __int16)v8 < (unsigned __int16)(72 * (char)IopLargeIrpStackLocations + 208) )
      {
        if( (unsigned __int16)v8 >= (unsigned __int16)(72 * (char)IopMediumIrpStackLocations + 208) )
        {
          v9 = 2064i64;
          v10 = 2072i64;
        }
        else
        {
          v9 = 2048i64;
          v10 = 2056i64;
        }
      }
      else
      {
        v9 = 2080i64;
        v10 = 2088i64;
      }
      *((_QWORD *)Irp + 7) = v8;
      v11 = *(_QWORD *)((char *)CurrentPrcb + v9);
      ++*(_DWORD *)(v11 + 28);
      if( *(_WORD *)v11 < *(_WORD *)(v11 + 16)
        || (++*(_DWORD *)(v11 + 32),
            v11 = *(_QWORD *)((char *)CurrentPrcb + v10),
            ++*(_DWORD *)(v11 + 28),
            *(_WORD *)v11 < *(_WORD *)(v11 + 16)) )
      {
        v12 = *((_BYTE *)Irp + 71);
        if( (v12 & 1) != 0 )
        {
          *((_BYTE *)Irp + 71) = v12 ^ 1;
          ExReturnPoolQuota(Irp);
        }
        RtlpInterlockedPushEntrySList((PSLIST_HEADER)v11, (PSLIST_ENTRY)Irp);
      }
      else
      {
        ++*(_DWORD *)(v11 + 32);
        ExFreePoolWithTag(Irp, 0);
      }
    }
    else
    {
      ExFreePoolWithTag(Irp, 0);
    }
  }
}

Referenced by:

IoFreeIrp
IopCompleteRequest
IopfCompleteRequest
IovFreeIrpPrivate