A declared IddCx hardware cursor is IRREVOCABLE for its OS target's life (§8.6), and the sticky exclusion survives monitor REMOVE→ADD because each client gets a STABLE target id — so once any desktop-mode session declared, every later pure-capture session on that target streamed a cursor-less desktop: DWM excluded the pointer, no channel forwarded it, no blend drew it (the exact no-regression gap §8.6's per-session cap gate cannot see). Driver: track every successful SetupHardwareCursor per target (DECLARED_TARGETS — scoped to the WUDFHost's life, exactly the sticky state's scope) and report it in a new AddReply::cursor_excluded tail field (dual-size discipline, both skews degrade cleanly; no proto bump). Host: the flag rides AddedMonitor → Monitor → WinCaptureTarget; a session WITHOUT the cursor channel on a flagged target forces composite mode in the IDD-push capturer — GDI poller + blend for the session's life, pinned on (set_cursor_forward cannot clear it: with no client drawing, un-compositing would erase the pointer entirely). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
pf-driver-proto
The shared host ↔ driver binary contract for punktfunk's Windows pf-vdisplay virtual display — the control IOCTLs and the IDD-push frame transport, defined exactly once.
It's a path dependency of both the host workspace (crates/punktfunk-host)
and the out-of-workspace driver workspace (packaging/windows/drivers/),
so it must resolve identically from either build graph. That's why it's deliberately self-contained:
no_std (+ alloc), platform-neutral (GUID/LUID are plain integers each side converts to its own OS
type), and free of *.workspace = true inheritance.
Defining every wire struct here — with const size/offset asserts and bytemuck round-trips — turns
host↔driver ABI drift into a compile error instead of a silent frame or IOCTL corruption.
See the crate root (src/) for the wire types; the Windows virtual-display design is in
the internal planning repo (punktfunk-planning: windows-virtual-display-rust-port.md).