EtwpFillPerfectHashTable

INT64 __fastcall EtwpFillPerfectHashTable(_WORD *a1, UINT16 a2, CHAR a3, UINT16 a4, INT64 a5, UINT16 *a6){
  __int64 v6; 
  int v7; 
  INT64 v10; 
  __int64 v11; 
  unsigned __int16 v12; 
  unsigned __int16 v13; 
  __int16 v14; 
  UINT16 v15; 
  unsigned __int16 v16; 
  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 = a4;
  v10 = a5;
  *a6 = 0;
  v11 = 128i64;
  v12 = a4 + 1;
  v26 = a4 + 1;
  v13 = a4 + 1;
  do
  {
    *(_WORD *)(v10 + 2) = -1;
    *(_BYTE *)v10 = -1;
    v10 += 4i64;
    --v11;
  }
  while( v11 );
  if( a2 )
  {
    v6 = a2;
    do
    {
      v14 = *a1;
      v15 = 0;
      v16 = v7 & __ROR2__(*a1, a3);
      while( *(_WORD *)(a5 + 4i64 * v16 + 2) != 0xFFFF )
      {
        v22 = v16;
        if( *(_WORD *)(a5 + 4i64 * v16 + 2) == v14 )
          break;
        v16 = *(unsigned __int8 *)(a5 + 4i64 * v16);
        ++v15;
        if( v16 == 255 )
        {
          v16 = v13++;
          *(_BYTE *)(a5 + 4 * v22) = v16;
        }
        if( v15 > *a6 )
          *a6 = v15;
      }
      ++a1;
      *(_WORD *)(a5 + 4i64 * v16 + 2) = v14;
      --v6;
    }
    while( v6 );
    v12 = v26;
  }
  v17 = v7 + 1;
  v18 = v13 - 1;
  for( i = v6; v18 > v17 && i < (unsigned __int16)v7; ++i )
  {
    if( *(_BYTE *)(a5 + 4i64 * v18) == 0xFF )
    {
      do
      {
        if( *(_WORD *)(a5 + 4i64 * i + 2) == 0xFFFF )
          break;
        ++i;
      }
      while( i < (unsigned __int16)v7 );
      if( i >= (unsigned __int16)v7 )
        break;
      *(_WORD *)(a5 + 4i64 * i + 2) = *(_WORD *)(a5 + 4i64 * v18 + 2);
      v23 = v6;
      if( (unsigned __int16)v6 < v13 )
      {
        while( *(unsigned __int8 *)(a5 + 4i64 * v23) != v18 )
        {
          if( ++v23 >= v13 )
            goto LABEL_30;
        }
        *(_BYTE *)(a5 + 4i64 * v23) = i;
LABEL_30:
        LOWORD(v6) = 0;
      }
      *(_WORD *)(a5 + 4i64 * v18 + 2) = -1;
      if( v18 == v13 - 1 )
        --v13;
    }
    --v18;
  }
  for( j = v13 - 1; j > v17; ++v12 )
  {
    if( v12 >= j )
      break;
    do
    {
      if( *(_WORD *)(a5 + 4i64 * v12 + 2) == 0xFFFF )
        break;
      ++v12;
    }
    while( v12 < j );
    if( v12 >= j )
      break;
    v24 = j;
    v25 = 0;
    *(_WORD *)(a5 + 4i64 * v12 + 2) = *(_WORD *)(a5 + 4i64 * j + 2);
    if( v13 )
    {
      while( *(unsigned __int8 *)(a5 + 4i64 * v25) != j )
      {
        if( ++v25 >= v13 )
          goto LABEL_43;
      }
      *(_BYTE *)(a5 + 4i64 * v25) = v12;
    }
LABEL_43:
    --j;
    *(_BYTE *)(a5 + 4i64 * v12) = *(_BYTE *)(a5 + 4 * v24);
    --v13;
  }
  return v13;
}

Referenced by:

EtwpCreatePerfectHashFunction