IoMakeAssociatedIrpPriv

IRP *__stdcall IoMakeAssociatedIrpPriv(IRP *Irp, DEVICE_OBJECT *DeviceObject, INT8 StackSize){
  CHAR IsActivityTracingEnabled; 
  unsigned int v6; 
  IRP *v7; 
  __int64 v8; 
  struct _KPRCB *CurrentPrcb; 
  unsigned __int16 v10; 
  __int64 v11; 
  __int64 v12; 
  __int16 v13; 
  __int64 v14; 
  _WORD *v15; 
  char v16; 
  _WORD *v17; 
  __int16 v18; 
  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 > (char)IopLargeIrpStackLocations )
    goto LABEL_29;
  v20 = 4;
  if( StackSize == 1 )
  {
    v12 = 0i64;
    v11 = 2048i64;
  }
  else
  {
    if( StackSize <= (char)IopMediumIrpStackLocations )
    {
      v11 = 2064i64;
      v12 = 16i64;
      v13 = 9 * (char)IopMediumIrpStackLocations;
    }
    else
    {
      v11 = 2080i64;
      v12 = 32i64;
      v13 = 9 * (char)IopLargeIrpStackLocations;
    }
    v10 = 8 * v13 + 208;
  }
  v14 = *(_QWORD *)((char *)CurrentPrcb + v11);
  ++*(_DWORD *)(v14 + 20);
  v15 = RtlpInterlockedPopEntrySList((PSLIST_HEADER)v14);
  if( !v15 )
  {
    ++*(_DWORD *)(v14 + 24);
    v14 = *(_QWORD *)((char *)CurrentPrcb + v12 + 2056);
    ++*(_DWORD *)(v14 + 20);
    v15 = RtlpInterlockedPopEntrySList((PSLIST_HEADER)v14);
    if( !v15 )
      ++*(_DWORD *)(v14 + 24);
  }
  if( (IopIrpStackProfilerFlags & 3) != 0 )
  {
    if( !v15 )
      goto LABEL_29;
    if( *((_QWORD *)v15 + 7) >= (unsigned __int64)(unsigned __int16)(72 * StackSize + 208) )
    {
      v10 = v15[28];
      goto LABEL_17;
    }
    ++*(_DWORD *)(v14 + 28);
    ExFreePoolWithTag(v15, 0);
LABEL_29:
    result = (IRP *)ExAllocatePoolWithTag(NonPagedPoolNx, v10, 0x20707249ui64);
    v15 = result;
    if( !result )
      return result;
    goto LABEL_18;
  }
LABEL_17:
  if( !v15 )
    goto LABEL_29;
LABEL_18:
  memset((INT64)v15, 0i64);
  *((_BYTE *)v15 + 66) = StackSize;
  *v15 = 6;
  *((_BYTE *)v15 + 67) = StackSize + 1;
  v15[1] = v10;
  v16 = *((_BYTE *)KeGetCurrentThread() + 586);
  *((_QWORD *)v15 + 5) = v15 + 16;
  *((_QWORD *)v15 + 4) = v15 + 16;
  *((_BYTE *)v15 + 70) = v16;
  v17 = &v15[32 * StackSize + 104 + 4 * StackSize];
  *((_QWORD *)v15 + 23) = v17;
  v18 = *((_WORD *)CurrentPrcb + 18);
  *((_DWORD *)v15 + 4) |= 8u;
  v15[2] = v18;
  *((_DWORD *)v15 + 4) |= *((_DWORD *)Irp + 4) & 0xE0002;
  *((_BYTE *)v15 + 71) |= v20;
  *((_QWORD *)v15 + 19) = *((_QWORD *)Irp + 19);
  *((_QWORD *)v15 + 3) = Irp;
  if( v21 )
  {
    --*((_BYTE *)v15 + 67);
    --*((_BYTE *)v15 + 66);
    *((_QWORD *)v15 + 23) = v17 - 36;
    *((_QWORD *)v15 + 25) = v17 - 36;
  }
  if( IopIsActivityTracingEnabled() && IopIrpHasExtensionType(Irp, 0i64) )
    IoSetActivityIdIrp((_IRP *)v15, (_GUID *)(*((_QWORD *)Irp + 25) + 24i64));
  if( IopIrpHasExtensionType(Irp, 6ui64) )
    IopSetDiskIoAttributionExtension((_IRP *)v15, *(_QWORD *)(*((_QWORD *)Irp + 25) + 16i64));
  if( IopIrpHasExtensionType(Irp, 8ui64) )
    IopSetDriverFlagsExtension((INT64)v15, *(_QWORD *)(*((_QWORD *)Irp + 25) + 56i64));
  return(IRP *)v15;
}

Referenced by:

IoMakeAssociatedIrp
IoMakeAssociatedIrpEx