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