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 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +