EtwpFillPerfectHashTable

UINT16 __stdcall EtwpFillPerfectHashTable(
        UINT16 *EventIds,
        UINT16 Size,
        UINT8 Rotate,
        UINT16 Mask,
        _ETW_PERFECT_HASH_TABLE_VALUE *PerfectHashTable,
        UINT16 *MaxIndirectMappedCount){
  __int64 v6; 
  int v7; 
  _ETW_PERFECT_HASH_TABLE_VALUE *v10; 
  __int64 v11; 
  unsigned __int16 v12; 
  UINT16 v13; 
  unsigned __int16 v14; 
  UINT16 v15; 
  UINT16 Next; 
  unsigned int v17; 
  unsigned __int16 v18; 
  unsigned __int16 i; 
  unsigned __int16 j; 
  __int64 v22; 
  unsigned __int16 v23; 
  __int64 v24; 
  unsigned __int16 v25; 
  unsigned __int16 v26; 

  LOWORD(v6) = 0;
  v7 = Mask;
  v10 = PerfectHashTable;
  *MaxIndirectMappedCount = 0;
  v11 = 128i64;
  v12 = Mask + 1;
  v26 = Mask + 1;
  v13 = Mask + 1;
  do
  {
    v10->Value = -1;
    v10->Next = -1;
    ++v10;
    --v11;
  }
  while( v11 );
  if( Size )
  {
    v6 = Size;
    do
    {
      v14 = *EventIds;
      v15 = 0;
      Next = v7 & __ROR2__(*EventIds, Rotate);
      while( PerfectHashTable[Next].Value != 0xFFFF )
      {
        v22 = Next;
        if( PerfectHashTable[Next].Value == v14 )
          break;
        Next = PerfectHashTable[Next].Next;
        ++v15;
        if( Next == 255 )
        {
          Next = v13++;
          PerfectHashTable[v22].Next = Next;
        }
        if( v15 > *MaxIndirectMappedCount )
          *MaxIndirectMappedCount = v15;
      }
      ++EventIds;
      PerfectHashTable[Next].Value = v14;
      --v6;
    }
    while( v6 );
    v12 = v26;
  }
  v17 = v7 + 1;
  v18 = v13 - 1;
  for( i = v6; v18 > v17 && i < (unsigned __int16)v7; ++i )
  {
    if( PerfectHashTable[v18].Next == 0xFF )
    {
      do
      {
        if( PerfectHashTable[i].Value == 0xFFFF )
          break;
        ++i;
      }
      while( i < (unsigned __int16)v7 );
      if( i >= (unsigned __int16)v7 )
        break;
      PerfectHashTable[i].Value = PerfectHashTable[v18].Value;
      v23 = v6;
      if( (unsigned __int16)v6 < v13 )
      {
        while( PerfectHashTable[v23].Next != v18 )
        {
          if( ++v23 >= v13 )
            goto LABEL_30;
        }
        PerfectHashTable[v23].Next = i;
LABEL_30:
        LOWORD(v6) = 0;
      }
      PerfectHashTable[v18].Value = -1;
      if( v18 == v13 - 1 )
        --v13;
    }
    --v18;
  }
  for( j = v13 - 1; j > v17; ++v12 )
  {
    if( v12 >= j )
      break;
    do
    {
      if( PerfectHashTable[v12].Value == 0xFFFF )
        break;
      ++v12;
    }
    while( v12 < j );
    if( v12 >= j )
      break;
    v24 = j;
    v25 = 0;
    PerfectHashTable[v12].Value = PerfectHashTable[j].Value;
    if( v13 )
    {
      while( PerfectHashTable[v25].Next != j )
      {
        if( ++v25 >= v13 )
          goto LABEL_43;
      }
      PerfectHashTable[v25].Next = v12;
    }
LABEL_43:
    --j;
    PerfectHashTable[v12].Next = PerfectHashTable[v24].Next;
    --v13;
  }
  return v13;
}

Referenced by:

EtwpCreatePerfectHashFunction