1
0
mirror of https://github.com/veracrypt/VeraCrypt.git synced 2026-06-15 00:56:07 -05:00

Linux/WSL: open mounted volumes via Windows Explorer

Route Linux GUI mounted-volume opens through Windows Explorer when WSL interop is available, before falling back to xdg-open and known file managers.

Detect WSL by checking for /usr/bin/wslinfo and /usr/bin/wslpath, build the target path from the WSL root UNC so /mnt/<drive> mount points stay in the WSL VFS overlay, and launch Explorer directly so the folder argument is preserved.
This commit is contained in:
Mounir IDRASSI
2026-06-01 11:55:23 +09:00
parent 5407a581ac
commit 91b6ad5a19
+66
View File
@@ -11,6 +11,9 @@
*/ */
#include "System.h" #include "System.h"
#ifdef TC_LINUX
#include <algorithm>
#endif
#include <set> #include <set>
#include <typeinfo> #include <typeinfo>
#include <wx/apptrait.h> #include <wx/apptrait.h>
@@ -927,6 +930,64 @@ namespace VeraCrypt
} }
#if !defined(TC_WINDOWS) && !defined(TC_MACOSX) #if !defined(TC_WINDOWS) && !defined(TC_MACOSX)
#ifdef TC_LINUX
static bool OpenExplorerWindowUnderWsl (const string &mountPoint)
{
if (mountPoint.empty() || mountPoint[0] != '/'
|| !Process::IsExecutable ("/usr/bin/wslinfo")
|| !Process::IsExecutable ("/usr/bin/wslpath"))
return false;
try
{
list <string> args;
args.push_back ("-aw");
args.push_back ("/");
// Build from the WSL root UNC so /mnt/<drive> mount points stay in the WSL VFS overlay
string windowsPath = StringConverter::Trim (Process::Execute ("/usr/bin/wslpath", args, 2000));
if (windowsPath.size() < 2 || windowsPath[0] != '\\' || windowsPath[1] != '\\')
return false;
if (windowsPath[windowsPath.size() - 1] == '\\' || windowsPath[windowsPath.size() - 1] == '/')
windowsPath.resize (windowsPath.size() - 1);
string windowsMountPoint = mountPoint;
std::replace (windowsMountPoint.begin(), windowsMountPoint.end(), '/', '\\');
windowsPath += windowsMountPoint;
args.clear();
args.push_back ("-u");
args.push_back ("C:\\Windows\\explorer.exe");
string explorerPath = StringConverter::Trim (Process::Execute ("/usr/bin/wslpath", args, 2000));
if (explorerPath.empty() || !FilesystemPath (explorerPath).IsFile())
return false;
args.clear();
args.push_back (windowsPath);
try
{
Process::Execute (explorerPath, args, 5000);
return true;
}
catch (TimeOut&)
{
return true;
}
catch (ExecutedProcessFailed &e)
{
return e.GetExitCode () == 1 && StringConverter::Trim (e.GetErrorOutput()).empty();
}
}
catch (exception&)
{
return false;
}
}
#endif // TC_LINUX
// Define file manager structures with their required parameters // Define file manager structures with their required parameters
struct FileManager { struct FileManager {
const char* name; const char* name;
@@ -978,6 +1039,11 @@ const FileManager fileManagers[] = {
#else #else
string directoryPath = string(path); string directoryPath = string(path);
#ifdef TC_LINUX
if (OpenExplorerWindowUnderWsl (directoryPath))
return;
#endif
// Primary attempt: Use xdg-open // Primary attempt: Use xdg-open
string errorMsg; string errorMsg;
string binPath = Process::FindSystemBinary("xdg-open", errorMsg); string binPath = Process::FindSystemBinary("xdg-open", errorMsg);