Skip to content

[pull] master from microsoft:master#104

Merged
pull[bot] merged 7 commits into
cgallred:masterfrom
microsoft:master
May 26, 2026
Merged

[pull] master from microsoft:master#104
pull[bot] merged 7 commits into
cgallred:masterfrom
microsoft:master

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented May 26, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

tyrielv added 7 commits May 19, 2026 14:32
…river code

The ProjFS filter driver and native library are no longer bundled with
the GVFS installer — ProjFS is required as a Windows Optional Feature
(available since Windows 10 1809, our minimum supported OS).

Fix FilterAttach ACCESS_DENIED (bug 62349777):
- Add TryAttachToVolume() that tolerates ACCESS_DENIED when the ProjFS
  service is already running (the filter is already attached to the
  volume but the caller lacks SE_LOAD_DRIVER_PRIVILEGE).
- The service-side EnableAndAttachProjFSHandler.Run() now uses
  TryAttachToVolume instead of raw TryAttach, matching the tolerance
  already present in the client-side IsReady() path.
- Fix Run() to preserve the first error from TryEnablePrjFlt instead
  of potentially overwriting it with a subsequent attach error.

Remove dead non-inbox ProjFS code paths:
- Remove TryInstallProjFSViaINF (referenced {app}\Filter\prjflt.inf
  which is no longer shipped).
- Remove TryCopyNativeLibIfDriverVersionsMatch and supporting methods
  (referenced {app}\Filter\prjflt.sys and {app}\ProjFS\ProjectedFSLib.dll
  which are no longer shipped).
- Simplify TryEnableOrInstallDriver to always use the Windows Optional
  Feature path; keep build number logging as best-effort telemetry.
- Simplify IsNativeLibInstalled to require System32; warn if stale
  app-local DLL found from a legacy non-inbox install.

Improve error messaging:
- When ProjFS native library is missing, error now includes the
  PowerShell command to enable the optional feature.
- When ProjFS cannot be enabled, error directs user to the optional
  feature instead of referencing non-existent bundled files.

Assisted-by: Claude Opus 4.6
Signed-off-by: Tyler Vella <tyrielv@gmail.com>
When GVFS.Mount.exe fails due to authentication (credential fetch
failure or 401/403 after credentialed retry), it now exits with
ReturnCode.AuthenticationError (9) instead of GenericError (3).

The gvfs.exe mount verb captures the GVFS.Mount.exe process handle
and propagates its exit code on mount failure, so callers of
'gvfs mount' can distinguish auth failures from other errors.

Changes:
- Add ReturnCode.AuthenticationError = 9
- Add 'out bool isAuthFailure' to TryInitializeAndQueryGVFSConfig
  to explicitly classify auth failures (credential fetch failure
  or 401/403 on credentialed retry)
- InProcessMount uses isAuthFailure to select the exit code
- StartBackgroundVFS4GProcess returns Process so MountVerb can
  read the mount process exit code after failure

Resolves AB#61375690

Assisted-by: Claude Opus 4.6
Signed-off-by: Tyrie Vella <tyrielv@gmail.com>
GVFS.Service runs as SYSTEM and cannot read the user's global git
config (where gvfs.telemetry-pipe is set) at startup.  This meant
TelemetryDaemonEventListener was never created, and all service
telemetry events (PendingUpgradeHandler, etc.) were silently lost.

Add two new classes in GVFS.Common.Tracing:

- BufferingTelemetryListener: an EventListener that buffers telemetry
  messages in a bounded ConcurrentQueue, then replays them to a real
  listener on demand.

- DeferredTelemetryAttacher: manages the lifecycle of deferred
  telemetry pipe attachment.  Adds a BufferingTelemetryListener to
  the tracer, then periodically retries creating the real daemon
  listener (exponential backoff: 10s, 30s, 1m, 5m steady state).
  On success, replays buffered messages and stops the timer.
  Checks HasTelemetryDaemonListener to prevent duplicate listeners
  when the JsonTracer constructor already attached one.
  Designed for reuse by both GVFS.Service and GVFS.Mount.

TelemetryDaemonEventListener gains a globalConfigPath parameter so
callers can read a specific .gitconfig file via --file instead of
--global.  This lets GVFSService read the logged-on user's config
without mutating the process-wide HOME environment variable.

GVFSService creates a DeferredTelemetryAttacher at startup and calls
TryAttach on session logon events, passing the user's .gitconfig
path resolved via RunImpersonated.

JsonTracer gains only HasTelemetryDaemonListener (one-liner property)
to support the duplicate-listener guard.

Assisted-by: Claude Opus 4.6
Signed-off-by: Tyrie Vella <tyrielv@gmail.com>
Test BufferingTelemetryListener: buffer and replay, stop after
replay, bounded cap, second replay returns zero.

Test DeferredTelemetryAttacher: null gitBinRoot handling, retry
interval exponential backoff values.

Assisted-by: Claude Opus 4.6
Signed-off-by: Tyrie Vella <tyrielv@gmail.com>
Add unique exit code for mount authentication failures
ProjFS: tolerate ACCESS_DENIED on FilterAttach, remove dead bundled-driver code
GVFS.Service: defer and retry telemetry pipe attachment
@pull pull Bot locked and limited conversation to collaborators May 26, 2026
@pull pull Bot added the ⤵️ pull label May 26, 2026
@pull pull Bot merged commit c53aea6 into cgallred:master May 26, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant