ObpCreateTypeArray

_OBJECT_TYPE_ARRAY *__stdcall ObpCreateTypeArray(_OBJECT_TYPE *ObjectType){
  _ETHREAD *CurrentThread; 
  ULONG_PTR v3; 
  _OBJECT_TYPE *Flink; 
  _OBJECT_TYPE_ARRAY *v5; 
  unsigned int v6; 
  __int64 v7; 
  VOID **PoolWithTag; 
  __int64 v9; 
  _OBJECT_TYPE *v10; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.SpecialApcDisable;
  v3 = (_DWORD)ObjectType + 184;
  ExAcquirePushLockExclusiveEx(&ObjectType->TypeLock, 0i64);
  Flink = (_OBJECT_TYPE *)ObjectType->TypeList.Flink;
  v5 = 0i64;
  v6 = 0;
  if( (_OBJECT_TYPE *)ObjectType->TypeList.Flink != ObjectType )
  {
    do
    {
      Flink = (_OBJECT_TYPE *)Flink->TypeList.Flink;
      v7 = v6++;
    }
    while( Flink != ObjectType );
    if( v6 )
    {
      PoolWithTag = ExAllocatePoolWithTag(1ui64, 8 * v7 + 16, 1916887631i64);
      v5 = (_OBJECT_TYPE_ARRAY *)PoolWithTag;
      if( PoolWithTag )
      {
        *(_DWORD *)PoolWithTag = v6;
        v9 = 0i64;
        v10 = (_OBJECT_TYPE *)ObjectType->TypeList.Flink;
        while( v10 != ObjectType )
        {
          *(_QWORD *)&v5[2 * v9 + 2] = v10;
          if( !ObReferenceObjectSafe((INT64)&v10->TypeInfo.GenericMapping.GenericWrite) )
            *(_QWORD *)&v5[2 * v9 + 2] = 0i64;
          v10 = (_OBJECT_TYPE *)v10->TypeList.Flink;
          v9 = (unsigned int)(v9 + 1);
        }
      }
    }
  }
  ExReleasePushLockEx(v3, 0);
  KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
  return v5;
}

Referenced by:

ObEnumerateObjectsByType
ObGetObjectInformation