ObpRegisterObject
VOID __stdcall ObpRegisterObject(_OBJECT_HEADER *ObjectHeader){
_ETHREAD *CurrentThread;
_OBJECT_REF_INFO *v3;
_OBJECT_REF_INFO *PoolWithTag;
unsigned int v5;
_OBJECT_REF_INFO *v6;
char v7;
unsigned __int8 v8;
_OBJECT_REF_INFO *RefInfo;
if( (xmmword_140CFB490 & 0x80u) != 0i64 )
EtwTraceObject(0x1130u, ObjectHeader);
if( (ObpTraceFlags & 0x73) != 0 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
RefInfo = 0i64;
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx(&stru_140C25A40, 0i64);
if( (ObpTraceFlags & 0x73) != 0
&& ((ObpTraceFlags & 0x20) == 0 || (KeGetCurrentThread()->ApcState.Process->Flags2 & 0x200) != 0)
&& ObpIsObjectPoolTagTraced(ObjectHeader)
&& ObpGetObjectRefInfo(ObjectHeader, &RefInfo) >= 0 )
{
v3 = RefInfo;
if( RefInfo )
goto LABEL_12;
PoolWithTag = (_OBJECT_REF_INFO *)ExAllocatePoolWithTag(0x200ui64, 0x17F8ui64, 1951556175i64);
RefInfo = PoolWithTag;
v3 = PoolWithTag;
if( PoolWithTag )
{
v5 = (((unsigned int)((_DWORD)ObjectHeader + 48) >> 4) & 0xFFFFF) % 0x191;
PoolWithTag->NextRef = (void *)*((_QWORD *)ObjectTable + v5);
*((_QWORD *)ObjectTable + v5) = PoolWithTag;
PoolWithTag->MaxStacks = 508;
LABEL_12:
++dword_140C25A14;
v3->ObjectHeader = ObjectHeader;
v6 = RefInfo;
RtlStringCbCopyA(
(INT8 *)RefInfo->ImageFileName,
0x10ui64,
(INT8 *)KeGetCurrentThread()->ApcState.Process->ImageFileName);
v6->NextPos = 0;
memset(v6->StackInfo, 0i64, 12 * v6->MaxStacks);
v7 = ObpTraceFlags;
v8 = ObjectHeader->TraceFlags | 1;
ObjectHeader->TraceFlags = v8;
if( (v7 & 0x40) != 0 )
ObjectHeader->TraceFlags = v8 | 2;
}
}
if( (_InterlockedExchangeAdd64(&stru_140C25A40._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&stru_140C25A40);
KeAbPostRelease(&stru_140C25A40);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
}Referenced by:
CmpCreateKeyBody
IopAllocRealFileObject
ObCreateObjectEx