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