SepCompareSidAndAttributeArrays

UINT8 __stdcall SepCompareSidAndAttributeArrays(
        _SID_AND_ATTRIBUTES *SidArray1,
        UINT64 Count1,
        _SID_AND_ATTRIBUTES *SidArray2,
        UINT64 Count2){
  unsigned int v4; 
  unsigned int v6; 
  _SID_AND_ATTRIBUTES *v7; 
  unsigned int v8; 
  unsigned int *p_Attributes; 
  signed __int64 v10; 
  unsigned int v12; 
  _SID_AND_ATTRIBUTES *v13; 
  unsigned int v14; 
  void *v15; 
  unsigned int v16; 
  _SID_AND_ATTRIBUTES *i; 
  unsigned int v18; 
  void *Sid; 
  unsigned int v21; 
  unsigned int v22; 

  v22 = Count2;
  v21 = Count1;
  v4 = Count2;
  v6 = Count1;
  v7 = SidArray1;
  if( (_DWORD)Count1 == (_DWORD)Count2 )
  {
    v8 = 0;
    if( (_DWORD)Count1 )
    {
      p_Attributes = &SidArray2->Attributes;
      v10 = (char *)SidArray1 - (char *)SidArray2;
      do
      {
        if( !RtlEqualSid(*(PVOID *)((char *)p_Attributes + v10 - 8), *((PVOID *)p_Attributes - 1)) )
          break;
        if( ((*(_BYTE *)p_Attributes ^ *((_BYTE *)p_Attributes + v10)) & 0x14) != 0 )
          break;
        ++v8;
        p_Attributes += 4;
      }
      while( v8 < v6 );
      v7 = SidArray1;
    }
    if( v8 == v6 )
      return 1;
    v12 = v8;
    if( v8 >= v6 )
    {
LABEL_21:
      v16 = v8;
      if( v8 >= v4 )
        return 1;
      for( i = &SidArray2[v8]; ; ++i )
      {
        v18 = v8;
        if( v8 < v6 )
        {
          Sid = i->Sid;
          do
          {
            if( RtlEqualSid(Sid, SidArray1[v18].Sid)
              && ((LOBYTE(i->Attributes) ^ LOBYTE(SidArray1[v18].Attributes)) & 0x14) == 0 )
            {
              break;
            }
            ++v18;
          }
          while( v18 < v6 );
          v4 = v22;
        }
        if( v18 == v6 )
          break;
        if( ++v16 >= v4 )
          return 1;
      }
    }
    else
    {
      v13 = &v7[v8];
      while( 1 )
      {
        v14 = v8;
        if( v8 < v4 )
        {
          v15 = v13->Sid;
          do
          {
            if( RtlEqualSid(v15, SidArray2[v14].Sid)
              && ((LOBYTE(v13->Attributes) ^ LOBYTE(SidArray2[v14].Attributes)) & 0x14) == 0 )
            {
              break;
            }
            ++v14;
          }
          while( v14 < v4 );
          v6 = v21;
        }
        if( v14 == v4 )
          break;
        ++v12;
        ++v13;
        if( v12 >= v6 )
          goto LABEL_21;
      }
    }
  }
  return 0;
}

Referenced by:

NtCompareTokens
SepCompareClaimAttributes