ExpSaBinaryArrayInsert

UINT64 __stdcall ExpSaBinaryArrayInsert(_EX_SA_BINARY_ARRAY *Array, VOID *Element){
  unsigned __int16 v2; 
  unsigned int v3; 
  unsigned int v6; 
  __int64 *v7; 
  unsigned int v8; 
  UINT64 v9; 
  __int64 *PoolWithTagFromNode; 
  __int64 v11; 
  __int64 i; 
  unsigned int v13; 
  INT64 v15; 

  v3 = v2;
  v6 = 0;
  while( 1 )
  {
    v7 = *(__int64 **)Array;
    v8 = 1 << (v6 + 2);
    if( !*(_QWORD *)Array )
    {
      LODWORD(v15) = 0;
      v9 = v3;
      LODWORD(v9) = v3 | 0x80000000;
      PoolWithTagFromNode = (__int64 *)ExpAllocatePoolWithTagFromNode(0x200ui64, 8 * v8 + 8, 0x61537845ui64, v9, v15);
      v7 = PoolWithTagFromNode;
      if( PoolWithTagFromNode )
        memset(PoolWithTagFromNode, 0i64, 8 * v8 + 8);
      if( !v7 )
        return(unsigned int)-1;
      *(_QWORD *)Array = v7;
    }
    v11 = *v7;
    if( *v7 < (unsigned __int64)v8 )
      break;
    ++v6;
    Array += 2;
    if( v6 >= 0x10 )
      return(unsigned int)-1;
  }
  for( i = (unsigned int)v11; v7[i + 1]; i = (v8 - 1) & ((_DWORD)i + 1) )
    ;
  v13 = i | v8;
  *v7 = v11 + 1;
  v7[i + 1] = (__int64)Element;
  return v13;
}

Referenced by:

ExpSaPageGroupDescriptorAllocate