Some checks failed
CI / build-and-test (push) Failing after 26s
Massive misdiagnosis correction. The 2025-05-16 effort to 'fix elevation' has been actively breaking every Start Menu / Desktop shortcut launch since rc7. Empirical retrace:
- Elevated PowerShell -> Process.Start(exe) -> elevated TeamsISO -> WORKS
- Elevated PowerShell with --keep-elevation -> elevated TeamsISO -> WORKS (vm.Participants.Count=2)
- Non-elevated PS Process.Start(exe) -> medium TeamsISO -> WORKS
- ANY launch through runas /trustlevel:0x20000 -> SAFER-restricted TeamsISO -> BROKEN (window appears, zero managed code runs past BAML parse, no logs, no port binds)
The SAFER-restricted token that runas /trustlevel produces breaks .NET 8 WPF apphost in a way that leaves the process apparently alive (with the MainWindow.xaml rendering the empty state from default property values) but executing zero managed code. So my StartupTrace, Serilog file sink, and ControlSurface bind all silently failed for every shortcut launch. Looked exactly like 'cold-start NDI Find stuck at zero' from the outside but had nothing to do with NDI.
Revert:
- installer/Package.wxs: shortcuts target the .exe directly, no runas wrapper
- App.xaml.cs: removed ShouldDeElevate, TryDeElevateAndExit, RelaunchEnvVar, --keep-elevation/--relaunched handling. The check is gone, not just disabled, so future-me can't bring it back without re-discovering the same bug.
Kept:
- StartupTrace (still useful for any future startup mystery)
- Self-healing NDI Find rebuild (c30a616) - still valuable for legitimate stuck-finder cases
- System.Management PackageReference - TryGetParentProcessName still used in StartupTrace
Verified post-revert: Start Menu shortcut click -> PID 43060 -> full trace -> REST 2 participants. 252/252 tests still passing.
192 lines
8.1 KiB
XML
192 lines
8.1 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!--
|
|
TeamsISO — MSI installer (WiX v5)
|
|
|
|
Produces: TeamsISO-Setup-<Version>.msi (per-machine install).
|
|
|
|
Build:
|
|
dotnet publish src/TeamsISO.App/TeamsISO.App.csproj -c Release -r win-x64 (no self contained) -o publish/TeamsISO
|
|
dotnet build installer/TeamsISO.Installer.wixproj -c Release
|
|
|
|
Runtime expectations:
|
|
- .NET 8 Desktop runtime present on target (framework-dependent build)
|
|
- NDI 6 Runtime present — checked in CheckNdiRuntime; absence WARNS
|
|
but does not block install (operators can install NDI after the app)
|
|
-->
|
|
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs"
|
|
xmlns:ui="http://wixtoolset.org/schemas/v4/wxs/ui">
|
|
|
|
<Package Name="TeamsISO"
|
|
Manufacturer="Wild Dragon LLC"
|
|
Version="1.0.0.0"
|
|
UpgradeCode="9F4A8B2C-1D3E-4A5B-9C6D-8E7F0A1B2C3D"
|
|
Scope="perMachine"
|
|
Compressed="yes"
|
|
InstallerVersion="500">
|
|
|
|
<SummaryInformation Description="TeamsISO — Per-Participant NDI ISO Controller for Microsoft Teams"
|
|
Manufacturer="Wild Dragon LLC" />
|
|
|
|
<!--
|
|
MajorUpgrade: a newer install replaces an older one in-place.
|
|
Disallow downgrades; users should uninstall the newer first.
|
|
-->
|
|
<MajorUpgrade DowngradeErrorMessage="A newer version of TeamsISO is already installed. Uninstall it before installing this older version."
|
|
Schedule="afterInstallInitialize" />
|
|
|
|
<!--
|
|
Single MSI feature; users see only the install/uninstall screens.
|
|
-->
|
|
<Feature Id="Main" Title="TeamsISO" Level="1">
|
|
<ComponentGroupRef Id="ApplicationFiles" />
|
|
<ComponentGroupRef Id="Shortcuts" />
|
|
<ComponentGroupRef Id="DesktopShortcut" />
|
|
<ComponentGroupRef Id="ArpEntry" />
|
|
</Feature>
|
|
|
|
<!--
|
|
Friendly install UI. WixToolset.UI.wixext provides several flavors;
|
|
WixUI_InstallDir lets the user pick the directory.
|
|
-->
|
|
<ui:WixUI Id="WixUI_InstallDir" />
|
|
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER" />
|
|
|
|
<!--
|
|
ARP icon + about-box link.
|
|
-->
|
|
<Property Id="ARPHELPLINK" Value="https://wilddragon.net" />
|
|
<Property Id="ARPURLINFOABOUT" Value="https://wilddragon.net" />
|
|
<!-- ARPNOMODIFY is set by WixUI_InstallDir; don't redeclare. -->
|
|
<Property Id="ARPNOREPAIR" Value="1" />
|
|
|
|
<!--
|
|
ARP icon — references the same .ico the WPF host uses. WiX requires the
|
|
icon resource to live next to the wxs OR be reachable at build time;
|
|
we point at the published copy under src/TeamsISO.App/Assets so the icon
|
|
embedded in the MSI matches the icon in the running exe.
|
|
-->
|
|
<Icon Id="TeamsISOIcon" SourceFile="$(var.AssetsDir)teamsiso.ico" />
|
|
<Property Id="ARPPRODUCTICON" Value="TeamsISOIcon" />
|
|
|
|
<!--
|
|
NDI Runtime detection. We check for NDI_RUNTIME_DIR_V6 in the system
|
|
environment block. Missing → warn during install, don't block. The
|
|
engine surfaces a clear MessageBox with an install-NDI link at first
|
|
launch if the runtime really isn't there.
|
|
-->
|
|
<Property Id="NDIRUNTIMEDIR" Value="0">
|
|
<RegistrySearch Id="NdiRuntimeDirV6Search"
|
|
Root="HKLM"
|
|
Key="SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
|
|
Name="NDI_RUNTIME_DIR_V6"
|
|
Type="raw" />
|
|
</Property>
|
|
|
|
<!--
|
|
NDI runtime detection is surfaced at first app launch (App.xaml.cs pops a
|
|
MessageBox with an install link). We deliberately don't block install on
|
|
a missing runtime so admins can stage the app before NDI is rolled out.
|
|
VBScript-based install-time prompts are deprecated in WiX v5 / Windows
|
|
and rewriting in C++ is overkill for a soft warning.
|
|
-->
|
|
|
|
<!--
|
|
Install layout under Program Files\Wild Dragon\TeamsISO.
|
|
-->
|
|
<StandardDirectory Id="ProgramFiles64Folder">
|
|
<Directory Id="ManufacturerFolder" Name="Wild Dragon">
|
|
<Directory Id="INSTALLFOLDER" Name="TeamsISO" />
|
|
</Directory>
|
|
</StandardDirectory>
|
|
|
|
<StandardDirectory Id="ProgramMenuFolder">
|
|
<Directory Id="WildDragonStartMenuFolder" Name="Wild Dragon" />
|
|
</StandardDirectory>
|
|
|
|
<!--
|
|
Files: harvested from the publish output dir at build time.
|
|
WiX v5 understands <Files Include="..."> with glob patterns and
|
|
synthesizes one Component per file with stable GUIDs.
|
|
-->
|
|
<ComponentGroup Id="ApplicationFiles" Directory="INSTALLFOLDER">
|
|
<Files Include="$(var.PublishDir)**" />
|
|
</ComponentGroup>
|
|
|
|
<!--
|
|
Start Menu and Desktop shortcuts — direct .exe targets.
|
|
|
|
History note: an earlier revision wrapped the Target in
|
|
runas.exe /trustlevel:0x20000 to drop the spawned TeamsISO to
|
|
medium integrity, on the theory that elevated TeamsISO couldn't
|
|
discover NDI sources. THAT THEORY WAS WRONG. Verified empirically
|
|
2026-05-16: elevated TeamsISO discovers NDI sources fine
|
|
(vm.Participants.Count=2 at +5s with the keep-elevation flag
|
|
forcing OnStartup past the de-elevation check). The actual bug was the
|
|
SAFER-restricted token produced by runas /trustlevel (the demotion) breaks
|
|
.NET 8 WPF apphost startup in a way that the process appears alive
|
|
with a window but executes zero managed code past the very first
|
|
BAML-parse for MainWindow.xaml. No logs, no port binds, no
|
|
controller subscription. The runas wrapper was actively causing
|
|
every "shortcut launch shows no participants" report.
|
|
|
|
Direct .exe target. The in-app `ShouldDeElevate` check (App.xaml.cs)
|
|
has also been removed for the same reason — letting TeamsISO run
|
|
elevated is strictly better than re-spawning it through runas.
|
|
-->
|
|
<ComponentGroup Id="Shortcuts" Directory="WildDragonStartMenuFolder">
|
|
<Component Id="StartMenuShortcut" Guid="*">
|
|
<Shortcut Id="StartMenuTeamsISO"
|
|
Name="TeamsISO"
|
|
Description="Per-Participant NDI ISO Controller for Microsoft Teams"
|
|
Target="[INSTALLFOLDER]TeamsISO.exe"
|
|
WorkingDirectory="INSTALLFOLDER"
|
|
Icon="TeamsISOIcon" />
|
|
<!-- Required by ICE64: Start Menu folder must be cleaned on uninstall. -->
|
|
<RemoveFolder Id="RemoveWildDragonStartMenuFolder"
|
|
Directory="WildDragonStartMenuFolder"
|
|
On="uninstall" />
|
|
<RegistryValue Root="HKCU"
|
|
Key="Software\Wild Dragon\TeamsISO"
|
|
Name="StartMenuShortcut"
|
|
Type="integer"
|
|
Value="1"
|
|
KeyPath="yes" />
|
|
</Component>
|
|
</ComponentGroup>
|
|
|
|
<StandardDirectory Id="DesktopFolder" />
|
|
<ComponentGroup Id="DesktopShortcut" Directory="DesktopFolder">
|
|
<Component Id="DesktopShortcutComponent" Guid="*">
|
|
<Shortcut Id="DesktopTeamsISO"
|
|
Name="TeamsISO"
|
|
Description="Per-Participant NDI ISO Controller for Microsoft Teams"
|
|
Target="[INSTALLFOLDER]TeamsISO.exe"
|
|
WorkingDirectory="INSTALLFOLDER"
|
|
Icon="TeamsISOIcon" />
|
|
<RegistryValue Root="HKCU"
|
|
Key="Software\Wild Dragon\TeamsISO"
|
|
Name="DesktopShortcut"
|
|
Type="integer"
|
|
Value="1"
|
|
KeyPath="yes" />
|
|
</Component>
|
|
</ComponentGroup>
|
|
|
|
<!--
|
|
ARP icon registry entry. Optional — the MSI auto-fills most ARP
|
|
fields from the Package element. We only need to point at the
|
|
executable for the ARP icon.
|
|
-->
|
|
<ComponentGroup Id="ArpEntry" Directory="INSTALLFOLDER">
|
|
<Component Id="ArpIconRegistry" Guid="*">
|
|
<RegistryValue Root="HKLM"
|
|
Key="Software\Wild Dragon\TeamsISO"
|
|
Name="InstallPath"
|
|
Type="string"
|
|
Value="[INSTALLFOLDER]"
|
|
KeyPath="yes" />
|
|
</Component>
|
|
</ComponentGroup>
|
|
|
|
</Package>
|
|
</Wix>
|