From 0e96df162bfcb4b0800575b4ddf8d391a10cce79 Mon Sep 17 00:00:00 2001 From: Shinichi Mukosaka Date: Sat, 9 May 2026 02:21:01 +0900 Subject: [PATCH] Fix: BitLocker locked drive not shown --- .../Global/WindowsStorageDeviceWatcher.cs | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/Files.App/Utils/Global/WindowsStorageDeviceWatcher.cs b/src/Files.App/Utils/Global/WindowsStorageDeviceWatcher.cs index dc813e6c2b31..d3fc17d62dd1 100644 --- a/src/Files.App/Utils/Global/WindowsStorageDeviceWatcher.cs +++ b/src/Files.App/Utils/Global/WindowsStorageDeviceWatcher.cs @@ -52,7 +52,7 @@ private void Win32_OnDeviceRemoved(object? sender, DeviceEventArgs e) private async void Win32_OnDeviceAdded(object? sender, DeviceEventArgs e) { var driveAdded = new DriveInfo(e.DeviceId); - if (!driveAdded.IsReady) + if (!driveAdded.IsReady && !IsUnauthorizedDrive(driveAdded)) return; var rootAdded = await FilesystemTasks.Wrap(() => StorageFolder.GetFolderFromPathAsync(e.DeviceId).AsTask()); @@ -101,7 +101,7 @@ private async void Watcher_Added(DeviceWatcher sender, DeviceInformation args) { // Check if this drive is associated with a drive letter var driveAdded = new DriveInfo(root.Path); - if (!driveAdded.IsReady) + if (!driveAdded.IsReady && !IsUnauthorizedDrive(driveAdded)) return; type = DriveHelpers.GetDriveType(driveAdded); @@ -139,5 +139,28 @@ public void Stop() DeviceManager.Default.DeviceInserted -= Win32_OnDeviceEjectedOrInserted; DeviceManager.Default.DeviceEjected -= Win32_OnDeviceEjectedOrInserted; } + + private bool IsUnauthorizedDrive(DriveInfo driveInfo) + { + try + { + _ = Directory.EnumerateFileSystemEntries(driveInfo.Name).FirstOrDefault(); + return false; + } + catch (UnauthorizedAccessException) + { + // probably BitLocker locked drive. + return true; + } + catch (IOException ex) when (ex.HResult == unchecked((int)0x80310000)) // FVE_E_LOCKED_VOLUME + { + // BitLocker locked drive. + return true; + } + catch + { + return false; + } + } } }