@@ -68,14 +68,15 @@ submit/destroy requests include that token so stale or unrelated clients cannot
6868control devices they did not create. Input reports are submitted through VHF,
6969and HID output writes are normalized back to the C++ output callback path.
7070
71- The driver rejects gamepad create and destroy IOCTLs unless the requestor token
72- contains the ` NT SERVICE\libvirtualhid_broker ` service SID. On the first boot
73- after installation, before Windows applies a newly configured service SID to
74- the process token, the driver instead requires the requestor PID to match the
75- SCM-registered, currently running broker service. Administrators still control
76- installation, repair, replacement, and service diagnostics through the normal
77- Windows service and driver-management tools, but they are not a separate runtime
78- bypass for creating or destroying virtual devices.
71+ The driver rejects gamepad create, destroy, and broker-instance reset IOCTLs
72+ unless the requestor token contains the ` NT SERVICE\libvirtualhid_broker `
73+ service SID. On the first boot after installation, before Windows applies a
74+ newly configured service SID to the process token, the driver instead requires
75+ the requestor PID to match the SCM-registered, currently running broker service.
76+ Administrators still control installation, repair, replacement, and service
77+ diagnostics through the normal Windows service and driver-management tools, but
78+ they are not a separate runtime bypass for creating or destroying virtual
79+ devices.
7980
8081The library and installed driver must use the same control-protocol version.
8182Protocol version 2 expands the report-descriptor capacity to 2048 bytes for the
@@ -94,7 +95,10 @@ parents that target to the control-file handle that created it. If the creating
9495process exits or crashes, Windows cleans up gamepads that were not explicitly
9596destroyed. In brokered driver packages, the broker owns that control-file handle.
9697The broker tracks the requesting client process for each created device and
97- destroys broker-owned devices when that client process exits unexpectedly.
98+ destroys broker-owned devices when that client process exits unexpectedly. A new
99+ broker process first asks the driver to remove every gamepad left by the previous
100+ broker instance and refuses new creation until that reset succeeds. Clients must
101+ recreate their gamepads after the broker service restarts.
98102
99103The backend reports ` requires_installed_driver = true ` and only advertises
100104gamepad/output-report support when the broker is reachable and the control
@@ -276,8 +280,29 @@ opens the shared persistent Polar Checkout Link. Account management opens the
276280[ LizardByte LLC Polar customer portal] ( https://polar.sh/lizardbyte-llc/portal ) ,
277281where customers can manage their five allowed machine activations.
278282
279- Normal Windows UMDF gamepad creation requires a current successful license
280- validation response before the broker calls the driver. The sole exception is
283+ Normal Windows UMDF gamepad creation requires a current machine authorization,
284+ but controller creation itself does not contact Polar. The broker validates the
285+ saved activation immediately after service startup and then once per day in the
286+ background. If validation cannot complete because of a temporary network or
287+ provider failure, the broker retries every 60 seconds. Controllers that already
288+ exist are retained for one hour unless the broker service restarts, but no
289+ additional controller can be created while at least one licensed controller
290+ remains active. When the outage reaches one hour, the broker removes excess
291+ licensed controllers and retains at most one until online validation succeeds.
292+ Failed driver destruction requests remain tracked and are retried instead of
293+ being treated as successful revocations.
294+
295+ Polar's HTTPS ` Date ` response header supplies trusted time when a new
296+ authorization is issued. A yearly license ends exactly at its reported
297+ ` expires_at ` ; the one-hour outage retention does not extend that expiration. A
298+ lifetime license has no calendar expiration. The broker advances Polar's trusted
299+ timestamp using Windows uptime and stores a random marker in a volatile registry
300+ key for the current boot session. This works across broker service restarts and
301+ includes sleep or hibernation, but never consults the user-adjustable Windows
302+ date. After Windows restarts, the marker changes, so a yearly license must
303+ reconnect to Polar before gamepad creation; lifetime licenses can use the
304+ one-gamepad outage fallback. Explicit validation requests always contact the
305+ provider. The sole exception to normal licensing is
281306for CI runners where the broker service itself has the ` GITHUB_ACTIONS `
282307environment marker. That environment receives one machine-scoped five-minute
283308evaluation window beginning with its first unlicensed creation attempt. The
@@ -290,7 +315,13 @@ Polar's `limit_activations` value is the machine limit and is configured as `5`
290315on both license-key benefits. The broker gives yearly and lifetime licenses the
291316same full local access when the provider reports the key status as ` granted ` . Polar
292317revokes a subscription benefit when its entitlement ends. Licensed access has
293- no local active-device cap, and there is no production offline grace period.
318+ no local active-device cap after successful validation. A definitive missing
319+ activation, revoked or disabled key, activation mismatch, disallowed benefit,
320+ explicit deactivation, or exact yearly expiration prevents new gamepads and
321+ causes the broker to destroy existing licensed gamepads. A timeout or other
322+ transient provider failure starts the one-hour retention period and one-gamepad
323+ creation limit instead of immediately revoking existing controllers. WinHTTP resolve, connect, send, and receive
324+ operations have explicit timeouts of 5, 5, 5, and 10 seconds respectively.
294325
295326## Profile Compatibility
296327
@@ -338,8 +369,10 @@ label because VHF does not provide a product/manufacturer string callback.
338369- The published Windows driver installer is AMD64-only. Windows ARM64 release
339370 packages require a Microsoft dashboard signing path that is not part of the
340371 current Azure Trusted Signing workflow.
341- - Every production gamepad creation requires a successful online license
342- validation response. There is no offline grace period.
372+ - A temporary Polar outage limits a previously activated machine to one active
373+ licensed gamepad until validation succeeds. Yearly licenses receive no
374+ post-expiration grace. Definitive invalidation or exact expiration prevents
375+ new gamepads and removes active licensed gamepads.
343376
344377## Signing
345378
0 commit comments