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