Commit Graph

111 Commits

Author SHA1 Message Date
Geoffrey McRae
66b9f18cb6 [idd] helper: scroll refresh rate input 2026-08-17 02:39:15 +10:00
Geoffrey McRae
94754051a8 [idd] helper: wait for display mode enumeration 2026-08-17 02:21:53 +10:00
Geoffrey McRae
9d074519b2 [idd] config: retain four-decimal refresh rates 2026-08-17 02:09:58 +10:00
Geoffrey McRae
d23a7a3cf2 [idd] helper: release authority during device removal
Register the retained LGIdd authority handle for service device
notifications. Close the exact handle before granting query-remove.

Use cancellable overlapped control requests so the SCM handler never
waits for driver I/O while Plug and Play is removing the device.

Keep authority publication, host liveness, and child activation under
one synchronized state machine to prevent activation after removal.

Retire device notifications on the service thread and keep polling for
the interface so a manual re-enable recovers without a service restart.
2026-08-15 18:53:33 +10:00
Geoffrey McRae
066d64393d [idd] clipboard: pipeline remote file reads
Add two protocol-sized read-ahead buffers to each active clipboard
file stream. Fetch the next remote block on a worker while the caller
or CopyTo destination consumes the current block.

Serialize stream operations and invalidate queued work on seeks and
failures. Join the worker before releasing the remote dataset lease.
2026-08-15 16:32:59 +10:00
Geoffrey McRae
89b1ced8fc [idd] clipboard: pipeline helper channel
Publish ordered four-record prefixes through the Helper mapping and ring
once per accepted burst. Wake blocked producers when the peer returns
credits while retaining the bounded polling fallback.

Move received payload ownership into manager work items and place remote
file-read data directly into the waiting caller’s bounded output buffer.
This removes avoidable 256 KiB copies without changing record ordering,
timeouts, cancellation, or reset semantics.
2026-08-15 14:51:16 +10:00
Geoffrey McRae
9ea988b2a4 [idd] helper: open the IDD log directory
The interactive Helper now writes its own log under LocalAppData so it
can run with the desktop user token. The tray menu should still take
users to the system-wide IDD and service logs under ProgramData.

Expose the log-directory resolver and have Open log directory request
the ProgramData location explicitly. Keep Helper log storage unchanged.
2026-08-15 01:14:24 +10:00
Geoffrey McRae
bf8e68c888 [idd] helper: read ahead remote clipboard files
Explorer can consume FILECONTENTS streams with reads much smaller than
the 1 MiB protocol limit. Previously each IStream::Read became a
synchronous cross-VM request, including client-side path validation and
a fresh file open.

Give each clipboard file stream a lazy 1 MiB absolute-offset read-ahead
window. Serve sequential reads and seeks within that window locally.
Bypass the cache for 1 MiB-or-larger reads and for CopyTo so bulk
callers avoid an extra copy. Preserve EOF, partial-read, failure, seek,
and clone semantics.
2026-08-15 01:14:02 +10:00
Geoffrey McRae
f9ffce528a [idd] helper: run interactive process as desktop user
Explorer file copies were invisible to the Helper because the service
launched its child with a duplicate of the LocalSystem token and changed
only TokenSessionId. The child therefore remained a System-integrity
process. Windows filtered Explorer's file clipboard formats across that
integrity boundary. Basic text and bitmap formats continued to work.

Keep only the SCM service privileged. Obtain the active session user's
primary token with WTSQueryUserToken. For elevated accounts, prefer the
linked limited token. Validate its session and security properties.
Build the user environment and launch the interactive Helper on
WinSta0\Default. Gate Helper activation until the service has rechecked
the active session and registered the clipboard authority.

Use random lifetime, stop, and activation objects owned by the service.
Give the target logon SID synchronization access only. Recheck the
active console session and service state before activation. Make the
lifetime mutex terminate the Helper if the service exits unexpectedly.
Restart it when the active session, IDD host, or authority changes.

Replace the old process-handle mapping transfer with a device-bound
authority protocol on the LGIdd device interface. The service verifies
the exact driver host instance, duplicates only section map rights into
that process, and registers the session, mapping identifier, and handle.
Bind authority lifetime to its WDF file object, revoke it synchronously
on cleanup, and poll the driver host identity while the child is active.

Restrict the device stack to SYSTEM and isolate LGIdd in a unique UMDF
device group. Restrict the shared section to SYSTEM and the target logon
SID. Apply a medium mandatory label that prevents low-integrity readers
and writers. Map it with read/write rights instead of all access.

Give each clipboard mapping a second random authority identifier. Store
it only inside the logon-SID-protected mapping and send it in the
mandatory HELLO. LGIdd matches it against the service-injected mapping.
This authenticates the user Helper without the unsupported UMDF call to
GetNamedPipeClientSessionId. Have the Helper verify that its pipe server
is in session zero.

Extend the pipe endpoint with bounded authentication reads, cancellable
overlapped I/O, periodic authorization checks, and explicit disconnects.
Serialize authority changes with clipboard attach and detach. Prevent
stale cleanup from tearing down a replacement mapping. Disconnect the
user pipe immediately when its owning authority is revoked.

Run clipboard, OLE, display, configuration, and file access in the
user's interactive process. Retain its process token for worker-thread
file operations instead of querying and impersonating the desktop user
from a System process. Store Helper logs in LocalAppData and grant only
the registry rights needed by interactive configuration and UMDF.

Keep immediate, stage-specific Win32 and HRESULT diagnostics throughout
clipboard capture. Probe CF_HDROP while holding the Win32 clipboard and
enumerate the OLE object's advertised file formats. Validate returned
storage and fall back to Shell item paths when direct retrieval fails.
Validate clipboard sequence changes and defer retries during contention
without publishing incomplete clipboard state.

Complete the 1 MiB transfer work with full-sized Windows copy buffers.
Use full-sized FUSE reads and retain the named 64 KiB X11 chunk limit.
Validate the user-writable mapping with CClipboardRing before attaching.

The pipe, mapping, and authority protocols change together. LGIdd.dll,
the INF, and LGIddHelper.exe must be rebuilt and installed as one
matching set.
2026-08-15 00:42:24 +10:00
Geoffrey McRae
e40dc19c7e [idd] helper: capture file clipboard under lock 2026-08-14 21:26:47 +10:00
Geoffrey McRae
352c3c42b6 [common] clipboard: enlarge transfer buffers 2026-08-14 19:09:11 +10:00
Geoffrey McRae
9679c94b91 [idd] helper: synchronize clipboard files 2026-08-14 19:09:11 +10:00
Geoffrey McRae
9ce121f97e [idd] helper: add clipboard file primitives 2026-08-14 18:13:22 +10:00
Geoffrey McRae
71acbe71ad [idd] clipboard: accept restarted client generations
Some checks failed
build / client (Debug, map[cc:clang cxx:clang++], libdecor) (push) Has been cancelled
build / client (Debug, map[cc:clang cxx:clang++], xdg-shell) (push) Has been cancelled
build / client (Debug, map[cc:gcc cxx:g++], libdecor) (push) Has been cancelled
build / client (Debug, map[cc:gcc cxx:g++], xdg-shell) (push) Has been cancelled
build / client (Release, map[cc:clang cxx:clang++], libdecor) (push) Has been cancelled
build / client (Release, map[cc:clang cxx:clang++], xdg-shell) (push) Has been cancelled
build / client (Release, map[cc:gcc cxx:g++], libdecor) (push) Has been cancelled
build / client (Release, map[cc:gcc cxx:g++], xdg-shell) (push) Has been cancelled
build / module (push) Has been cancelled
build / host-linux (push) Has been cancelled
build / host-windows-cross (push) Has been cancelled
build / host-windows-native (push) Has been cancelled
build / idd (push) Has been cancelled
build / obs (clang) (push) Has been cancelled
build / obs (gcc) (push) Has been cancelled
build / docs (push) Has been cancelled
2026-08-14 12:46:11 +10:00
Geoffrey McRae
b786167f72 [idd] clipboard: add direct synchronization 2026-08-14 10:22:37 +10:00
Geoffrey McRae
1e4f274553 [idd] helper: follow the active console session 2026-08-14 09:40:48 +10:00
Geoffrey McRae
5b09d4f90a [idd] transport: intersect frame capabilities 2026-08-13 04:28:09 +10:00
Geoffrey McRae
bacf376305 [idd] recovery: restore fallback display
Add a protocol-independent recovery channel outside LGMP so clients can
request a usable guest display even when transport versions differ.

Synchronize recovery state with the helper across driver restarts and
restore the configured topology without persisting temporary changes.
2026-08-11 23:50:13 +10:00
Geoffrey McRae
61a49ebaba [idd] common: use CSRWLock throughout the drivers
Make CSRWLock own the native lock and provide scoped guards for shared,
exclusive, early-unlock, and non-blocking use.

Replace direct SRW lock management throughout the IDD, input driver,
and helper while preserving the existing lock scopes.
2026-08-11 23:50:13 +10:00
Geoffrey McRae
241ab3fad2 [idd] ipc: connect LGInput to LGIdd
Move the reusable named-pipe endpoint and shared support code into
the LGCommon static library.

Run a dedicated server in LGIdd and a reconnecting client in
LGInput, with device-lifecycle handling and report framing.

Refactor the helper pipe to use the same endpoint implementation.
2026-08-08 20:18:05 +10:00
Geoffrey McRae
ce47758ebd [idd] config: support fractional refresh rates
Some checks failed
build / client (Debug, map[cc:clang cxx:clang++], libdecor) (push) Has been cancelled
build / client (Debug, map[cc:clang cxx:clang++], xdg-shell) (push) Has been cancelled
build / client (Debug, map[cc:gcc cxx:g++], libdecor) (push) Has been cancelled
build / client (Debug, map[cc:gcc cxx:g++], xdg-shell) (push) Has been cancelled
build / client (Release, map[cc:clang cxx:clang++], libdecor) (push) Has been cancelled
build / client (Release, map[cc:clang cxx:clang++], xdg-shell) (push) Has been cancelled
build / client (Release, map[cc:gcc cxx:g++], libdecor) (push) Has been cancelled
build / client (Release, map[cc:gcc cxx:g++], xdg-shell) (push) Has been cancelled
build / module (push) Has been cancelled
build / host-linux (push) Has been cancelled
build / host-windows-cross (push) Has been cancelled
build / host-windows-native (push) Has been cancelled
build / idd (push) Has been cancelled
build / obs (clang) (push) Has been cancelled
build / obs (gcc) (push) Has been cancelled
build / docs (push) Has been cancelled
build / client-tests (Debug, map[cc:clang cxx:clang++], libdecor) (push) Has been cancelled
build / client-tests (Debug, map[cc:clang cxx:clang++], xdg-shell) (push) Has been cancelled
build / client-tests (Debug, map[cc:gcc cxx:g++], libdecor) (push) Has been cancelled
build / client-tests (Debug, map[cc:gcc cxx:g++], xdg-shell) (push) Has been cancelled
build / client-tests (Release, map[cc:clang cxx:clang++], libdecor) (push) Has been cancelled
build / client-tests (Release, map[cc:clang cxx:clang++], xdg-shell) (push) Has been cancelled
build / client-tests (Release, map[cc:gcc cxx:g++], libdecor) (push) Has been cancelled
build / client-tests (Release, map[cc:gcc cxx:g++], xdg-shell) (push) Has been cancelled
Store refresh rates in millihertz and preserve three decimal places.

Advertise exact rational rates while accepting legacy integer values.

Accept rates from 23.900 through 1000.000 Hz.
2026-08-06 23:40:08 +10:00
Geoffrey McRae
82ced18015 [idd] driver: initialize messages to zero 2026-08-01 16:29:18 +10:00
Geoffrey McRae
c5459dec5b [idd] driver/helper: dont allow resolutions that wont fit in ram 2026-08-01 16:28:24 +10:00
Quantum
28f18188c4 [idd] helper: use common/array.h instead of custom macros 2026-07-23 09:44:00 +10:00
Quantum
90271b936e [idd] helper: clean up exclusive monitor timer and respect setting 2026-07-23 09:44:00 +10:00
Quantum
cc6a64c4fc [idd] helper: hook up exclusive monitor toggle to registry 2026-07-23 09:44:00 +10:00
Quantum
017c2bfa54 [idd] helper: add UI to toggle exclusive monitor setting 2026-07-23 09:44:00 +10:00
Quantum
db1182da43 [idd] helper: add setting for exclusive monitor (default: yes) 2026-07-23 09:44:00 +10:00
Geoffrey McRae
d316bcdd22 [idd] helper: fix dependency cycle issue on windows 10 2026-07-23 09:44:00 +10:00
Geoffrey McRae
6f2a81edf8 [idd] ensure the only active monitor is the IDD 2026-07-23 09:44:00 +10:00
Quantum
58e0cf340d [idd] helper: implement deferred mode save and revert 2026-07-23 09:44:00 +10:00
Quantum
df861e6a15 [idd] helper: add buttons for deferred mode save and revert 2026-07-23 09:44:00 +10:00
Quantum
a23614d371 [idd] helper: rearrange UI in preparation for deferred saves 2026-07-23 09:44:00 +10:00
Quantum
b5bf5b5b5e [idd] helper: make WS_CHILD | WS_VISIBLE the default in widgets
This avoids literally every widget we load having to declare
`WS_CHILD | WS_VISIBLE` and then just break if you forget.
2026-07-23 09:43:59 +10:00
Quantum
66d8a9691e [idd] helper: update notification icon to reflect GPU availability 2026-06-07 07:04:00 +10:00
Quantum
89ddab9d57 [idd] helper: use Resources.h for icon IDs 2026-06-07 07:04:00 +10:00
Quantum
0664e510a2 [idd] helper: send message over pipe when settings changed 2026-06-06 02:30:43 +10:00
Quantum
bff890f635 [idd] helper: use per-monitor DPI awareness v2
This avoids weird issues when scaling menus and non-client areas
dynamically.
2026-06-06 02:29:33 +10:00
Quantum
2317801411 [idd] helper: update icon tip to reflect GPU state 2026-06-06 02:29:14 +10:00
Quantum
140de3199b [idd] helper: defer no GPU notification when needed
No GPU notifications are not possible before the notification icon is
created. Since the helper could start before explorer.exe (and often does
on reboot), the notification would fail.

This commit adds logic to refer the notification and we send it immediately
when successfully creating the notification icon.
2026-06-06 02:29:14 +10:00
Quantum
c8f4898815 [idd] helper: allow changing preferred mode 2026-06-06 02:28:26 +10:00
Geoffrey McRae
462f638c12 [idd] project: cleanup vcxproj.filters mess
Some checks failed
build / client (Debug, map[cc:clang cxx:clang++], libdecor) (push) Has been cancelled
build / client (Debug, map[cc:clang cxx:clang++], xdg-shell) (push) Has been cancelled
build / client (Debug, map[cc:gcc cxx:g++], libdecor) (push) Has been cancelled
build / client (Debug, map[cc:gcc cxx:g++], xdg-shell) (push) Has been cancelled
build / client (Release, map[cc:clang cxx:clang++], libdecor) (push) Has been cancelled
build / client (Release, map[cc:clang cxx:clang++], xdg-shell) (push) Has been cancelled
build / client (Release, map[cc:gcc cxx:g++], libdecor) (push) Has been cancelled
build / client (Release, map[cc:gcc cxx:g++], xdg-shell) (push) Has been cancelled
build / module (push) Has been cancelled
build / host-linux (push) Has been cancelled
build / host-windows-cross (push) Has been cancelled
build / host-windows-native (push) Has been cancelled
build / idd (push) Has been cancelled
build / obs (clang) (push) Has been cancelled
build / obs (gcc) (push) Has been cancelled
build / docs (push) Has been cancelled
2026-06-04 01:45:35 +10:00
Geoffrey McRae
37bb89f490 [idd] ipc/helper: notify the helper if a software renderer is in use 2026-06-04 01:45:35 +10:00
Geoffrey McRae
7b2c60b267 Merge branch 'master' into idd-no-gpu-warn 2026-06-03 21:35:08 +10:00
Quantum
708ed2cbae [idd] helper: add mode list reset button 2026-06-03 21:32:35 +10:00
Quantum
415a946e56 [idd] helper: avoid potential empty option deference 2026-06-03 21:32:35 +10:00
Geoffrey McRae
803aea0d21 [idd] ipc: implement reporting of GPU software status 2026-06-03 21:31:08 +10:00
Quantum
cb70643fa4 [idd] helper: load default mode list with default refresh rate
After 882d531792, the existing code in the
helper reads past the end of the array for refresh rate, which is broken.

This PR also refactors the default modes into a getDefaultModes method so
that it can be used for a reset feature later.
2026-06-03 17:03:50 +10:00
Quantum
e74f58afb4 [idd] helper: allow no GPU warning to be configured 2026-06-03 03:02:07 -04:00
Quantum
29d02ddbb9 [idd] helper: add checkbox widget 2026-06-03 03:01:47 -04:00