From 99ee07a42b07937575f92650ab4ca97389ce1b09 Mon Sep 17 00:00:00 2001
From: cjee21 <77721854+cjee21@users.noreply.github.com>
Date: Fri, 3 Jan 2025 18:38:20 +0800
Subject: [PATCH] ShellExt: Move file extensions list from XML to DLL
---
Source/WindowsQtPackage/AppxManifest.xml | 463 +-----------------
Source/WindowsShellExtension/dllmain.cpp | 182 ++++++-
.../MSIX/AppxManifest.xml | 463 +-----------------
3 files changed, 182 insertions(+), 926 deletions(-)
diff --git a/Source/WindowsQtPackage/AppxManifest.xml b/Source/WindowsQtPackage/AppxManifest.xml
index 3b8bf8941..6b26632a5 100644
--- a/Source/WindowsQtPackage/AppxManifest.xml
+++ b/Source/WindowsQtPackage/AppxManifest.xml
@@ -35,469 +35,10 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/Source/WindowsShellExtension/dllmain.cpp b/Source/WindowsShellExtension/dllmain.cpp
index 5ea95b1c4..c00086f2b 100644
--- a/Source/WindowsShellExtension/dllmain.cpp
+++ b/Source/WindowsShellExtension/dllmain.cpp
@@ -82,7 +82,7 @@ namespace {
// Extracted from
// https://learn.microsoft.com/en-us/archive/msdn-magazine/2017/may/c-use-modern-c-to-access-the-windows-registry#reading-a-dword-value-from-the-registry
- DWORD RegGetDword(HKEY hKey, const std::wstring& subKey, const std::wstring& value) {
+ DWORD RegGetDword(_In_ HKEY hKey, _In_ const std::wstring& subKey, _In_ const std::wstring& value) {
DWORD data{};
DWORD dataSize = sizeof(data);
LONG retCode = RegGetValue(
@@ -101,7 +101,7 @@ namespace {
// Adapted from
// https://learn.microsoft.com/en-us/archive/msdn-magazine/2017/may/c-use-modern-c-to-access-the-windows-registry#reading-a-string-value-from-the-registry
- bool RegGetBool(HKEY hKey, const std::wstring& subKey, const std::wstring& value) {
+ bool RegGetBool(_In_ HKEY hKey, _In_ const std::wstring& subKey, _In_ const std::wstring& value) {
DWORD dataSize{};
LONG retCode = RegGetValue(
hKey,
@@ -136,6 +136,167 @@ namespace {
return false;
throw std::runtime_error("Not a boolean.");
}
+
+ // Function to check for supported file extensions
+ bool IsSupportedFileExtension(_In_ const std::string& extension) {
+ const std::vector supported_extensions = {
+ ".264",
+ ".3g2",
+ ".3ga",
+ ".3gp",
+ ".3gpa",
+ ".3gpp",
+ ".aa3",
+ ".aac",
+ ".aacp",
+ ".adts",
+ ".ac3",
+ ".act",
+ ".aif",
+ ".aifc",
+ ".aiff",
+ ".amr",
+ ".ape",
+ ".asf",
+ ".at3",
+ ".au",
+ ".aud",
+ ".aue",
+ ".avi",
+ ".avif",
+ ".avs",
+ ".bdmv",
+ ".bmp",
+ ".bms",
+ ".braw",
+ ".caf",
+ ".clpi",
+ ".dat",
+ ".dde",
+ ".divx",
+ ".dpg",
+ ".dff",
+ ".dsd",
+ ".dsf",
+ ".dts",
+ ".dtshd",
+ ".dv",
+ ".dvr",
+ ".dvr-ms",
+ ".eac3",
+ ".evo",
+ ".f4a",
+ ".f4b",
+ ".f4v",
+ ".fla",
+ ".flc",
+ ".fli",
+ ".flac",
+ ".flv",
+ ".gvi",
+ ".gif",
+ ".gis",
+ ".h264",
+ ".h3d",
+ ".hdmov",
+ ".heic",
+ ".heif",
+ ".iamf",
+ ".ico",
+ ".ifo",
+ ".ism",
+ ".isma",
+ ".ismv",
+ ".j2k",
+ ".jp2",
+ ".jpeg",
+ ".jpg",
+ ".jps",
+ ".jxl",
+ ".m1s",
+ ".m1t",
+ ".m1v",
+ ".m2p",
+ ".m2s",
+ ".m2t",
+ ".m2ts",
+ ".m2v",
+ ".m4a",
+ ".m4b",
+ ".m4v",
+ ".mac",
+ ".mk3d",
+ ".mka",
+ ".mks",
+ ".mkv",
+ ".mlp",
+ ".mod",
+ ".mov",
+ ".mp+",
+ ".mp2",
+ ".mp3",
+ ".mp4",
+ ".mpc",
+ ".mpd",
+ ".mpe",
+ ".mpeg",
+ ".mpg",
+ ".mpgv",
+ ".mpgx",
+ ".mpls",
+ ".mpm",
+ ".mpo",
+ ".mpv",
+ ".mts",
+ ".mxf",
+ ".oga",
+ ".ogg",
+ ".ogm",
+ ".ogv",
+ ".ogx",
+ ".oma",
+ ".opus",
+ ".png",
+ ".pns",
+ ".qcp",
+ ".qt",
+ ".ra",
+ ".rm",
+ ".rmvb",
+ ".shn",
+ ".smv",
+ ".spdif",
+ ".spx",
+ ".stl",
+ ".swf",
+ ".tak",
+ ".thd",
+ ".thd+ac3",
+ ".tif",
+ ".tiff",
+ ".tmf",
+ ".tp",
+ ".trec",
+ ".trp",
+ ".ts",
+ ".tta",
+ ".ty",
+ ".vob",
+ ".vqf",
+ ".vro",
+ ".w64",
+ ".wav",
+ ".webm",
+ ".webp",
+ ".wma",
+ ".wmv",
+ ".wtv",
+ ".wv",
+ ".wvc",
+ ".y4m"
+ };
+ return std::any_of(supported_extensions.begin(), supported_extensions.end(), [extension](const std::string& extension_iter) {return (extension_iter.compare(extension) == 0); });
+ }
}
struct ExplorerCommandHandler : public winrt::implements {
@@ -174,8 +335,9 @@ struct ExplorerCommandHandler : public winrt::implementsGetCount(&count));
@@ -183,14 +345,26 @@ struct ExplorerCommandHandler : public winrt::implements item;
if (SUCCEEDED(items->GetItemAt(0, item.put()))) {
SFGAOF attribute = 0;
- if (SUCCEEDED(item->GetAttributes(SFGAO_FOLDER, &attribute)))
+ if (SUCCEEDED(item->GetAttributes(SFGAO_FOLDER, &attribute))) {
if (attribute & SFGAO_FOLDER)
is_folder = true;
+ else {
+ wil::unique_cotaskmem_string path;
+ if (SUCCEEDED(item->GetDisplayName(SIGDN_FILESYSPATH, &path))) {
+ std::filesystem::path filepath = path.get();
+ is_supported_extension = IsSupportedFileExtension(filepath.extension().string());
+ }
+ }
+ }
}
}
}
// Check for files
+ if (!is_supported_extension && !is_folder) {
+ *cmdState = ECS_HIDDEN;
+ return S_OK;
+ }
try {
#ifdef MEDIAINFO_QT
if (!RegGetBool(HKEY_CURRENT_USER, L"Software\\MediaArea.net\\MediaInfo", L"shellExtension"))
diff --git a/Source/WindowsSparsePackage/MSIX/AppxManifest.xml b/Source/WindowsSparsePackage/MSIX/AppxManifest.xml
index c2b373e3d..100f577c7 100644
--- a/Source/WindowsSparsePackage/MSIX/AppxManifest.xml
+++ b/Source/WindowsSparsePackage/MSIX/AppxManifest.xml
@@ -40,469 +40,10 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+