RtlSidHashLookup
SID_AND_ATTRIBUTES *__stdcall RtlSidHashLookup(SID_AND_ATTRIBUTES_HASH *SidAttrHash, PVOID Sid){
unsigned __int8 v4;
__int16 v5;
unsigned int v6;
unsigned int v7;
unsigned __int64 i;
unsigned int SidCount;
int v11;
_SID_AND_ATTRIBUTES *SidAttr;
int v13;
SID_AND_ATTRIBUTES *v14;
_SID_AND_ATTRIBUTES *v15;
unsigned int v16;
PVOID *p_Sid;
int v18;
_SID_AND_ATTRIBUTES *v19;
if( !SidAttrHash || !Sid )
return 0i64;
v4 = 0;
v5 = *(_WORD *)Sid;
v6 = 4 * *((unsigned __int8 *)Sid + 1) + 8;
v7 = *((unsigned __int8 *)Sid + 4 * ((unsigned __int64)*(unsigned __int16 *)Sid >> 8) + 4);
for( i = SidAttrHash->Hash[v7 & 0xF] & SidAttrHash->Hash[((unsigned __int64)v7 >> 4) + 16]; i; i >>= 8 )
{
LOBYTE(v11) = i;
if( (_BYTE)i )
{
SidAttr = SidAttrHash->SidAttr;
v19 = SidAttr;
v13 = v4;
do
{
v18 = *((unsigned __int8 *)SidHashByteToIndexLookupTable + (unsigned __int8)v11);
v14 = &SidAttr[v13 + v18];
if( *(_WORD *)v14->Sid == v5 )
{
if( !memcmp(Sid, v14->Sid, v6) )
return v14;
SidAttr = v19;
v13 = v4;
}
v11 = (unsigned __int8)v11 ^ (1 << v18);
}
while( (_BYTE)v11 );
}
v4 += 8;
}
SidCount = SidAttrHash->SidCount;
if( SidAttrHash->SidCount <= 0x40 )
return 0i64;
v15 = SidAttrHash->SidAttr;
v16 = 64;
while( 1 )
{
p_Sid = &v15[v16].Sid;
if( *(_WORD *)*p_Sid == v5 && !memcmp(Sid, *p_Sid, v6) )
break;
if( ++v16 >= SidCount )
return 0i64;
}
return &v15[v16];
}Referenced by:
SepSidInTokenSidHash
SepTokenIsOwner