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