IopAllocateIrpPrivate

_IRP *__stdcall IopAllocateIrpPrivate(
        _DEVICE_OBJECT *DeviceObject,
        CHAR StackSize,
        UINT8 ChargeQuota,
        PVOID ReturnAddress){
  char v4; 
  CHAR v6; 
  struct _KPRCB *CurrentPrcb; 
  char *v8; 
  INT64 v9; 
  __int64 v10; 
  unsigned __int16 v11; 
  __int64 v12; 
  __int16 v13; 
  __int64 v14; 
  char v15; 
  char v16; 
  INT64 v17; 
  _IRP *result; 
  INT64 v20; 
  char v21; 
  v4 = 0;
  v6 = StackSize;
  if( DeviceObject && (DeviceObject == (_DEVICE_OBJECT *)-1i64 || (*((_DWORD *)DeviceObject + 12) & 0x8000000) != 0) )
  {
    v6 = StackSize + 1;
    v4 = 1;
  }
  CurrentPrcb = KeGetCurrentPrcb();
  if( (IopIrpStackProfilerFlags & 3) != 0 && (IopIrpStackProfilerFlags & 4) != 0 && v6 < 20 )
  {
    v8 = (char *)CurrentPrcb + 4 * v6;
    ++*((_DWORD *)v8 + 8688);
    ++*((_DWORD *)CurrentPrcb + 8708);
    if( *((_DWORD *)v8 + 8688) - *((_DWORD *)v8 + 8709) > (unsigned int)IopIrpStackProfilerMinSizeThreshold
      && *((_DWORD *)CurrentPrcb + 8708) - *((_DWORD *)CurrentPrcb + 8729) > (unsigned int)IopIrpStackProfilerSampleSize )
    {
      _m_prefetchw(&IopIrpStackProfilerFlags);
      if( (_InterlockedAnd(&IopIrpStackProfilerFlags, 0xFFFFFFFB) & 4) != 0 )
        KeInsertQueueDpc(&IopIrpStackProfilerDpc, 0i64, 0i64);
    }
  }
  v9 = 0i64;
  v10 = v6;
  v21 = 0;
  v11 = 72 * v6 + 208;
  if( v6 <= (char)IopLargeIrpStackLocations && (!ChargeQuota || *((int *)CurrentPrcb + 2919) > 0) )
  {
    v21 = 4;
    if( v6 == 1 )
    {
      v12 = 2048i64;
    }
    else
    {
      if( v6 <= (char)IopMediumIrpStackLocations )
      {
        v9 = 16i64;
        v12 = 2064i64;
        v13 = 9 * (char)IopMediumIrpStackLocations;
      }
      else
      {
        v9 = 32i64;
        v12 = 2080i64;
        v13 = 9 * (char)IopLargeIrpStackLocations;
      }
      v11 = 8 * v13 + 208;
    }
    v14 = *(_QWORD *)((char *)CurrentPrcb + v12);
    v20 = v9;
    ++*(_DWORD *)(v14 + 20);
    v9 = (INT64)RtlpInterlockedPopEntrySList((PSLIST_HEADER)v14);
    if( !v9 )
    {
      ++*(_DWORD *)(v14 + 24);
      v14 = *(_QWORD *)((char *)CurrentPrcb + v20 + 2056);
      ++*(_DWORD *)(v14 + 20);
      v9 = (INT64)RtlpInterlockedPopEntrySList((PSLIST_HEADER)v14);
      if( !v9 )
        ++*(_DWORD *)(v14 + 24);
    }
    if( (IopIrpStackProfilerFlags & 3) != 0 && v9 )
    {
      if( *(_QWORD *)(v9 + 56) < (unsigned __int64)(unsigned __int16)(72 * v6 + 208) )
      {
        ++*(_DWORD *)(v14 + 28);
        ExFreePoolWithTag((PVOID)v9, 0);
        goto LABEL_43;
      }
      v11 = *(_QWORD *)(v9 + 56);
    }
    v10 = v6;
  }
  v15 = 0;
  if( v9 )
  {
    if( ChargeQuota && IopIrpCreditsEnabled > 1 )
    {
      _InterlockedDecrement((volatile signed __int32 *)CurrentPrcb + 2919);
      v15 = 8;
    }
    ChargeQuota = 0;
    goto LABEL_23;
  }
LABEL_43:
  if( ChargeQuota )
    result = (_IRP *)ExAllocatePoolWithQuotaTag((POOL_TYPE)520, v11, 0x20707249ui64);
  else
    result = (_IRP *)ExAllocatePoolWithTag(NonPagedPoolNx, v11, 0x20707249ui64);
  v9 = (INT64)result;
  if( !result )
    return result;
  v10 = v6;
  v15 = 0;
LABEL_23:
  memset(v9, 0i64);
  v16 = v21 | v15;
  *(_BYTE *)(v9 + 66) = v6;
  *(_WORD *)v9 = 6;
  *(_BYTE *)(v9 + 67) = v6 + 1;
  *(_WORD *)(v9 + 2) = v11;
  *(_BYTE *)(v9 + 70) = *((_BYTE *)KeGetCurrentThread() + 586);
  *(_QWORD *)(v9 + 40) = v9 + 32;
  *(_QWORD *)(v9 + 32) = v9 + 32;
  v17 = v9 + 8 * (v10 + 8 * v10 + 26);
  *(_QWORD *)(v9 + 184) = v17;
  *(_WORD *)(v9 + 4) = *((_WORD *)CurrentPrcb + 18);
  *(_BYTE *)(v9 + 71) = v16;
  if( ChargeQuota )
    *(_BYTE *)(v9 + 71) = v16 | 1;
  if( v4 )
  {
    --*(_BYTE *)(v9 + 67);
    --*(_BYTE *)(v9 + 66);
    *(_QWORD *)(v9 + 184) = v17 - 72;
    *(_QWORD *)(v9 + 200) = v17 - 72;
    if( (IopFunctionPointerMask & 4) != 0 && (IopIrpExtensionStatus & 1) != 0 )
      IopInitActivityIdIrp((_IRP *)v9);
  }
  return(_IRP *)v9;
}

Referenced by:

IoAllocateIrp
IoAllocateIrpEx
IopAllocateIrpExReturn
IopAllocateIrpWithExtension