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