SepNewTokenAsRestrictedAsProcessToken

INT64 __stdcall SepNewTokenAsRestrictedAsProcessToken(
        _TOKEN *NewToken,
        _TOKEN *ProcessToken,
        UINT8 *NewTokenAsRestrictedAsProcessToken){
  unsigned int TokenFlags; 
  unsigned int UserAndGroupCount; 
  int v7; 
  _SID_AND_ATTRIBUTES *UserAndGroups; 
  unsigned int v10; 
  int v11; 
  void *v12; 
  _SID_AND_ATTRIBUTES *v13; 
  unsigned int v14; 
  int v15; 
  unsigned int RestrictedSidCount; 
  unsigned int v17; 
  _SID_AND_ATTRIBUTES *RestrictedSids; 
  void *Sid; 
  void *v20; 
  *NewTokenAsRestrictedAsProcessToken = 0;
  TokenFlags = ProcessToken->TokenFlags;
  if( ((TokenFlags & 0x800) == 0 || (NewToken->TokenFlags & 0x800) != 0)
    && (!SeTokenIsRestricted(ProcessToken) || SeTokenIsRestricted(NewToken))
    && (!SeTokenIsWriteRestricted(ProcessToken) || SeTokenIsWriteRestricted(NewToken))
    && (!SeTokenIsRestricted(ProcessToken) || ProcessToken->RestrictedSidCount >= NewToken->RestrictedSidCount)
    && (~ProcessToken->Privileges.Enabled & NewToken->Privileges.Enabled) == 0
    && (~ProcessToken->Privileges.Present & NewToken->Privileges.Present) == 0
    && (~TokenFlags & NewToken->TokenFlags & 0x1000) == 0 )
  {
    if( SeTokenIsRestricted(ProcessToken) && (v14 = NewToken->RestrictedSidCount, v15 = 0, v14) )
    {
      RestrictedSidCount = ProcessToken->RestrictedSidCount;
      while( 1 )
      {
        v17 = 0;
        if( RestrictedSidCount )
        {
          RestrictedSids = ProcessToken->RestrictedSids;
          Sid = NewToken->RestrictedSids[v15].Sid;
          do
          {
            if( RtlEqualSid(Sid, RestrictedSids[v17].Sid) )
              break;
            ++v17;
          }
          while( v17 < RestrictedSidCount );
        }
        if( v17 == RestrictedSidCount )
          break;
        if( ++v15 >= v14 )
          goto LABEL_10;
      }
    }
    else
    {
LABEL_10:
      UserAndGroupCount = ProcessToken->UserAndGroupCount;
      v7 = 0;
      if( !UserAndGroupCount )
      {
LABEL_14:
        *NewTokenAsRestrictedAsProcessToken = 1;
        return 0i64;
      }
      UserAndGroups = ProcessToken->UserAndGroups;
      while( 1 )
      {
        if( (UserAndGroups[v7].Attributes & 0x10) != 0 )
        {
          v10 = NewToken->UserAndGroupCount;
          v11 = 0;
          if( v10 )
          {
            v12 = UserAndGroups[v7].Sid;
            v13 = NewToken->UserAndGroups;
            v20 = v12;
            while( !RtlEqualSid(v12, v13[v11].Sid) )
            {
              v12 = v20;
              if( ++v11 >= v10 )
                goto LABEL_13;
            }
            if( (v13[v11].Attributes & 0x10) == 0 )
              break;
          }
        }
LABEL_13:
        if( ++v7 >= UserAndGroupCount )
          goto LABEL_14;
      }
    }
  }
  return 3221225569i64;
}

Referenced by:

NtDuplicateToken
SepFilterToken