ObpGetObjectRefInfo
NTSTATUS __stdcall ObpGetObjectRefInfo(_OBJECT_HEADER *ObjectHeader, _OBJECT_REF_INFO **RefInfo){
_OBJECT_REF_INFO *v3;
__int64 v4;
__int64 v5;
_OBJECT_REF_INFO *v6;
__int64 MaxStacks;
VOID **PoolWithTag;
v3 = 0i64;
v4 = (((unsigned int)((_DWORD)ObjectHeader + 48) >> 4) & 0xFFFFF) % 0x191;
v5 = (unsigned int)v4;
v6 = (_OBJECT_REF_INFO *)*((_QWORD *)ObjectTable + v4);
if( v6 )
{
do
{
if( v6->ObjectHeader == ObjectHeader )
break;
v3 = v6;
v6 = (_OBJECT_REF_INFO *)v6->NextRef;
}
while( v6 );
if( v6 )
{
MaxStacks = v6->MaxStacks;
if( v6->NextPos == (_WORD)MaxStacks )
{
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 12 * MaxStacks + 6184, 1951556175i64);
if( !PoolWithTag )
return -1073741801;
memmove(PoolWithTag, v6, 12 * v6->NextPos + 40);
*((_WORD *)PoolWithTag + 17) += 512;
if( v3 )
v3->NextRef = PoolWithTag;
else
*((_QWORD *)ObjectTable + v5) = PoolWithTag;
ExFreePoolWithTag(v6, 0x7452624Fu);
v6 = (_OBJECT_REF_INFO *)PoolWithTag;
}
}
}
*RefInfo = v6;
return 0;
}Referenced by:
ObpPushRefDerefInfo
ObpRegisterObject