SepAdjustGroups
INT64 __fastcall SepAdjustGroups(
_TOKEN *Token,
INT64 MakeChanges,
INT64 ResetToDefault,
UINT64 GroupCount,
_SID_AND_ATTRIBUTES *NewState,
_TOKEN_GROUPS *PreviousState,
void *SidBuffer,
UINT *ReturnLength,
UINT *ChangeCount,
UINT8 *ChangesMade){
unsigned int v11;
unsigned int v12;
char v14;
int v15;
UINT8 v16;
unsigned int v17;
__int64 v18;
_SID_AND_ATTRIBUTES *UserAndGroups;
__int64 v20;
char v21;
void *Sid;
unsigned int *p_Attributes;
_SID_AND_ATTRIBUTES *v25;
unsigned int Attributes;
unsigned int v27;
int v28;
unsigned int v29;
unsigned int v30;
unsigned int v31;
unsigned int v32;
unsigned int v33;
int v34;
_SID_AND_ATTRIBUTES Sid1;
int v36;
char v37;
char v38;
unsigned int v39;
char ChangeCounta;
v39 = GroupCount;
v38 = ResetToDefault;
v37 = MakeChanges;
v11 = 0;
v12 = 0;
v32 = 0;
v14 = MakeChanges;
v15 = 0;
*ChangeCount = 0;
v16 = 1;
v36 = 0;
v17 = 1;
v34 = 1;
if( Token->UserAndGroupCount <= 1 )
goto LABEL_11;
do
{
v18 = v17;
UserAndGroups = Token->UserAndGroups;
v20 = v18;
Sid1 = UserAndGroups[v20];
if( !(_BYTE)ResetToDefault )
{
v33 = 0;
v21 = 0;
ChangeCounta = 0;
if( !(_DWORD)GroupCount )
goto LABEL_9;
Sid = UserAndGroups[v20].Sid;
p_Attributes = &NewState->Attributes;
while( !v21 )
{
if( RtlEqualSid(Sid, *((PVOID *)p_Attributes - 1)) )
{
v25 = Token->UserAndGroups;
++v32;
ChangeCounta = 1;
Attributes = v25[v20].Attributes;
if( ((*(_BYTE *)p_Attributes ^ LOBYTE(v25[v20].Attributes)) & 4) != 0 )
{
if( (Attributes & 1) != 0 )
return 3221225565i64;
if( (Attributes & 0x10) != 0 )
return 3221226163i64;
v27 = (4 * *((unsigned __int8 *)Sid1.Sid + 1) + 11) & 0xFFFFFFFC;
v36 += v27;
if( v37 )
{
if( PreviousState )
{
PreviousState->Groups[*ChangeCount].Attributes = Sid1.Attributes;
PreviousState->Groups[*ChangeCount].Sid = SidBuffer;
RtlCopySid(v27, SidBuffer, Sid1.Sid);
v25 = Token->UserAndGroups;
SidBuffer = (char *)SidBuffer + v27;
}
v25[v20].Attributes &= ~(v25[v20].Attributes & 4);
Token->UserAndGroups[v20].Attributes |= *p_Attributes & 4;
}
++*ChangeCount;
Sid = Sid1.Sid;
}
}
p_Attributes += 4;
LODWORD(GroupCount) = v39;
++v33;
v21 = ChangeCounta;
if( v33 >= v39 )
goto LABEL_8;
}
goto LABEL_8;
}
v28 = UserAndGroups[v20].Attributes & 6;
if( ((v28 - 2) & 0xFFFFFFFD) == 0 )
{
v29 = (4 * *((unsigned __int8 *)Sid1.Sid + 1) + 11) & 0xFFFFFFFC;
v36 = v29 + v15;
if( v14 )
{
if( PreviousState )
{
PreviousState->Groups[*ChangeCount].Attributes = Sid1.Attributes;
PreviousState->Groups[*ChangeCount].Sid = SidBuffer;
RtlCopySid(v29, SidBuffer, Sid1.Sid);
UserAndGroups = Token->UserAndGroups;
LODWORD(GroupCount) = v39;
SidBuffer = (char *)SidBuffer + v29;
}
v30 = UserAndGroups[v20].Attributes;
if( v28 == 2 )
v31 = v30 | 4;
else
v31 = v30 & 0xFFFFFFFB;
UserAndGroups[v20].Attributes = v31;
}
++*ChangeCount;
LABEL_8:
LOBYTE(ResetToDefault) = v38;
}
LABEL_9:
v15 = v36;
v17 = v34 + 1;
v14 = v37;
v34 = v17;
}
while( v17 < Token->UserAndGroupCount );
v11 = v32;
LABEL_11:
if( !(_BYTE)ResetToDefault && v11 < (unsigned int)GroupCount )
v12 = 262;
if( !*ChangeCount || !v14 )
v16 = 0;
*ChangesMade = v16;
if( PreviousState )
*ReturnLength = 16 * *ChangeCount + 8 + v15;
return v12;
}Referenced by:
NtAdjustGroupsToken