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