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