SepIsImpersonationAllowedDueToCapability

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

Referenced by:

SeTokenCanImpersonate