SepIsImpersonationAllowedDueToCapability

UINT8 __stdcall SepIsImpersonationAllowedDueToCapability(VOID *ProcessToken, VOID *ImpersonationToken, VOID *a3){
  char v5; 
  UINT8 result; 
  VOID *v7; 
  UINT8 v8; 
  VOID *v9; 
  UINT8 v10; 
  char v11; 
  VOID *v12; 
  UINT8 v13; 
  char v14; 
  UINT8 *v15; 
  bool v16; 
  UINT8 Matcha; 

  v5 = 0;
  if( *((_DWORD *)ImpersonationToken + 30) != *((_DWORD *)ProcessToken + 30)
    || (*(_DWORD *)(*((_QWORD *)ImpersonationToken + 27) + 32i64) & 0x10) != 0
    || RtlIsMultiSessionSku() )
  {
    return 0;
  }
  v7 = SeDefaultAccountAliasSid;
  v8 = SepSidInToken(ProcessToken, 0i64, SeDefaultAccountAliasSid, 0, 0, 0);
  if( v8 )
  {
    if( SeTokenIsRestricted(ProcessToken) )
      v8 = SepSidInToken(ProcessToken, 0i64, v7, 0, 1u, 0);
    if( v8 )
      v5 = 1;
  }
  if( SepAllowSessionImpersonationCap && (*((_DWORD *)ProcessToken + 50) & 0x4000) == 0 )
  {
    v9 = SeSessionImpersonationCapabilityGroupSid;
    v10 = SepSidInToken(ProcessToken, 0i64, SeSessionImpersonationCapabilityGroupSid, 0, 0, 0);
    if( v10 )
    {
      if( SeTokenIsRestricted(ProcessToken) )
        v10 = SepSidInToken(ProcessToken, 0i64, v9, 0, 1u, 0);
      if( v10 )
        return 1;
    }
    v11 = v10;
    if( v5 )
      v11 = 1;
    if( v11 )
      return 1;
  }
  if( (*((_DWORD *)ImpersonationToken + 50) & 0x4000) == 0 )
    return 0;
  v12 = SeConstrainedImpersonationCapabilityGroupSid;
  v13 = SepSidInToken(ProcessToken, 0i64, SeConstrainedImpersonationCapabilityGroupSid, 0, 0, 0);
  if( v13 )
  {
    if( SeTokenIsRestricted(ProcessToken) )
      v13 = SepSidInToken(ProcessToken, 0i64, v12, 0, 1u, 0);
    if( v13 )
      goto LABEL_28;
  }
  v14 = v13;
  if( v5 )
    v14 = 1;
  if( v14 )
  {
LABEL_28:
    if( (*((_DWORD *)ProcessToken + 50) & 0x4000) == 0 )
      return 1;
  }
  result = SepSidInTokenSidHash(
             (_SID_AND_ATTRIBUTES_HASH *)((char *)ProcessToken + 808),
             0i64,
             SeConstrainedImpersonationCapabilitySid,
             0,
             1u,
             0);
  Matcha = result;
  if( result )
  {
    v16 = SepCheckCapabilities(
            ProcessToken,
            *((unsigned int *)ImpersonationToken + 200),
            *((_SID_AND_ATTRIBUTES **)ImpersonationToken + 99),
            v15,
            &Matcha) < 0;
    result = Matcha;
    if( !v16 && !Matcha )
      return RtlEqualSid(*((PVOID *)ProcessToken + 98), *((PVOID *)ImpersonationToken + 98));
  }
  return result;
}

Referenced by:

SeTokenCanImpersonate