IopFreeMiniCompletionPacket
VOID __stdcall IopFreeMiniCompletionPacket(_IOP_MINI_COMPLETION_PACKET *MiniPacket){
void(__fastcall *v2)(_IOP_MINI_COMPLETION_PACKET *, _QWORD);
struct _KPRCB *CurrentPrcb;
_GENERAL_LOOKASIDE *P;
if( *((_BYTE *)MiniPacket + 16) != 4 )
{
CurrentPrcb = KeGetCurrentPrcb();
P = CurrentPrcb->PPLookasideList[7].P;
++P->TotalFrees;
if( LOWORD(P->ListHead.Alignment) >= P->Depth )
{
++P->FreeMisses;
P = CurrentPrcb->PPLookasideList[7].L;
++P->TotalFrees;
if( LOWORD(P->ListHead.Alignment) >= P->Depth )
{
++P->FreeMisses;
ExFreePoolWithTag(MiniPacket, 0);
return;
}
if( *((_BYTE *)MiniPacket + 16) != 3 )
{
LABEL_7:
RtlpInterlockedPushEntrySList(&P->ListHead, (PSLIST_ENTRY)MiniPacket);
return;
}
}
else if( *((_BYTE *)MiniPacket + 16) != 3 )
{
goto LABEL_7;
}
ExReturnPoolQuota(MiniPacket);
goto LABEL_7;
}
v2 = (void(__fastcall *)(_IOP_MINI_COMPLETION_PACKET *, _QWORD))*((_QWORD *)MiniPacket + 7);
if( v2 )
{
v2(MiniPacket, *((_QWORD *)MiniPacket + 8));
}
else if( *((_BYTE *)MiniPacket + 72) )
{
ExFreePoolWithTag(MiniPacket, 0);
}
}Referenced by:
AlpcpAllocateCompletionPacketLookaside
IoFreeMiniCompletionPacket
IoRemoveIoCompletion
IopFreeCompletionListPackets