ObpCreateTypeArray

VOID __stdcall ObpCreateTypeArray(){
  _QWORD **v0; 
  _ETHREAD *CurrentThread; 
  _QWORD **v2; 
  UINT64 v3; 
  _QWORD *v4; 
  unsigned int v5; 
  __int64 v6; 
  _DWORD *PoolWithTag; 
  _DWORD *v8; 
  __int64 v9; 
  _QWORD *v10; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v2 = v0;
  --*((_WORD *)CurrentThread + 243);
  v3 = (UINT64)(v0 + 23);
  ExAcquirePushLockExclusiveEx((UINT64)(v0 + 23), 0i64);
  v4 = *v2;
  v5 = 0;
  if( *v2 != v2 )
  {
    do
    {
      v4 = (_QWORD *)*v4;
      v6 = v5++;
    }
    while( v4 != v2 );
    if( v5 )
    {
      PoolWithTag = ExAllocatePoolWithTag(PagedPool, 8 * v6 + 16, 0x7241624Fui64);
      v8 = PoolWithTag;
      if( PoolWithTag )
      {
        *PoolWithTag = v5;
        v9 = 0i64;
        v10 = *v2;
        while( v10 != v2 )
        {
          *(_QWORD *)&v8[2 * v9 + 2] = v10;
          if( !ObReferenceObjectSafe(v10 + 10) )
            *(_QWORD *)&v8[2 * v9 + 2] = 0i64;
          v10 = (_QWORD *)*v10;
          v9 = (unsigned int)(v9 + 1);
        }
      }
    }
  }
  ExReleasePushLockEx(v3, 0i64);
  KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}

Referenced by:

ObEnumerateObjectsByType
ObGetObjectInformation