IopFreeIrpExtension

VOID __stdcall IopFreeIrpExtension(_IRP *Irp, _IRP_EXTENSION_TYPE Type, UINT8 FreeMemory){
  signed __int8 AllocationFlags; 
  _QWORD *IrpExtension; 
  UINT8 v5; 
  int v7; 

  AllocationFlags = Irp->AllocationFlags;
  IrpExtension = Irp->Tail.IrpExtension;
  v5 = FreeMemory;
  if( AllocationFlags < 0 )
  {
    Irp->Tail.IrpExtension = 0i64;
    Irp->AllocationFlags = AllocationFlags & 0x7F;
  }
  else if( IrpExtension )
  {
    if( Type == IopAllExtensions )
    {
      if( IopIrpHasExtensionType(Irp, 5ui64) )
        IrpExtension[5] = 0i64;
      *((_WORD *)IrpExtension + 1) = 0;
      LOWORD(v7) = 0;
    }
    else
    {
      v7 = *((unsigned __int16 *)IrpExtension + 1) & ~(1 << Type);
      *((_WORD *)IrpExtension + 1) = v7;
      if( Type == IopFsTrackOffsetType )
        IrpExtension[5] = 0i64;
    }
    if( !(_WORD)v7 && (Irp->AllocationFlags & 0x40) != 0 )
    {
      if( v5 )
      {
        ExFreePoolWithTag(IrpExtension, 0x58707249u);
        Irp->AllocationFlags &= ~0x40u;
        Irp->Tail.IrpExtension = 0i64;
      }
    }
  }
}

Referenced by:

IoCleanupIrp
IoClearAdapterCryptoEngineExtension
IoClearFsTrackOffsetState
IoSetActivityIdIrp
IopCompleteRequest
IopFreeIrp
IopPerfCompleteRequest
IopfCompleteRequest