From f48dc5dfcea7a8c88a01246d223b5d89906f7ccd Mon Sep 17 00:00:00 2001 From: enricobuehler Date: Thu, 2 Jul 2026 12:16:11 +0200 Subject: [PATCH] feat(host/windows,packaging): installer overhaul - branding, VB-CABLE, GameStream choice, driver uninstall - Modern branded wizard: WizardStyle=modern dynamic windows11 (Inno >= 6.6, plain-modern fallback for older compilers; CI provisioning upgrades a pre-6.6 Inno). Brand-mark wizard side panels + header tiles (100-200% DPI) and a multi-size punktfunk.ico (SetupIconFile + Apps & Features), generated AND committed by branding/gen-branding.ps1 from the canonical brand geometry. Gotcha encoded in the script: ISCC rejects all-PNG icons, so entries <= 64px are classic DIBs (PNG only at 128/256), and the ICO is load-verified. - VB-CABLE actually ships now: windows-host.yml never set VBCABLE_DIR, so every published installer silently omitted the virtual mic (broken mic passthrough in the field). CI provisions the pinned, SHA-256-verified official Pack45 (provision-windows-punktfunk-extras.ps1) and the pack now FAILS on a supplied-but-invalid dir instead of shipping mic-less again. Attribution per VB-Audio's bundling grant surfaced in the visible wizard task text (vendor, vb-cable.com, donationware) on top of the licenses notice. - GameStream (Moonlight) compat is a wizard task (checked by default) -> service install --gamestream=on|off writes PUNKTFUNK_HOST_CMD= serve[ --gamestream] into host.env. Only the two canonical values are ever rewritten - a hand-customized command line survives upgrades. Silent installs: /MERGETASKS="!gamestream". - Driver uninstall (field report: our virtual-device drivers survived uninstall): new `driver uninstall [--gamepad]` removes the pf-vdisplay device node(s) + the pf-vdisplay/pf-dualsense/pf-xusb driver-store packages, wired into [UninstallRun] after service uninstall. Locale-safe by construction: devices matched on unlocalized VALUES (never pnputil's localized labels), packages found by INF content scan - validated against a German-locale box ("Instanz-ID:" parse; 7/7 punktfunk INFs matched, no foreign hits). VB-CABLE is deliberately left installed (shared third-party component with its own uninstaller). Installer compile, cargo check/clippy/fmt, and the ASCII locale gate are green; the wizard look + uninstall flow still need one on-glass pass on a disposable box (this box runs the live host). Co-Authored-By: Claude Fable 5 --- .gitea/workflows/windows-host.yml | 7 + crates/punktfunk-host/src/windows/install.rs | 128 +++++++++- crates/punktfunk-host/src/windows/service.rs | 71 +++++- packaging/windows/README.md | 41 ++- packaging/windows/branding/gen-branding.ps1 | 235 ++++++++++++++++++ packaging/windows/branding/punktfunk.ico | Bin 0 -> 60337 bytes .../windows/branding/wizard-image-100.bmp | Bin 0 -> 154542 bytes .../windows/branding/wizard-image-125.bmp | Bin 0 -> 241526 bytes .../windows/branding/wizard-image-150.bmp | Bin 0 -> 348594 bytes .../windows/branding/wizard-image-175.bmp | Bin 0 -> 475254 bytes .../windows/branding/wizard-image-200.bmp | Bin 0 -> 618006 bytes .../windows/branding/wizard-small-100.bmp | Bin 0 -> 9294 bytes .../windows/branding/wizard-small-125.bmp | Bin 0 -> 14406 bytes .../windows/branding/wizard-small-150.bmp | Bin 0 -> 20390 bytes .../windows/branding/wizard-small-175.bmp | Bin 0 -> 27702 bytes .../windows/branding/wizard-small-200.bmp | Bin 0 -> 36574 bytes packaging/windows/pack-host-installer.ps1 | 17 +- packaging/windows/punktfunk-host.iss | 56 ++++- .../ci/provision-windows-punktfunk-extras.ps1 | 38 ++- scripts/windows/host.env.example | 4 +- 20 files changed, 568 insertions(+), 29 deletions(-) create mode 100644 packaging/windows/branding/gen-branding.ps1 create mode 100644 packaging/windows/branding/punktfunk.ico create mode 100644 packaging/windows/branding/wizard-image-100.bmp create mode 100644 packaging/windows/branding/wizard-image-125.bmp create mode 100644 packaging/windows/branding/wizard-image-150.bmp create mode 100644 packaging/windows/branding/wizard-image-175.bmp create mode 100644 packaging/windows/branding/wizard-image-200.bmp create mode 100644 packaging/windows/branding/wizard-small-100.bmp create mode 100644 packaging/windows/branding/wizard-small-125.bmp create mode 100644 packaging/windows/branding/wizard-small-150.bmp create mode 100644 packaging/windows/branding/wizard-small-175.bmp create mode 100644 packaging/windows/branding/wizard-small-200.bmp diff --git a/.gitea/workflows/windows-host.yml b/.gitea/workflows/windows-host.yml index 353972b..649e939 100644 --- a/.gitea/workflows/windows-host.yml +++ b/.gitea/workflows/windows-host.yml @@ -93,6 +93,13 @@ jobs: if (-not $env:FFMPEG_DIR) { "FFMPEG_DIR=C:\Users\Public\ffmpeg" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8 } + # VBCABLE_DIR: the pinned official VB-CABLE package (provisioned by + # provision-windows-punktfunk-extras.ps1) -> pack-host-installer.ps1 bundles the + # streaming virtual microphone. Same daemon-env-or-fallback pattern as FFMPEG_DIR + # (the daemon env only refreshes on a runner-task restart). + if (-not $env:VBCABLE_DIR) { + "VBCABLE_DIR=C:\Users\Public\vbcable" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8 + } $v = if ($env:GITHUB_REF -like 'refs/tags/v*') { $env:GITHUB_REF_NAME -replace '^v', '' } else { diff --git a/crates/punktfunk-host/src/windows/install.rs b/crates/punktfunk-host/src/windows/install.rs index ed6f2f6..8b39381 100644 --- a/crates/punktfunk-host/src/windows/install.rs +++ b/crates/punktfunk-host/src/windows/install.rs @@ -1,5 +1,6 @@ -//! `punktfunk-host driver install` / `web setup` - the install-time work the Windows installer's Inno -//! `[Run]` section delegates to the host EXE instead of locale-parsed PowerShell *files*. +//! `punktfunk-host driver install|uninstall` / `web setup` - the install-time work the Windows +//! installer's Inno `[Run]`/`[UninstallRun]` sections delegate to the host EXE instead of +//! locale-parsed PowerShell *files*. //! //! Why: Windows PowerShell 5.1 reads a BOM-less `.ps1` *file* in the machine's ANSI codepage, so on a //! non-English locale a stray non-ASCII byte mis-decodes and the script aborts "unterminated string" - @@ -45,11 +46,15 @@ fn run_capture(cmd: &str, args: &[&str]) -> String { .unwrap_or_default() } -// ── `driver install [--gamepad] --dir ` ───────────────────────────────────────────────── +// ── `driver install [--gamepad] --dir ` / `driver uninstall [--gamepad]` ──────────────── pub fn driver_main(args: &[String]) -> Result<()> { match args.first().map(String::as_str) { Some("install") => driver_install(&args[1..]), - _ => bail!("usage: punktfunk-host driver install --dir [--gamepad]"), + Some("uninstall") => driver_uninstall(&args[1..]), + _ => bail!( + "usage: punktfunk-host driver install --dir [--gamepad]\n\ + \x20 punktfunk-host driver uninstall [--gamepad]" + ), } } @@ -160,6 +165,121 @@ fn install_gamepad(dir: &Path) -> Result<()> { Ok(()) } +// ── `driver uninstall [--gamepad]` ────────────────────────────────────────────────────────────── +// The uninstaller's cleanup counterpart (Inno [UninstallRun]) — the field report was that our +// virtual-device drivers survived an uninstall. Removes the pf-vdisplay device node(s) + driver +// package, or (--gamepad) the pf-dualsense/pf-xusb driver packages (their devnodes are per-session +// SwDeviceCreate'd and are already gone once the service stopped). Locale-safe by construction: we +// never parse pnputil's localized LABELS — devices are matched on the un-localized VALUE side +// (instance IDs / device IDs), and driver packages are found by scanning %WINDIR%\INF\oem*.inf +// CONTENT for our driver names, then passed to pnputil by file name. + +fn driver_uninstall(args: &[String]) -> Result<()> { + let gamepad = flag_present(args, "--gamepad"); + let (what, res) = if gamepad { + ("gamepad", uninstall_gamepad()) + } else { + ("pf-vdisplay", uninstall_pf_vdisplay()) + }; + if let Err(e) = res { + // Same best-effort contract as install: never abort the (un)installer over a driver. + eprintln!("warning: {what} driver uninstall: {e:#}"); + } + Ok(()) +} + +fn uninstall_pf_vdisplay() -> Result<()> { + // 1. Remove the ROOT device node(s) the installer created via nefconc (leaving them would keep + // a ghost "punktfunk virtual display" in Device Manager forever — the exact complaint). + for id in pf_vdisplay_instance_ids() { + if run_quiet("pnputil", &["/remove-device", &id]) { + println!("removed device node {id}"); + } else { + eprintln!("warning: pnputil /remove-device {id} failed"); + } + } + // 2. Delete the driver package from the driver store. + delete_store_drivers(&["pf_vdisplay"]); + Ok(()) +} + +fn uninstall_gamepad() -> Result<()> { + delete_store_drivers(&["pf_dualsense", "pf_dualshock4", "pf_xusb"]); + Ok(()) +} + +/// Instance IDs of enumerated punktfunk virtual-display devices. Parses `pnputil /enum-devices` +/// per-device blocks (blank-line separated); a block is ours if it mentions the pf_vdisplay +/// hardware id / description, and its instance ID is the first line's VALUE (never the localized +/// label) — pnputil prints "Instance ID:" (or its translation) first in every block. +fn pf_vdisplay_instance_ids() -> Vec { + let out = run_capture("pnputil", &["/enum-devices", "/class", "Display"]); + let mut ids = Vec::new(); + for block in out.split("\r\n\r\n").flat_map(|b| b.split("\n\n")) { + let lo = block.to_ascii_lowercase(); + if !lo.contains("pf_vdisplay") && !lo.contains("punktfunk virtual display") { + continue; + } + let Some(first) = block.lines().find(|l| !l.trim().is_empty()) else { + continue; + }; + let Some((_, value)) = first.split_once(':') else { + continue; + }; + let id = value.trim(); + // Sanity: an instance ID is a backslashed path with no spaces (e.g. ROOT\DISPLAY\0000). + if !id.is_empty() && id.contains('\\') && !id.contains(' ') { + ids.push(id.to_string()); + } + } + ids +} + +/// Delete every driver-store package (`%WINDIR%\INF\oem*.inf`) whose INF text mentions one of +/// `needles` — our driver names are unique enough that a content match identifies the package +/// without parsing `pnputil /enum-drivers`' localized output. `/uninstall /force` also unbinds it +/// from any remaining devnodes. +fn delete_store_drivers(needles: &[&str]) { + let windir = std::env::var("WINDIR").unwrap_or_else(|_| r"C:\Windows".into()); + let inf_dir = Path::new(&windir).join("INF"); + let Ok(entries) = std::fs::read_dir(&inf_dir) else { + eprintln!("warning: cannot read {}", inf_dir.display()); + return; + }; + for path in entries.flatten().map(|e| e.path()) { + let name = file_name(&path).to_ascii_lowercase(); + if !name.starts_with("oem") || !name.ends_with(".inf") { + continue; + } + let text = read_inf_text(&path).to_ascii_lowercase(); + if !needles.iter().any(|n| text.contains(n)) { + continue; + } + if run_quiet( + "pnputil", + &["/delete-driver", &name, "/uninstall", "/force"], + ) { + println!("deleted driver package {name}"); + } else { + eprintln!("warning: pnputil /delete-driver {name} /uninstall /force failed"); + } + } +} + +/// INF files in %WINDIR%\INF are ANSI or UTF-16LE(+BOM); decode either so content matching works. +fn read_inf_text(path: &Path) -> String { + let bytes = std::fs::read(path).unwrap_or_default(); + if bytes.len() >= 2 && bytes[0] == 0xFF && bytes[1] == 0xFE { + let units: Vec = bytes[2..] + .chunks_exact(2) + .map(|c| u16::from_le_bytes([c[0], c[1]])) + .collect(); + String::from_utf16_lossy(&units) + } else { + String::from_utf8_lossy(&bytes).into_owned() + } +} + /// Is a punktfunk virtual-display device already enumerated? Matches the device ID / description, which /// are NOT localized, so the substring check is locale-safe. fn pf_vdisplay_present() -> bool { diff --git a/crates/punktfunk-host/src/windows/service.rs b/crates/punktfunk-host/src/windows/service.rs index 77bee04..5afb1f9 100644 --- a/crates/punktfunk-host/src/windows/service.rs +++ b/crates/punktfunk-host/src/windows/service.rs @@ -87,7 +87,7 @@ fn event_handle(ev: &OnceLock) -> Option { pub fn main(args: &[String]) -> Result<()> { match args.first().map(String::as_str) { Some("run") => run(), - Some("install") => install(), + Some("install") => install(&args[1..]), Some("uninstall") => uninstall(), Some("start") => sc(&["start", SERVICE_NAME]), Some("stop") => sc(&["stop", SERVICE_NAME]), @@ -96,7 +96,9 @@ pub fn main(args: &[String]) -> Result<()> { eprintln!( "punktfunk-host service — Windows service control\n\n\ USAGE:\n\ - \x20 punktfunk-host service install register the auto-start service + firewall rules\n\ + \x20 punktfunk-host service install [--gamestream=on|off]\n\ + \x20 register the auto-start service + firewall rules\n\ + \x20 (--gamestream sets host.env's PUNKTFUNK_HOST_CMD)\n\ \x20 punktfunk-host service uninstall stop + remove the service + firewall rules\n\ \x20 punktfunk-host service start start the service now\n\ \x20 punktfunk-host service stop stop the service\n\ @@ -606,12 +608,20 @@ unsafe fn open_log_handle(path: &std::path::Path) -> Result { // ── install / uninstall ────────────────────────────────────────────────────────────────────────── -fn install() -> Result<()> { +fn install(args: &[String]) -> Result<()> { use windows_service::service::{ ServiceAccess, ServiceErrorControl, ServiceInfo, ServiceStartType, ServiceType, }; use windows_service::service_manager::{ServiceManager, ServiceManagerAccess}; + // `--gamestream=on|off` (the installer's wizard task): None = flag absent, keep host.env as-is. + let gamestream = match args.iter().find_map(|a| a.strip_prefix("--gamestream=")) { + Some("on") => Some(true), + Some("off") => Some(false), + Some(v) => bail!("--gamestream must be 'on' or 'off' (got '{v}')"), + None => None, + }; + let exe = std::env::current_exe().context("current_exe")?; let manager = ServiceManager::local_computer( None::<&str>, @@ -653,6 +663,9 @@ fn install() -> Result<()> { } ensure_default_host_env()?; + if let Some(on) = gamestream { + apply_gamestream_choice(on); + } add_firewall_rules(); println!( @@ -721,6 +734,58 @@ fn ensure_default_host_env() -> Result<()> { Ok(()) } +/// Write the installer's GameStream choice into host.env's `PUNKTFUNK_HOST_CMD`. Upgrade-safe: +/// only an absent line or one of the two canonical values (`serve` / `serve --gamestream`) is +/// rewritten — a hand-customized command line is the user's, and stays. Best-effort (warns). +fn apply_gamestream_choice(enable: bool) { + let path = host_env_path(); + let desired = if enable { + "serve --gamestream" + } else { + "serve" + }; + let Ok(text) = std::fs::read_to_string(&path) else { + eprintln!( + "warning: could not read {} to apply the GameStream choice", + path.display() + ); + return; + }; + let mut lines: Vec = text.lines().map(str::to_string).collect(); + let current = lines.iter().position(|l| { + let t = l.trim_start(); + !t.starts_with('#') && t.starts_with("PUNKTFUNK_HOST_CMD=") + }); + match current { + Some(i) => { + let value = lines[i].trim_start()["PUNKTFUNK_HOST_CMD=".len()..].trim(); + if value == desired { + return; // already what the installer chose + } + if value != "serve" && value != "serve --gamestream" { + println!( + "host.env has a customized PUNKTFUNK_HOST_CMD ({value}) - leaving it \ + (installer GameStream choice not applied)" + ); + return; + } + lines[i] = format!("PUNKTFUNK_HOST_CMD={desired}"); + } + None => lines.push(format!("PUNKTFUNK_HOST_CMD={desired}")), + } + let mut out = lines.join("\n"); + out.push('\n'); + // Rewrite through write_secret_file so the SYSTEM/Administrators DACL is re-asserted. + if let Err(e) = crate::gamestream::write_secret_file(&path, out.as_bytes()) { + eprintln!("warning: could not write {}: {e}", path.display()); + return; + } + println!( + "GameStream (Moonlight) compatibility: {} (PUNKTFUNK_HOST_CMD={desired})", + if enable { "enabled" } else { "disabled" } + ); +} + // ── firewall + sc helpers ──────────────────────────────────────────────────────────────────────── /// Inbound firewall rules for the streaming ports (best-effort; logs but never fails the install). diff --git a/packaging/windows/README.md b/packaging/windows/README.md index 94de0fc..ef1c8db 100644 --- a/packaging/windows/README.md +++ b/packaging/windows/README.md @@ -47,16 +47,31 @@ parse breakage that silently failed installs on non-English boxes. **`PunktfunkWeb`** scheduled task (boot, SYSTEM, restart-on-failure → `web-run.cmd` → `bun` on `:3000`), opens TCP 3000, and starts it. It proxies the host's loopback mgmt API with the host's own `%ProgramData%\punktfunk\mgmt-token`. +- **GameStream (Moonlight) compatibility is a wizard task** (checked by default): the choice is passed + to `service install --gamestream=on|off`, which writes `PUNKTFUNK_HOST_CMD=serve --gamestream` (or + `serve`, the secure native-only host) into `host.env`. Upgrade-safe: a hand-customized + `PUNKTFUNK_HOST_CMD` is never overwritten. +- **Branded, modern wizard**: `WizardStyle=modern dynamic windows11` (Inno ≥ 6.6 — Windows-11-style + controls following the system light/dark theme; pre-6.6 compilers fall back to plain `modern`), with + the punktfunk lens mark on the side panel / header tile and a multi-size `punktfunk.ico` + (`SetupIconFile` + the Apps & features entry). Assets are generated **and committed** by + `branding/gen-branding.ps1` from the canonical brand geometry (`web/src/components/brand-mark.tsx`); + re-run it only when the brand changes. - **Upgrade:** stops a running `PunktfunkHost` service and waits for `STOPPED` before replacing files (otherwise the locked exe / respawning supervisor would block the copy), then re-points the service; the existing console password is kept (the wizard page is skipped). - **Uninstall** (Add/Remove Programs): runs `service uninstall` (stop + delete service + remove - firewall rules) and removes the `PunktfunkWeb` task + its firewall rule. The pf-vdisplay driver and the - `%ProgramData%\punktfunk` config (incl. `web-password`) are intentionally left in place. + firewall rules), removes the `PunktfunkWeb` task + its firewall rule, then `driver uninstall` (+ + `--gamepad`) removes the punktfunk virtual-device drivers — the pf-vdisplay device node(s) and the + pf-vdisplay / pf-dualsense / pf-xusb driver-store packages (the field report was that they survived + uninstall). **VB-CABLE is intentionally NOT removed** (a third-party shared component the user may + use elsewhere — its own uninstaller is `VBCABLE_Setup_x64.exe -u -h`); the `%ProgramData%\punktfunk` + config (incl. `web-password`) is also left in place. Silent install: `punktfunk-host-setup-.exe /VERYSILENT` (omit the driver with -`/MERGETASKS="!installdriver"`). A silent fresh install uses the generated random console password — -read it from `%ProgramData%\punktfunk\web-password`. +`/MERGETASKS="!installdriver"`; disable Moonlight compat with `/MERGETASKS="!gamestream"`). A silent +fresh install uses the generated random console password — read it from +`%ProgramData%\punktfunk\web-password`. ## Prerequisites on the target box @@ -70,18 +85,24 @@ read it from `%ProgramData%\punktfunk\web-password`. Output` capture endpoint surfaces as a host mic. A Windows audio device can only be created by a **kernel-mode** driver (no UMDF path exists), so unlike our self-signed UMDF drivers we cannot ship our own — VB-CABLE is a vendor-signed cable that loads with no test-signing. It is **donationware** by - VB-Audio, redistributed under VB-Audio's bundling grant (only the single base cable); see - `licenses/VB-CABLE-NOTICE.txt`. The package binary is **not** in the repo — supply it to the packer via - `-VbCableDir` / `$env:VBCABLE_DIR` (the extracted official package, containing `VBCABLE_Setup_x64.exe`). - Absent → the installer is built without it and the host falls back to auto-installing the Steam - Streaming pair. *(Endgame: attestation-sign our own MIT virtual-audio driver to drop this dependency.)* + VB-Audio, redistributed under VB-Audio's bundling grant (only the single base cable) — the grant + requires the end user to see VB-CABLE's origin + donationware status, which the wizard task text and + `licenses/VB-CABLE-NOTICE.txt` surface. The package binary is **not** in the repo — CI provisions the + **pinned, SHA-256-verified official package** onto the runner (`scripts/ci/provision-windows-punktfunk-extras.ps1` + → `C:\Users\Public\vbcable`) and `windows-host.yml` passes it via `$env:VBCABLE_DIR`, so **published + installers always bundle it**; locally supply `-VbCableDir` / `$env:VBCABLE_DIR` (the extracted + official package, containing `VBCABLE_Setup_x64.exe`). Unset → the installer is built without it and + the host falls back to auto-installing the Steam Streaming pair; set-but-invalid → the pack **fails** + (a broken provisioning must not silently ship a mic-less installer again). *(Endgame: + attestation-sign our own MIT virtual-audio driver to drop this dependency.)* ## Files here | File | Role | |------|------| | `punktfunk-host.iss` | Inno Setup script (the installer definition). | -| `pack-host-installer.ps1` | Orchestrator: cert + sign exe, **build + sign the drivers from source**, stage them + FFmpeg + the **web console** (`.output` + bun) + the HDR layer, run ISCC, sign setup.exe. | +| `branding/` | Wizard branding: `gen-branding.ps1` renders the brand mark into the committed `wizard-image-*.bmp` / `wizard-small-*.bmp` (100–200% DPI) + `punktfunk.ico`. Re-run only on a brand change. | +| `pack-host-installer.ps1` | Orchestrator: cert + sign exe, **build + sign the drivers from source**, stage them + FFmpeg + VB-CABLE + the **web console** (`.output` + bun) + the HDR layer + branding, run ISCC, sign setup.exe. | | `build-pf-vdisplay.ps1` | Build pf-vdisplay from source (the `drivers/` workspace) + clear FORCE_INTEGRITY + sign `.dll`/`.cat` + export `.cer`. | | `build-gamepad-drivers.ps1` | Sign + catalog the gamepad drivers (`pf-dualsense` + `pf-xusb`) from the same workspace build (`-SkipBuild`), one shared cert. | | `install-vbcable.ps1` | On-target: seed VB-Audio's cert into `TrustedPublisher`, silently install the bundled VB-CABLE (`-i -h`). Run by the installer's *Install VB-CABLE virtual audio* task; idempotent + always exits 0 (non-fatal). | diff --git a/packaging/windows/branding/gen-branding.ps1 b/packaging/windows/branding/gen-branding.ps1 new file mode 100644 index 0000000..22ce52b --- /dev/null +++ b/packaging/windows/branding/gen-branding.ps1 @@ -0,0 +1,235 @@ +<# +.SYNOPSIS + Generate the punktfunk host installer branding assets (wizard BMPs + setup .ico). + +.DESCRIPTION + Renders the punktfunk brand mark - the two overlapping circles ("lens") from + web/src/components/brand-mark.tsx (the canonical flattened geometry, shared with the Apple icon, + the marketing site and the docs) - into the assets Inno Setup consumes: + + wizard-image-*.bmp welcome/finish page side panel (164x314 base, 100..200% DPI variants); + dark violet gradient panel + the mark + the lowercase wordmark. The panel + is self-contained dark, so it reads correctly in BOTH the light and dark + (WizardStyle=dynamic) wizard appearances. + wizard-small-*.bmp header tile on the inner pages (55x55 base, 100..200% DPI variants); + the square brand tile (mark on #1C1530), matching the MSIX client tile. + punktfunk.ico multi-size icon (16..256, PNG-compressed entries - Vista+ format, we + require Windows 10) for SetupIconFile + the Apps & Features entry. + + Outputs are COMMITTED next to this script (like include/punktfunk_core.h, generated-but-checked-in); + re-run only when the brand changes. Everything is drawn 4x supersampled and downscaled + (System.Drawing regions/clips do not antialias), so edges stay clean at every size. + +.EXAMPLE + pwsh -File packaging/windows/branding/gen-branding.ps1 +#> +[CmdletBinding()] +param([string]$OutDir = $PSScriptRoot) +$ErrorActionPreference = 'Stop' +Add-Type -AssemblyName System.Drawing + +# --- brand constants (colors from brand-mark.tsx; tile background from the MSIX assets) ------- +$colLight = [System.Drawing.Color]::FromArgb(255, 0xA7, 0x9F, 0xF8) # large circle +$colDeep = [System.Drawing.Color]::FromArgb(255, 0x6C, 0x5B, 0xF3) # small circle +$colHi = [System.Drawing.Color]::FromArgb(255, 0xD2, 0xC9, 0xFB) # lens overlap highlight +$colTile = [System.Drawing.Color]::FromArgb(255, 0x1C, 0x15, 0x30) # brand tile background +$colPanelTop = [System.Drawing.Color]::FromArgb(255, 0x27, 0x1E, 0x46) # wizard panel gradient +$colPanelBot = [System.Drawing.Color]::FromArgb(255, 0x11, 0x0D, 0x1F) +$colText = [System.Drawing.Color]::FromArgb(255, 0xEA, 0xE6, 0xFB) # wordmark on the panel + +# Mark geometry in the 1000-unit viewbox of brand-mark.tsx: two r=194.41 circles at (403.04,597.26) +# (light, behind) and (597.81,402.85) (deep, in front), their intersection filled as the highlight. +$R = 194.41 +$c1x = 403.037; $c1y = 597.262 +$c2x = 597.8075; $c2y = 402.8525 +# Mark bounding box -> center/span, so callers can place it by center + size. +$bbMinX = $c1x - $R; $bbMaxX = $c2x + $R +$bbMinY = $c2y - $R; $bbMaxY = $c1y + $R +$markCx = ($bbMinX + $bbMaxX) / 2.0 +$markCy = ($bbMinY + $bbMaxY) / 2.0 +$markSpan = $bbMaxX - $bbMinX # == $bbMaxY - $bbMinY (the bbox is square) + +# Draw the mark onto $g centered at ($cx,$cy) with bounding-box size $size (device pixels). +function Draw-Mark([System.Drawing.Graphics]$g, [double]$cx, [double]$cy, [double]$size) { + $s = $size / $markSpan + function ellRect([double]$ecx, [double]$ecy) { + $r = $R * $s + [System.Drawing.RectangleF]::new( + [float]($cx + ($ecx - $markCx) * $s - $r), [float]($cy + ($ecy - $markCy) * $s - $r), + [float](2 * $r), [float](2 * $r)) + } + $r1 = ellRect $c1x $c1y + $r2 = ellRect $c2x $c2y + $b = New-Object System.Drawing.SolidBrush($colLight) + $g.FillEllipse($b, $r1); $b.Dispose() + $b = New-Object System.Drawing.SolidBrush($colDeep) + $g.FillEllipse($b, $r2); $b.Dispose() + # Highlight = intersection: clip to circle 1, fill circle 2. The clip edge is not antialiased, + # but every caller renders 4x supersampled and downscales, which smooths it. + $p1 = New-Object System.Drawing.Drawing2D.GraphicsPath + $p1.AddEllipse($r1) + $g.SetClip($p1) + $b = New-Object System.Drawing.SolidBrush($colHi) + $g.FillEllipse($b, $r2); $b.Dispose() + $g.ResetClip(); $p1.Dispose() +} + +# New 32bpp canvas + antialiased Graphics. +function New-Canvas([int]$w, [int]$h) { + $bmp = New-Object System.Drawing.Bitmap($w, $h, [System.Drawing.Imaging.PixelFormat]::Format32bppArgb) + $g = [System.Drawing.Graphics]::FromImage($bmp) + $g.SmoothingMode = [System.Drawing.Drawing2D.SmoothingMode]::AntiAlias + $g.TextRenderingHint = [System.Drawing.Text.TextRenderingHint]::AntiAlias + @($bmp, $g) +} + +# Downscale $src to $w x $h (high-quality bicubic) - the supersample resolve. +function Resize-Bitmap([System.Drawing.Bitmap]$src, [int]$w, [int]$h) { + $dst = New-Object System.Drawing.Bitmap($w, $h, [System.Drawing.Imaging.PixelFormat]::Format32bppArgb) + $g = [System.Drawing.Graphics]::FromImage($dst) + $g.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic + $g.PixelOffsetMode = [System.Drawing.Drawing2D.PixelOffsetMode]::HighQuality + $g.DrawImage($src, (New-Object System.Drawing.Rectangle(0, 0, $w, $h)), + 0, 0, $src.Width, $src.Height, [System.Drawing.GraphicsUnit]::Pixel) + $g.Dispose() + $dst +} + +# Save as 24bpp BMP (opaque - what Inno's wizard image loader expects by default). +function Save-Bmp24([System.Drawing.Bitmap]$bmp, [string]$path) { + $b24 = $bmp.Clone((New-Object System.Drawing.Rectangle(0, 0, $bmp.Width, $bmp.Height)), + [System.Drawing.Imaging.PixelFormat]::Format24bppRgb) + $b24.Save($path, [System.Drawing.Imaging.ImageFormat]::Bmp) + $b24.Dispose() + Write-Host " wrote $path ($($bmp.Width)x$($bmp.Height))" +} + +$SS = 4 # supersample factor + +# --- wizard side panel (welcome/finish page): gradient + mark + wordmark ---------------------- +# Base size 164x314 (Inno's classic canvas); DPI variants via the wizard-image-*.bmp wildcard. +foreach ($pct in 100, 125, 150, 175, 200) { + $w = [int][Math]::Round(164 * $pct / 100.0) + $h = [int][Math]::Round(314 * $pct / 100.0) + $bmp, $g = New-Canvas ($w * $SS) ($h * $SS) + $rect = New-Object System.Drawing.Rectangle(0, 0, ($w * $SS), ($h * $SS)) + $grad = New-Object System.Drawing.Drawing2D.LinearGradientBrush($rect, $colPanelTop, $colPanelBot, 90.0) + $g.FillRectangle($grad, $rect); $grad.Dispose() + # Mark: 58% of the panel width, centered horizontally, optical center at ~40% height. + Draw-Mark $g ($w * $SS / 2.0) ($h * $SS * 0.40) ($w * $SS * 0.58) + # Wordmark: lowercase brand name under the mark. + $font = New-Object System.Drawing.Font('Segoe UI Semibold', [float](13.0 * $SS * $pct / 100.0), [System.Drawing.FontStyle]::Regular, [System.Drawing.GraphicsUnit]::Pixel) + $tb = New-Object System.Drawing.SolidBrush($colText) + $fmt = New-Object System.Drawing.StringFormat + $fmt.Alignment = [System.Drawing.StringAlignment]::Center + $g.DrawString('punktfunk', $font, $tb, + (New-Object System.Drawing.PointF([float]($w * $SS / 2.0), [float]($h * $SS * 0.60))), $fmt) + $fmt.Dispose(); $tb.Dispose(); $font.Dispose(); $g.Dispose() + $out = Resize-Bitmap $bmp $w $h + $bmp.Dispose() + Save-Bmp24 $out (Join-Path $OutDir ("wizard-image-{0}.bmp" -f $pct)) + $out.Dispose() +} + +# --- wizard header tile (inner pages): the square brand tile -------------------------------- +# Base size 55x55; DPI variants via the wizard-small-*.bmp wildcard. Opaque square (BMP has no +# alpha here): the same full-bleed dark tile as the client's MSIX logo assets. +foreach ($pct in 100, 125, 150, 175, 200) { + $sz = [int][Math]::Round(55 * $pct / 100.0) + $bmp, $g = New-Canvas ($sz * $SS) ($sz * $SS) + $b = New-Object System.Drawing.SolidBrush($colTile) + $g.FillRectangle($b, 0, 0, ($sz * $SS), ($sz * $SS)); $b.Dispose() + Draw-Mark $g ($sz * $SS / 2.0) ($sz * $SS / 2.0) ($sz * $SS * 0.74) + $g.Dispose() + $out = Resize-Bitmap $bmp $sz $sz + $bmp.Dispose() + Save-Bmp24 $out (Join-Path $OutDir ("wizard-small-{0}.bmp" -f $pct)) + $out.Dispose() +} + +# --- punktfunk.ico: rounded brand tile at 16..256 -------------------------------------------- +# Small sizes are classic 32bpp DIB entries (Inno's SetupIconFile resource updater and older shell +# consumers reject an all-PNG icon); only 128/256 use PNG compression (the standard Vista+ layout). +function New-IconTile([int]$sz) { + $bmp, $g = New-Canvas ($sz * $SS) ($sz * $SS) + # Rounded-rect tile (22% corner radius - the Windows 11 app-icon look). + $S = $sz * $SS; $rad = [int]($S * 0.22) + $path = New-Object System.Drawing.Drawing2D.GraphicsPath + $path.AddArc(0, 0, 2 * $rad, 2 * $rad, 180, 90) + $path.AddArc($S - 2 * $rad, 0, 2 * $rad, 2 * $rad, 270, 90) + $path.AddArc($S - 2 * $rad, $S - 2 * $rad, 2 * $rad, 2 * $rad, 0, 90) + $path.AddArc(0, $S - 2 * $rad, 2 * $rad, 2 * $rad, 90, 90) + $path.CloseFigure() + $b = New-Object System.Drawing.SolidBrush($colTile) + $g.FillPath($b, $path); $b.Dispose(); $path.Dispose() + Draw-Mark $g ($S / 2.0) ($S / 2.0) ($S * 0.74) + $g.Dispose() + $out = Resize-Bitmap $bmp $sz $sz + $bmp.Dispose() + $out +} + +# PNG-compressed entry payload (used for the 128/256 entries). The leading comma keeps the byte[] +# a single pipeline object (PowerShell would otherwise unroll it into individual bytes). +function ConvertTo-IconPng([System.Drawing.Bitmap]$tile) { + $ms = New-Object System.IO.MemoryStream + $tile.Save($ms, [System.Drawing.Imaging.ImageFormat]::Png) + return , $ms.ToArray() +} + +# Classic ICO DIB entry payload: BITMAPINFOHEADER (height doubled) + bottom-up 32bpp BGRA XOR data +# + an all-zero 1bpp AND mask (32bpp icons carry transparency in the alpha channel). +function ConvertTo-IconDib([System.Drawing.Bitmap]$tile) { + $s = $tile.Width + $rect = New-Object System.Drawing.Rectangle(0, 0, $s, $s) + $data = $tile.LockBits($rect, [System.Drawing.Imaging.ImageLockMode]::ReadOnly, + [System.Drawing.Imaging.PixelFormat]::Format32bppArgb) + $px = New-Object byte[] ($data.Stride * $s) + [System.Runtime.InteropServices.Marshal]::Copy($data.Scan0, $px, 0, $px.Length) + $tile.UnlockBits($data) + $maskStride = [int][Math]::Ceiling($s / 32.0) * 4 # 1bpp rows padded to 32 bits + $ms = New-Object System.IO.MemoryStream + $w = New-Object System.IO.BinaryWriter($ms) + $w.Write([uint32]40); $w.Write([int]$s); $w.Write([int]($s * 2)) # biSize, biWidth, biHeight (XOR+AND) + $w.Write([uint16]1); $w.Write([uint16]32); $w.Write([uint32]0) # biPlanes, biBitCount, BI_RGB + $w.Write([uint32]($s * $s * 4 + $maskStride * $s)) # biSizeImage + $w.Write([int]0); $w.Write([int]0); $w.Write([uint32]0); $w.Write([uint32]0) + for ($y = $s - 1; $y -ge 0; $y--) { $w.Write($px, $y * $data.Stride, $s * 4) } # XOR, bottom-up + $w.Write((New-Object byte[] ($maskStride * $s))) # AND mask: all opaque + $w.Flush() + $bytes = $ms.ToArray() + $w.Dispose(); $ms.Dispose() + return , $bytes # leading comma: emit the byte[] as ONE object, not unrolled bytes +} + +$icoSizes = 16, 20, 24, 32, 40, 48, 64, 128, 256 +$pngs = @(foreach ($s in $icoSizes) { + $tile = New-IconTile $s + if ($s -ge 128) { ConvertTo-IconPng $tile } else { ConvertTo-IconDib $tile } + $tile.Dispose() +}) +$ico = New-Object System.IO.MemoryStream +$bw = New-Object System.IO.BinaryWriter($ico) +# ICONDIR +$bw.Write([uint16]0); $bw.Write([uint16]1); $bw.Write([uint16]$icoSizes.Count) +# ICONDIRENTRYs (width/height byte 0 means 256) +$offset = 6 + 16 * $icoSizes.Count +for ($i = 0; $i -lt $icoSizes.Count; $i++) { + $s = $icoSizes[$i] + $dim = if ($s -ge 256) { 0 } else { $s } + $bw.Write([byte]$dim); $bw.Write([byte]$dim) # width, height + $bw.Write([byte]0); $bw.Write([byte]0) # colors, reserved + $bw.Write([uint16]1); $bw.Write([uint16]32) # planes, bitcount + $bw.Write([uint32]$pngs[$i].Length); $bw.Write([uint32]$offset) + $offset += $pngs[$i].Length +} +foreach ($p in $pngs) { $bw.Write([byte[]]$p) } +$bw.Flush() +$icoPath = Join-Path $OutDir 'punktfunk.ico' +[IO.File]::WriteAllBytes($icoPath, $ico.ToArray()) +$bw.Dispose(); $ico.Dispose() +# Self-check: a malformed container here would only surface later as ISCC "Icon file is invalid". +$probe = New-Object System.Drawing.Icon($icoPath) +$probe.Dispose() +Write-Host " wrote $icoPath ($($icoSizes -join ',')) - verified loadable" +Write-Host "==> branding assets generated in $OutDir" diff --git a/packaging/windows/branding/punktfunk.ico b/packaging/windows/branding/punktfunk.ico new file mode 100644 index 0000000000000000000000000000000000000000..1757e238c06215b12cf7e99fa4d5f24b0472d357 GIT binary patch literal 60337 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 RO#f>*Vn@0&F4;^u!puQdDfQ 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 literal 0 HcmV?d00001 diff --git a/packaging/windows/branding/wizard-image-125.bmp b/packaging/windows/branding/wizard-image-125.bmp new file mode 100644 index 0000000000000000000000000000000000000000..87abc1a5982676ae238083a1c46f3e5c2138c33f GIT binary patch literal 241526 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 literal 0 HcmV?d00001 diff --git a/packaging/windows/branding/wizard-small-125.bmp b/packaging/windows/branding/wizard-small-125.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b336b7335e6b8fdc9384c9a618fb5c1c7c559bc4 GIT binary patch literal 14406 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 literal 0 HcmV?d00001 diff --git a/packaging/windows/branding/wizard-small-150.bmp b/packaging/windows/branding/wizard-small-150.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fdeacca7e3c5e8909fe7158bceaff29bf78cc8d2 GIT binary patch literal 20390 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

j zcZbh>m=XtBqIv7a>SWw-I^Dz^V2KbJ&Y#{FPdZMyh7)(VcHv4o1`ggFV2Qj9OQ*=; zkjZh1C24$3%3bH;EzoH#cw~aW=n7W#cla*AS{0{QQVrQO4V)Xg#3(SUm~ZR!eN?(Q zfkV+8_jb2`Af0L(B^(aeI5iMR^U&<2+>xfdbt7$#HJ|>D3(l~F%f#M>AEMJG+>j>j zYEeKS?l5($>3ru5OVm3tw|Lom9^Qn0=jLdDK@_~cItlzd=&g)Xq&dS9!$A%QbzTUG zMJ9qbq^~%H)C^H)oy$z5Lb$_p6v;i782B_(>t*)NKgVp4Cg$o3r)*sTJU5*Q_%O^| z(j|r_w{%|SbU#$HQ9RPUG~r=B3XX<(ppZTcmC7GE#*!MZgE4O>(#_=jejUz)>N?5`?TSs;~C^)Q3YG}X-W6$vj_%)VnVAh83#4UnXhWb(T z^R=``qYFDla-JnMKxE4+rnq#3#^W7hL#PG?O5{jxQ5N>=Lym|y>VU*(xoYDSNHRb) z)yO}LV7LFGUt%{PVNpN66N*WB0Qo_1R2bhCw@c-EtztZ5oN%5cg%d4%u=k~Qf~o}} z|AooRch#c_jj7=ii%!nRvS<6sxNP?Tluqe1u#LfQ=tJXyrDD8DRiGgx^H|Kn91k%G zP@ymoq81ZIq6KdxR^*xTkBq<~9h!qO+ zMJ#b(p94G})CO8e@&OnJ&cP470h`Xsm*NFkpNxN&tlzrEf6>5_NmXrZ{05c=mJCX? zV~a_Hj~aAo(4|3_8Z;;lzLden4K{ADaSj@$28U#@an0NKOx|Qat0|}f7!KA1ux|+% bjf_ws@Ug^3Tl|OWhJz&mECHYrXk_$%VTnG$ literal 0 HcmV?d00001 diff --git a/packaging/windows/pack-host-installer.ps1 b/packaging/windows/pack-host-installer.ps1 index daafc92..0982506 100644 --- a/packaging/windows/pack-host-installer.ps1 +++ b/packaging/windows/pack-host-installer.ps1 @@ -132,6 +132,13 @@ $issLocal = Join-Path $OutDir 'punktfunk-host.iss' Copy-Item -LiteralPath $hostEnvSrc -Destination $hostEnv -Force Copy-Item -LiteralPath $readmeSrc -Destination $readme -Force Copy-Item -LiteralPath $iss -Destination $issLocal -Force +# Branding (wizard BMPs + punktfunk.ico, committed outputs of branding/gen-branding.ps1): the .iss +# references them as "branding\" relative to itself, so stage the dir next to the staged .iss. +$brandStage = Join-Path $OutDir 'branding' +if (Test-Path $brandStage) { Remove-Item $brandStage -Recurse -Force } +New-Item -ItemType Directory -Force -Path $brandStage | Out-Null +Copy-Item (Join-Path $here 'branding\*.bmp') $brandStage -Force +Copy-Item (Join-Path $here 'branding\punktfunk.ico') $brandStage -Force # License/attribution payload bundled into {app}\licenses: the project's own MIT/Apache texts and the # generated third-party crate notices. The FFmpeg LGPL notice + license text are added to this same @@ -198,7 +205,13 @@ if (-not $NoDriver) { # shipped intact); supply it via -VbCableDir / $env:VBCABLE_DIR pointing at the extracted official # package (must contain VBCABLE_Setup_x64.exe). Absent -> installer built WITHOUT the bundled cable; the # host then auto-installs the Steam Streaming pair as a fallback and mic passthrough needs a manual cable. -if ($VbCableDir -and (Test-Path $VbCableDir) -and (Get-ChildItem -Path $VbCableDir -Filter 'VBCABLE_Setup*.exe' -ErrorAction SilentlyContinue)) { +if ($VbCableDir -and -not ((Test-Path $VbCableDir) -and (Get-ChildItem -Path $VbCableDir -Filter 'VBCABLE_Setup*.exe' -ErrorAction SilentlyContinue))) { + # An explicitly-supplied dir that doesn't hold the package is a broken provisioning, not an + # opt-out - fail loudly instead of silently shipping an installer without the virtual mic + # (exactly the field regression this bundling fixes). Opt out by leaving VBCABLE_DIR unset. + throw "VbCableDir '$VbCableDir' has no VBCABLE_Setup*.exe - re-run scripts/ci/provision-windows-punktfunk-extras.ps1 (or unset VBCABLE_DIR to build without the virtual mic)" +} +if ($VbCableDir) { $vbStage = Join-Path $OutDir 'vbcable' if (Test-Path $vbStage) { Remove-Item -Recurse -Force $vbStage } New-Item -ItemType Directory -Force -Path $vbStage | Out-Null @@ -211,7 +224,7 @@ if ($VbCableDir -and (Test-Path $VbCableDir) -and (Get-ChildItem -Path $VbCableD Copy-Item (Join-Path $here 'licenses\VB-CABLE-NOTICE.txt') -Destination $licStage -Force Write-Host "==> bundling VB-CABLE (virtual mic) from $VbCableDir -> $vbStage" } -else { Write-Host "no -VbCableDir/`$env:VBCABLE_DIR (or no VBCABLE_Setup*.exe in it) -> installer built WITHOUT the bundled VB-CABLE virtual mic" } +else { Write-Host "no -VbCableDir/`$env:VBCABLE_DIR -> installer built WITHOUT the bundled VB-CABLE virtual mic (CI always bundles it; see provision-windows-punktfunk-extras.ps1)" } # --- stage the FFmpeg shared DLLs (AMD/Intel AMF/QSV build) ------------------------------------ # A host built with --features amf-qsv link-imports avcodec/avutil/swscale/... so the shared DLLs diff --git a/packaging/windows/punktfunk-host.iss b/packaging/windows/punktfunk-host.iss index 0f2b2a0..016db9d 100644 --- a/packaging/windows/punktfunk-host.iss +++ b/packaging/windows/punktfunk-host.iss @@ -28,6 +28,13 @@ #ifndef Readme #define Readme "README.md" #endif +; Branding assets (wizard side panel + header tile BMPs, setup/app icon), generated + committed by +; branding/gen-branding.ps1 from the canonical brand-mark geometry. Relative to this script's dir: +; works from the repo checkout AND from the staged copy (pack-host-installer.ps1 stages branding\ +; next to the staged .iss). +#ifndef BrandingDir + #define BrandingDir "branding" +#endif ; The web console launcher (the PunktfunkWeb task action) + its post-install provisioner - committed ; scripts staged next to the .iss by pack-host-installer.ps1 (absolute paths passed in). #ifndef WebRunCmd @@ -85,9 +92,23 @@ OutputDir={#OutputDir} OutputBaseFilename=punktfunk-host-setup-{#MyAppVersion} Compression=lzma2/max SolidCompression=yes +; Modern branded wizard: Windows-11-style controls that follow the system light/dark theme +; (Inno Setup >= 6.6; CI provisions current 6.x via choco). An older local compiler falls back +; to the plain modern style so a dev pack still builds. +#if VER >= EncodeVer(6,6,0) +WizardStyle=modern dynamic windows11 +#else WizardStyle=modern +#endif +; Brand assets (branding/gen-branding.ps1): the violet lens mark on a dark panel/tile - self- +; contained dark art, so it reads correctly in both the light and dark wizard appearance. The +; wildcard names carry 100..200% DPI variants; Setup picks the closest. +SetupIconFile={#BrandingDir}\punktfunk.ico +WizardImageFile={#BrandingDir}\wizard-image-*.bmp +WizardSmallImageFile={#BrandingDir}\wizard-small-*.bmp UninstallDisplayName=punktfunk host {#MyAppVersion} -UninstallDisplayIcon={app}\punktfunk-host.exe +; The branded multi-size .ico (installed below) - the host exe embeds no icon resource. +UninstallDisplayIcon={app}\punktfunk.ico [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" @@ -100,17 +121,26 @@ Name: "installdriver"; Description: "Install the pf-vdisplay virtual display dri Name: "installgamepad"; Description: "Install the virtual gamepad drivers (DualSense / DualShock 4 / Xbox 360 - no ViGEmBus needed)" #endif #ifdef WithAudioCable -Name: "installaudiocable"; Description: "Install VB-CABLE virtual audio (microphone passthrough - VB-Audio donationware, www.vb-cable.com)" +; VB-Audio's bundling grant requires the end user to see VB-CABLE's origin + donationware status +; at install time - keep the vendor, URL, and donationware wording in this visible task text (the +; full notice ships in {app}\licenses\VB-CABLE-NOTICE.txt). +Name: "installaudiocable"; Description: "Install VB-CABLE virtual audio for microphone passthrough (VB-CABLE by VB-Audio, www.vb-cable.com - donationware, all participations welcome)" #endif #ifdef WithVkLayer Name: "installhdrlayer"; Description: "Install the HDR Vulkan layer (lets Vulkan games like Doom use HDR on the virtual display)" #endif +; Host-config choice, applied via `service install --gamestream=on|off` (writes PUNKTFUNK_HOST_CMD +; in host.env; a hand-customized value is left alone). Checked = the Moonlight-compatible unified +; host (the common Windows setup); unchecked = the secure native-only host (punktfunk clients only). +Name: "gamestream"; Description: "Enable GameStream (Moonlight) compatibility - lets stock Moonlight clients connect (uses legacy plain-HTTP pairing; for trusted LANs)" Name: "startservice"; Description: "Start the punktfunk host service now (also starts on every boot)" [Files] Source: "{#BinDir}\punktfunk-host.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "{#HostEnv}"; DestDir: "{app}"; Flags: ignoreversion Source: "{#Readme}"; DestDir: "{app}"; DestName: "README.txt"; Flags: ignoreversion +; The branded icon, referenced by UninstallDisplayIcon (Apps & features shows it for the entry). +Source: "{#BrandingDir}\punktfunk.ico"; DestDir: "{app}"; Flags: ignoreversion #ifdef LicensesDir ; License/attribution payload -> {app}\licenses: the project's MIT/Apache texts, the generated ; THIRD-PARTY-NOTICES (permissive crate attributions), and (on an amf-qsv build) the FFmpeg LGPL @@ -184,7 +214,8 @@ Filename: "powershell.exe"; \ #endif ; Register (or re-point, on upgrade - idempotent) the SYSTEM service from its FINAL {app} location: ; service install records current_exe() as the SCM binPath, so it must run from {app}, not {tmp}. -Filename: "{app}\punktfunk-host.exe"; Parameters: "service install"; WorkingDir: "{app}"; \ +; --gamestream=on|off carries the wizard's GameStream task choice into host.env's PUNKTFUNK_HOST_CMD. +Filename: "{app}\punktfunk-host.exe"; Parameters: "service install {code:GamestreamParam}"; WorkingDir: "{app}"; \ StatusMsg: "Registering the punktfunk host service..."; Flags: runhidden waituntilterminated Filename: "{app}\punktfunk-host.exe"; Parameters: "service start"; WorkingDir: "{app}"; \ StatusMsg: "Starting the punktfunk host service..."; Flags: runhidden waituntilterminated; Tasks: startservice @@ -198,6 +229,14 @@ Filename: "{app}\punktfunk-host.exe"; Parameters: "web setup {code:WebSetupParam [UninstallRun] Filename: "{app}\punktfunk-host.exe"; Parameters: "service uninstall"; Flags: runhidden waituntilterminated; RunOnceId: "PunktfunkHostServiceUninstall" +; Remove the punktfunk drivers we installed (pf-vdisplay devnode + driver package, then the gamepad +; driver packages). AFTER service uninstall so the host no longer holds the devices. Unconditional +; (not #ifdef'd on this build's bundled payload - an upgrade may have dropped a payload the original +; install laid down); `driver uninstall` is best-effort and no-ops when nothing is installed. +; VB-CABLE is deliberately NOT removed: it is a third-party shared component the user may use +; elsewhere - see licenses\VB-CABLE-NOTICE.txt for its own uninstall. +Filename: "{app}\punktfunk-host.exe"; Parameters: "driver uninstall"; Flags: runhidden waituntilterminated; RunOnceId: "PunktfunkVdisplayDriverUninstall" +Filename: "{app}\punktfunk-host.exe"; Parameters: "driver uninstall --gamepad"; Flags: runhidden waituntilterminated; RunOnceId: "PunktfunkGamepadDriverUninstall" #ifdef WithWeb ; Stop + remove the PunktfunkWeb task and its firewall rule (leaves %ProgramData%\punktfunk config, ; like the host uninstall does). @@ -207,6 +246,17 @@ Filename: "powershell.exe"; \ #endif [Code] +{ The GameStream task choice, forwarded to `service install` (which writes host.env's + PUNKTFUNK_HOST_CMD - only if it is unset or still one of the two canonical values, so a + hand-customized command line survives upgrades). } +function GamestreamParam(Param: String): String; +begin + if WizardIsTaskSelected('gamestream') then + Result := '--gamestream=on' + else + Result := '--gamestream=off'; +end; + #ifdef WithWeb var WebPwPage: TInputQueryWizardPage; diff --git a/scripts/ci/provision-windows-punktfunk-extras.ps1 b/scripts/ci/provision-windows-punktfunk-extras.ps1 index 7b8e7b0..cffb083 100644 --- a/scripts/ci/provision-windows-punktfunk-extras.ps1 +++ b/scripts/ci/provision-windows-punktfunk-extras.ps1 @@ -52,22 +52,48 @@ Get-BtbnFfmpeg -Dir "C:\Users\Public\ffmpeg" -ZipTag 'win64' Get-BtbnFfmpeg -Dir "C:\Users\Public\ffmpeg-arm64" -ZipTag 'winarm64' # --- Inno Setup (ISCC.exe) for the host installer build (windows-host.yml). pack-host-installer.ps1 -# locates it at its fixed Program Files path, so it need not be on PATH - just present. --- -if (-not (Test-Path "C:\Program Files (x86)\Inno Setup 6\ISCC.exe")) { +# locates it at its fixed Program Files path, so it need not be on PATH - just present. The .iss +# uses the 6.6+ styling (WizardStyle dark/dynamic + the windows11 style); an older 6.x compiles a +# plain-modern fallback, so upgrade a pre-6.6 install rather than silently shipping the old look. --- +$isccPath = "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" +$innoVer = (Get-ItemProperty 'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup 6_is1' -ErrorAction SilentlyContinue).DisplayVersion +if (-not (Test-Path $isccPath) -or ($innoVer -and [version]$innoVer -lt [version]'6.6.0')) { if (Get-Command choco -ErrorAction SilentlyContinue) { - info "installing Inno Setup (ISCC)" - choco install innosetup -y --no-progress - } else { Write-Warning "Inno Setup not found and choco unavailable - install it for windows-host.yml." } + info "installing/upgrading Inno Setup (ISCC; found: $innoVer)" + choco upgrade innosetup -y --no-progress + } else { Write-Warning "Inno Setup missing or pre-6.6 ($innoVer) and choco unavailable - install/upgrade it for windows-host.yml." } } +# --- VB-CABLE (the streaming virtual microphone the host installer bundles). Pinned official +# package, SHA-256 verified - a silent hash change means VB-Audio shipped a new pack: verify it, +# then update BOTH the pin here and the notice if terms changed (packaging/windows/licenses/ +# VB-CABLE-NOTICE.txt). Donationware by VB-Audio (https://vb-audio.com), redistributed under +# VB-Audio's bundling grant; only the base cable, never A+B/C+D. windows-host.yml points +# VBCABLE_DIR here so pack-host-installer.ps1 bundles it. --- +$vbDir = "C:\Users\Public\vbcable" +$vbUrl = "https://download.vb-audio.com/Download_CABLE/VBCABLE_Driver_Pack45.zip" +$vbSha = "B950E39F01AF1D04EA623C8F6D8EB9B6EA5C477C637295FABF20631C85116BFB" +if (-not (Test-Path (Join-Path $vbDir 'VBCABLE_Setup_x64.exe'))) { + info "fetching VB-CABLE (official base package, pinned)" + $vbZip = "$vbDir.zip" + Invoke-WebRequest -Uri $vbUrl -OutFile $vbZip -UseBasicParsing + $got = (Get-FileHash $vbZip -Algorithm SHA256).Hash + if ($got -ne $vbSha) { Remove-Item $vbZip -Force; throw "VB-CABLE download hash mismatch (got $got, pinned $vbSha) - vendor package changed; re-verify before re-pinning." } + if (Test-Path $vbDir) { Remove-Item -Recurse -Force $vbDir } + Expand-Archive -Path $vbZip -DestinationPath $vbDir -Force # flat zip (setup exes + signed drivers) + Remove-Item $vbZip -Force + info "VB-CABLE staged at $vbDir" +} else { info "VB-CABLE already present at $vbDir" } + # --- Drop punktfunk's env vars into the generic runner's daemon wrapper extension point (see # unom/infra's scripts/setup-gitea-runner-base.ps1) so the act_runner daemon - and therefore every # job it runs - sees FFMPEG_DIR without unom/infra needing to know punktfunk exists. --- $projectEnv = "C:\Users\Public\act-runner\project-env.ps1" @' $env:FFMPEG_DIR = "C:\Users\Public\ffmpeg" +$env:VBCABLE_DIR = "C:\Users\Public\vbcable" $env:PATH = "C:\Users\Public\ffmpeg\bin;" + $env:PATH '@ | Set-Content -Encoding UTF8 $projectEnv -info "wrote $projectEnv (FFMPEG_DIR) - restart the gitea-act-runner scheduled task to pick it up" +info "wrote $projectEnv (FFMPEG_DIR, VBCABLE_DIR) - restart the gitea-act-runner scheduled task to pick it up" info "punktfunk extras provisioned OK." diff --git a/scripts/windows/host.env.example b/scripts/windows/host.env.example index 2549fb9..6fda3cb 100644 --- a/scripts/windows/host.env.example +++ b/scripts/windows/host.env.example @@ -35,7 +35,9 @@ RUST_LOG=info # The host subcommand the service launches. Default: `serve --gamestream` (native punktfunk/1 host # ALWAYS on + the GameStream/Moonlight-compat planes). Use `serve` for a SECURE native-only host -# (no plain-HTTP pairing / legacy GCM nonce reuse — security-review #5/#9). Uncomment to override. +# (no plain-HTTP pairing / legacy GCM nonce reuse — security-review #5/#9). The installer's +# "Enable GameStream (Moonlight) compatibility" task sets this; a custom value you write here is +# never overwritten by a reinstall/upgrade. #PUNKTFUNK_HOST_CMD=serve --gamestream # Multi-GPU boxes only: force the NVENC/Desktop-Duplication GPU by Description substring. Leave