RtlSidHashLookup
INT64 *__fastcall RtlSidHashLookup(INT64 a1, UINT64 *a2){
unsigned __int8 v4;
__int16 v5;
unsigned int v6;
unsigned int v7;
unsigned __int64 i;
unsigned int v9;
int v11;
__int64 v12;
int v13;
INT64 *v14;
__int64 v15;
unsigned int v16;
const VOID **v17;
int v18;
__int64 v19;
if( !a1 || !a2 )
return 0i64;
v4 = 0;
v5 = *(_WORD *)a2;
v6 = 4 * *((unsigned __int8 *)a2 + 1) + 8;
v7 = *((unsigned __int8 *)a2 + 4 * ((unsigned __int64)*(unsigned __int16 *)a2 >> 8) + 4);
for( i = *(_QWORD *)(a1 + 8i64 * (v7 & 0xF) + 16) & *(_QWORD *)(a1 + 8 * ((unsigned __int64)v7 >> 4) + 144); i; i >>= 8 )
{
LOBYTE(v11) = i;
if( (_BYTE)i )
{
v12 = *(_QWORD *)(a1 + 8);
v19 = v12;
v13 = v4;
do
{
v18 = *((unsigned __int8 *)SidHashByteToIndexLookupTable + (unsigned __int8)v11);
v14 = (INT64 *)(v12 + 16i64 * (unsigned int)(v13 + v18));
if( *(_WORD *)*v14 == v5 )
{
if( !memcmp(a2, (const VOID *)*v14, v6) )
return v14;
v12 = v19;
v13 = v4;
}
v11 = (unsigned __int8)v11 ^ (1 << v18);
}
while( (_BYTE)v11 );
}
v4 += 8;
}
v9 = *(_DWORD *)a1;
if( *(_DWORD *)a1 <= 0x40u )
return 0i64;
v15 = *(_QWORD *)(a1 + 8);
v16 = 64;
while( 1 )
{
v17 = (const VOID **)(v15 + 16i64 * v16);
if( *(_WORD *)*v17 == v5 && !memcmp(a2, *v17, v6) )
break;
if( ++v16 >= v9 )
return 0i64;
}
return(INT64 *)(v15 + 16i64 * v16);
}Referenced by:
SepSidInTokenSidHash
SepTokenIsOwner