ObpFreeObjectNameBuffer
VOID __stdcall ObpFreeObjectNameBuffer(_UNICODE_STRING *ObjectName){
_SLIST_ENTRY *Buffer;
struct _KPRCB *CurrentPrcb;
_GENERAL_LOOKASIDE *P;
Buffer = (_SLIST_ENTRY *)ObjectName->Buffer;
if( ObjectName->MaximumLength == 248 )
{
CurrentPrcb = KeGetCurrentPrcb();
P = CurrentPrcb->PPLookasideList[5].P;
++P->TotalFrees;
if( LOWORD(P->ListHead.Alignment) < P->Depth
|| (++P->FreeMisses,
P = CurrentPrcb->PPLookasideList[5].L,
++P->TotalFrees,
LOWORD(P->ListHead.Alignment) < P->Depth) )
{
RtlpInterlockedPushEntrySList(&P->ListHead, Buffer);
}
else
{
++P->FreeMisses;
((void(__fastcall *)(_SLIST_ENTRY *))P->FreeEx)(Buffer);
}
}
else
{
ExFreePoolWithTag(ObjectName->Buffer, 0);
}
}Referenced by:
CmpCreateKeyBody
IopAllocRealFileObject
ObCreateObjectEx
ObReferenceObjectByName
ObReferenceObjectByNameEx