IopFreeIrp
VOID __stdcall IopFreeIrp(IRP *Irp){
CHAR v1;
char v3;
__int64 v4;
struct _KPRCB *CurrentPrcb;
char v6;
__int16 v7;
__int64 v8;
__int64 v9;
__int64 v10;
__int64 v11;
char v12;
if( *(_WORD *)Irp != 6 )
KeBugCheckEx(0x44u, (ULONG_PTR)Irp, 0x257Cui64, 0i64, 0i64);
*(_WORD *)Irp = 0;
v3 = *((_BYTE *)Irp + 71);
if( (v3 & 0x40) != 0 )
{
IopFreeIrpExtension((__int64)Irp, -1, 1);
v3 = *((_BYTE *)Irp + 71);
}
if( (v3 & 0x21) == 33 )
{
IopFreeReserveIrp(Irp, v1);
}
else
{
v4 = *((unsigned __int16 *)Irp + 2);
if( (unsigned int)v4 >= (unsigned int)KeNumberProcessors_0 )
{
CurrentPrcb = KeGetCurrentPrcb();
}
else
{
_mm_lfence();
CurrentPrcb = *(&KiProcessorBlock + v4);
}
v6 = *((_BYTE *)Irp + 71);
if( (v6 & 8) != 0 )
{
*((_BYTE *)Irp + 71) = v6 ^ 8;
_InterlockedIncrement((volatile signed __int32 *)CurrentPrcb + 2919);
v6 = *((_BYTE *)Irp + 71);
}
if( (v6 & 4) != 0
&& ((IopIrpStackProfilerFlags & 3) == 0
|| (v7 = *((_WORD *)Irp + 1), v7 == 72 * (char)IopLargeIrpStackLocations + 208)
|| v7 == 72 * (char)IopMediumIrpStackLocations + 208
|| v7 == 280) )
{
v8 = *((unsigned __int16 *)Irp + 1);
if( (unsigned __int16)v8 < (unsigned __int16)(72 * (char)IopLargeIrpStackLocations + 208) )
{
if( (unsigned __int16)v8 >= (unsigned __int16)(72 * (char)IopMediumIrpStackLocations + 208) )
{
v9 = 2064i64;
v10 = 2072i64;
}
else
{
v9 = 2048i64;
v10 = 2056i64;
}
}
else
{
v9 = 2080i64;
v10 = 2088i64;
}
*((_QWORD *)Irp + 7) = v8;
v11 = *(_QWORD *)((char *)CurrentPrcb + v9);
++*(_DWORD *)(v11 + 28);
if( *(_WORD *)v11 < *(_WORD *)(v11 + 16)
|| (++*(_DWORD *)(v11 + 32),
v11 = *(_QWORD *)((char *)CurrentPrcb + v10),
++*(_DWORD *)(v11 + 28),
*(_WORD *)v11 < *(_WORD *)(v11 + 16)) )
{
v12 = *((_BYTE *)Irp + 71);
if( (v12 & 1) != 0 )
{
*((_BYTE *)Irp + 71) = v12 ^ 1;
ExReturnPoolQuota(Irp);
}
RtlpInterlockedPushEntrySList((PSLIST_HEADER)v11, (PSLIST_ENTRY)Irp);
}
else
{
++*(_DWORD *)(v11 + 32);
ExFreePoolWithTag(Irp, 0);
}
}
else
{
ExFreePoolWithTag(Irp, 0);
}
}
}Referenced by:
IoFreeIrp
IopCompleteRequest
IopfCompleteRequest
IovFreeIrpPrivate