SeTokenCanImpersonate

INT64 __stdcall SeTokenCanImpersonate(
        PVOID ProcessToken,
        PVOID Token,
        _SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
        UINT8 *UseProcessTrust){
  INT64 result; 
  void *v7; 
  void *v8; 
  _BYTE *v9; 
  NTSTATUS IsElevated; 
  void *v11; 
  void *v12; 
  int v13; 
  UINT8 pbDominate; 
  UINT8 v15; 
  UINT8 TokenIsElevated; 
  INT64 v17; 
  v15 = 0;
  pbDominate = 0;
  TokenIsElevated = 0;
  LODWORD(v17) = 0;
  *UseProcessTrust = 0;
  if( ImpersonationLevel < SecurityImpersonation )
    return 0i64;
  if( *((_DWORD *)Token + 6) == 998 && !*((_DWORD *)Token + 7) )
  {
    if( (*((_DWORD *)ProcessToken + 50) & 0x4000) != 0 )
    {
      if( (*((_DWORD *)Token + 50) & 0x4000) == 0 )
        return 3221225569i64;
      v7 = (void *)*((_QWORD *)Token + 98);
      v8 = (void *)*((_QWORD *)ProcessToken + 98);
      if( !RtlEqualSid(v8, v7) && !RtlIsParentOfChildAppContainer(v8, v7) )
        return 3221225569i64;
    }
    return 0i64;
  }
  LODWORD(result) = RtlSidDominatesForTrust(*((PVOID *)ProcessToken + 138), *((PVOID *)Token + 138), &pbDominate);
  if( (int)result < 0 )
    return result;
  if( !pbDominate )
    *v9 = 1;
  if( (*((_DWORD *)ProcessToken + 16) & *((_DWORD *)ProcessToken + 18) & 0x20000000) != 0 )
    return 0i64;
  SepAcquireOrderedReadLocks((_TOKEN *)ProcessToken, (_TOKEN *)Token);
  SepCopyTokenIntegrity((INT64)ProcessToken);
  SepCopyTokenIntegrity((INT64)Token);
  IsElevated = RtlSidDominates(0i64, 0i64, &v15);
  if( IsElevated >= 0 )
  {
    if( !v15 )
      goto LABEL_42;
    if( SepIsImpersonationAllowedDueToCapability(ProcessToken, Token)
      || *((_DWORD *)ProcessToken + 6) == *((_DWORD *)Token + 56)
      && *((_DWORD *)ProcessToken + 7) == *((_DWORD *)Token + 57) )
    {
      IsElevated = 0;
      goto LABEL_43;
    }
    if( !RtlEqualSid(**((PVOID **)ProcessToken + 19), **((PVOID **)Token + 19)) )
    {
LABEL_42:
      IsElevated = -1073741727;
      goto LABEL_43;
    }
    if( (int)RtlQueryElevationFlags(&v17) < 0 || (v17 & 1) == 0 )
      goto LABEL_32;
    IsElevated = SeTokenIsElevated(Token, &TokenIsElevated);
    if( IsElevated >= 0 )
    {
      if( !TokenIsElevated )
        goto LABEL_29;
      IsElevated = SeTokenIsElevated(ProcessToken, &TokenIsElevated);
      if( IsElevated >= 0 )
      {
        if( !TokenIsElevated && (*(_DWORD *)(*((_QWORD *)ProcessToken + 27) + 32i64) & 4) != 0 )
          goto LABEL_42;
LABEL_29:
        if( (*(_DWORD *)(*((_QWORD *)ProcessToken + 27) + 32i64) & 4) != 0
          && (*(_DWORD *)(*((_QWORD *)Token + 27) + 32i64) & 4) == 0 )
        {
          SepLogUnmatchedSessionFlagImpersonationAttempt((INT64)ProcessToken, (INT64)Token);
          goto LABEL_42;
        }
LABEL_32:
        IsElevated = 0;
        if( (*((_DWORD *)ProcessToken + 50) & 0x4000) == 0
          || (*((_DWORD *)Token + 50) & 0x4000) != 0
          && ((v11 = (void *)*((_QWORD *)Token + 98), v12 = (void *)*((_QWORD *)ProcessToken + 98),
                                                      RtlEqualSid(v12, v11))
           || RtlIsParentOfChildAppContainer(v12, v11)) )
        {
          if( !SeTokenIsRestricted(ProcessToken)
            || SeTokenIsRestricted(Token)
            && (SeTokenIsWriteRestricted(ProcessToken) || !SeTokenIsWriteRestricted(Token)) )
          {
            v13 = *((_DWORD *)Token + 30);
            if( *((_DWORD *)ProcessToken + 30) == v13 || v13 )
              goto LABEL_43;
          }
        }
        goto LABEL_42;
      }
    }
  }
LABEL_43:
  SepReleaseOrderedReadLocks((INT64)ProcessToken, (INT64)Token);
  return(unsigned int)IsElevated;
}

Referenced by:

PsImpersonateClient