IopFreeMiniCompletionPacket
VOID __fastcall IopFreeMiniCompletionPacket(struct SLIST_ENTRY *P){
void(__fastcall *v2)(struct SLIST_ENTRY *, _SLIST_ENTRY *);
struct _KPRCB *CurrentPrcb;
__int64 v4;
if( LOBYTE(P[1].Next) != 4 )
{
CurrentPrcb = KeGetCurrentPrcb();
v4 = *((_QWORD *)CurrentPrcb + 270);
++*(_DWORD *)(v4 + 28);
if( *(_WORD *)v4 >= *(_WORD *)(v4 + 16) )
{
++*(_DWORD *)(v4 + 32);
v4 = *((_QWORD *)CurrentPrcb + 271);
++*(_DWORD *)(v4 + 28);
if( *(_WORD *)v4 >= *(_WORD *)(v4 + 16) )
{
++*(_DWORD *)(v4 + 32);
ExFreePoolWithTag(P, 0);
return;
}
if( LOBYTE(P[1].Next) != 3 )
{
LABEL_7:
RtlpInterlockedPushEntrySList((PSLIST_HEADER)v4, P);
return;
}
}
else if( LOBYTE(P[1].Next) != 3 )
{
goto LABEL_7;
}
ExReturnPoolQuota(P);
goto LABEL_7;
}
v2 = (void(__fastcall *)(struct SLIST_ENTRY *, _SLIST_ENTRY *))*((_QWORD *)&P[3].Next + 1);
if( v2 )
{
v2(P, P[4].Next);
}
else if( *((_BYTE *)&P[4].Next + 8) )
{
ExFreePoolWithTag(P, 0);
}
}Referenced by:
AlpcpAllocateCompletionPacketLookaside
IoFreeMiniCompletionPacket
IoRemoveIoCompletion
IopFreeCompletionListPackets