SepAdjustGroups

NTSTATUS __stdcall SepAdjustGroups(
        _TOKEN *Token,
        UINT8 MakeChanges,
        UINT8 ResetToDefault,
        UINT64 GroupCount,
        _SID_AND_ATTRIBUTES *NewState,
        _TOKEN_GROUPS *PreviousState,
        VOID *Suffer,
        UINT64 *ReturnLength,
        UINT64 *ChangeCount,
        UINT8 *ChangesMade){
  unsigned int v11; 
  NTSTATUS v12; 
  UINT8 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; 
  UINT8 v38; 
  unsigned int v39; 
  char ChangeCounta; 

  v39 = GroupCount;
  v38 = ResetToDefault;
  v11 = 0;
  v12 = 0;
  v32 = 0;
  v14 = MakeChanges;
  v15 = 0;
  *(_DWORD *)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( !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 -1073741731;
            if( (Attributes & 0x10) != 0 )
              return -1073741133;
            v27 = (4 * *((unsigned __int8 *)Sid1.Sid + 1) + 11) & 0xFFFFFFFC;
            v36 += v27;
            if( MakeChanges )
            {
              if( PreviousState )
              {
                PreviousState->Groups[*(unsigned int *)ChangeCount].Attributes = Sid1.Attributes;
                PreviousState->Groups[*(unsigned int *)ChangeCount].Sid = Suffer;
                RtlCopySid(v27, Suffer, Sid1.Sid);
                v25 = Token->UserAndGroups;
                Suffer = (char *)Suffer + v27;
              }
              v25[v20].Attributes &= ~(v25[v20].Attributes & 4);
              Token->UserAndGroups[v20].Attributes |= *p_Attributes & 4;
            }
            ++*(_DWORD *)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[*(unsigned int *)ChangeCount].Attributes = Sid1.Attributes;
          PreviousState->Groups[*(unsigned int *)ChangeCount].Sid = Suffer;
          RtlCopySid(v29, Suffer, Sid1.Sid);
          UserAndGroups = Token->UserAndGroups;
          LODWORD(GroupCount) = v39;
          Suffer = (char *)Suffer + v29;
        }
        v30 = UserAndGroups[v20].Attributes;
        if( v28 == 2 )
          v31 = v30 | 4;
        else
          v31 = v30 & 0xFFFFFFFB;
        UserAndGroups[v20].Attributes = v31;
      }
      ++*(_DWORD *)ChangeCount;
LABEL_8:
      ResetToDefault = v38;
    }
LABEL_9:
    v15 = v36;
    v17 = v34 + 1;
    v14 = MakeChanges;
    v34 = v17;
  }
  while( v17 < Token->UserAndGroupCount );
  v11 = v32;
LABEL_11:
  if( !ResetToDefault && v11 < (unsigned int)GroupCount )
    v12 = 262;
  if( !*(_DWORD *)ChangeCount || !v14 )
    v16 = 0;
  *ChangesMade = v16;
  if( PreviousState )
    *(_DWORD *)ReturnLength = 16 * *(_DWORD *)ChangeCount + 8 + v15;
  return v12;
}

Referenced by:

NtAdjustGroupsToken