SepDuplicateTokenUserAndGroups

NTSTATUS __stdcall SepDuplicateTokenUserAndGroups(_TOKEN *ExistingToken, _TOKEN *NewToken){
  unsigned int IntegrityLevelIndex; 
  unsigned int v3; 
  NTSTATUS v6; 
  NTSTATUS result; 
  unsigned int UserAndGroupCount; 
  __int64 v9; 
  void *IntegrityLevelSidValue; 
  VOID *v11; 

  IntegrityLevelIndex = ExistingToken->IntegrityLevelIndex;
  v3 = 0;
  v11 = 0i64;
  v6 = 0;
  if( IntegrityLevelIndex != -1 )
  {
    result = SepDuplicateSid(ExistingToken->UserAndGroups[IntegrityLevelIndex].Sid, &v11);
    v6 = result;
    if( result < 0 )
      return result;
    NewToken->IntegrityLevelSidValue = v11;
  }
  if( _InterlockedIncrement64(&ExistingToken->TokenSidValues->ReferenceCount) <= 1 )
    __fastfail(0xEu);
  NewToken->TokenSidValues = ExistingToken->TokenSidValues;
  UserAndGroupCount = ExistingToken->UserAndGroupCount;
  NewToken->UserAndGroupCount = UserAndGroupCount;
  if( UserAndGroupCount )
  {
    do
    {
      v9 = v3;
      if( v3 == IntegrityLevelIndex )
        IntegrityLevelSidValue = NewToken->IntegrityLevelSidValue;
      else
        IntegrityLevelSidValue = ExistingToken->UserAndGroups[v3].Sid;
      NewToken->UserAndGroups[v3++].Sid = IntegrityLevelSidValue;
      NewToken->UserAndGroups[v9].Attributes = ExistingToken->UserAndGroups[v9].Attributes;
    }
    while( v3 < NewToken->UserAndGroupCount );
  }
  return v6;
}

Referenced by:

SepDuplicateToken
SepFilterToken