IoMakeAssociatedIrpPriv

_IRP *__stdcall IoMakeAssociatedIrpPriv(_IRP *Irp, _DEVICE_OBJECT *DeviceObject, INT8 StackSize){
  UINT8 IsActivityTracingEnabled; 
  unsigned int v6; 
  _IRP *v7; 
  __int64 v8; 
  struct _KPRCB *CurrentPrcb; 
  unsigned __int16 v10; 
  __int64 v11; 
  __int64 v12; 
  __int16 v13; 
  _GENERAL_LOOKASIDE *L; 
  _WORD *p_Type; 
  unsigned __int8 ApcStateIndex; 
  _WORD *v17; 
  __int16 Number; 
  _IRP *result; 
  char v20; 
  char v21; 

  v21 = 0;
  IsActivityTracingEnabled = IopIsActivityTracingEnabled();
  v6 = 6;
  if( IsActivityTracingEnabled && IopIrpHasExtensionType(Irp, 0i64)
    || IopIrpHasExtensionType(Irp, v6)
    || IopIrpHasExtensionType(v7, 8ui64)
    || v8 && (*(_DWORD *)(v8 + 48) & 0x8000000) != 0 )
  {
    ++StackSize;
    v21 = 1;
  }
  CurrentPrcb = KeGetCurrentPrcb();
  v20 = 0;
  v10 = 72 * StackSize + 208;
  if( StackSize > *(&stru_140C452E0 + 2844) )
    goto LABEL_29;
  v20 = 4;
  if( StackSize == 1 )
  {
    v12 = 0i64;
    v11 = 2048i64;
  }
  else
  {
    if( StackSize <= *(&stru_140C452E0 + 2840) )
    {
      v11 = 2064i64;
      v12 = 1i64;
      v13 = 9 * *(&stru_140C452E0 + 2840);
    }
    else
    {
      v11 = 2080i64;
      v12 = 2i64;
      v13 = 9 * *(&stru_140C452E0 + 2844);
    }
    v10 = 8 * v13 + 208;
  }
  L = *(_GENERAL_LOOKASIDE **)((char *)&CurrentPrcb->_MxCsr + v11);
  ++L->TotalAllocates;
  p_Type = RtlpInterlockedPopEntrySList(&L->ListHead);
  if( !p_Type )
  {
    ++L->AllocateMisses;
    L = CurrentPrcb->PPLookasideList[v12].L;
    ++L->TotalAllocates;
    p_Type = RtlpInterlockedPopEntrySList(&L->ListHead);
    if( !p_Type )
      ++L->AllocateMisses;
  }
  if( (*(&stru_140C452E0 + 1144) & 3) != 0 )
  {
    if( !p_Type )
      goto LABEL_29;
    if( *((_QWORD *)p_Type + 7) >= (unsigned __int64)(unsigned __int16)(72 * StackSize + 208) )
    {
      v10 = p_Type[28];
      goto LABEL_17;
    }
    ++L->TotalFrees;
    ExFreePoolWithTag(p_Type, 0);
LABEL_29:
    result = (_IRP *)ExAllocatePoolWithTag(0x200ui64, v10, 544240201i64);
    p_Type = &result->Type;
    if( !result )
      return result;
    goto LABEL_18;
  }
LABEL_17:
  if( !p_Type )
    goto LABEL_29;
LABEL_18:
  memset(p_Type, 0i64, v10);
  *((_BYTE *)p_Type + 66) = StackSize;
  *p_Type = 6;
  *((_BYTE *)p_Type + 67) = StackSize + 1;
  p_Type[1] = v10;
  ApcStateIndex = KeGetCurrentThread()->ApcStateIndex;
  *((_QWORD *)p_Type + 5) = p_Type + 16;
  *((_QWORD *)p_Type + 4) = p_Type + 16;
  *((_BYTE *)p_Type + 70) = ApcStateIndex;
  v17 = &p_Type[32 * StackSize + 104 + 4 * StackSize];
  *((_QWORD *)p_Type + 23) = v17;
  Number = CurrentPrcb->Number;
  *((_DWORD *)p_Type + 4) |= 8u;
  p_Type[2] = Number;
  *((_DWORD *)p_Type + 4) |= Irp->Flags & 0xE0002;
  *((_BYTE *)p_Type + 71) |= v20;
  *((_QWORD *)p_Type + 19) = Irp->Tail.Thread;
  *((_QWORD *)p_Type + 3) = Irp;
  if( v21 )
  {
    --*((_BYTE *)p_Type + 67);
    --*((_BYTE *)p_Type + 66);
    *((_QWORD *)p_Type + 23) = v17 - 36;
    *((_QWORD *)p_Type + 25) = v17 - 36;
  }
  if( IopIsActivityTracingEnabled() && IopIrpHasExtensionType(Irp, 0i64) )
    IoSetActivityIdIrp((_IRP *)p_Type, (_GUID *)((char *)Irp->Tail.IrpExtension + 24));
  if( IopIrpHasExtensionType(Irp, 6ui64) )
    IopSetDiskIoAttributionExtension((_IRP *)p_Type, *((_QWORD *)Irp->Tail.IrpExtension + 2));
  if( IopIrpHasExtensionType(Irp, 8ui64) )
    IopSetDriverFlagsExtension((INT64)p_Type, *((_QWORD *)Irp->Tail.IrpExtension + 7));
  return(_IRP *)p_Type;
}

Referenced by:

IoMakeAssociatedIrp
IoMakeAssociatedIrpEx