diff --git a/Src/StartMenu/StartMenuHelper/ModernSettings.cpp b/Src/StartMenu/StartMenuHelper/ModernSettings.cpp index 1ef7bfd..faa24b6 100644 --- a/Src/StartMenu/StartMenuHelper/ModernSettings.cpp +++ b/Src/StartMenu/StartMenuHelper/ModernSettings.cpp @@ -359,13 +359,13 @@ ModernSettings::Setting::Setting(const Blob& blob) }); } -std::vector ModernSettings::enumerate() const +std::vector ModernSettings::enumerate() const { - std::vector retval; + std::vector retval; retval.reserve(m_settings.size()); for (const auto& i : m_settings) - retval.emplace_back(i.second); + retval.emplace_back(i.first); return retval; } diff --git a/Src/StartMenu/StartMenuHelper/ModernSettings.h b/Src/StartMenu/StartMenuHelper/ModernSettings.h index 1795a33..e1c4a18 100644 --- a/Src/StartMenu/StartMenuHelper/ModernSettings.h +++ b/Src/StartMenu/StartMenuHelper/ModernSettings.h @@ -127,7 +127,7 @@ public: } }; - std::vector enumerate() const; + std::vector enumerate() const; Setting get(const std::wstring_view& name) const; private: diff --git a/Src/StartMenu/StartMenuHelper/ModernSettingsContextMenu.cpp b/Src/StartMenu/StartMenuHelper/ModernSettingsContextMenu.cpp index 549b774..6deee67 100644 --- a/Src/StartMenu/StartMenuHelper/ModernSettingsContextMenu.cpp +++ b/Src/StartMenu/StartMenuHelper/ModernSettingsContextMenu.cpp @@ -70,6 +70,11 @@ static bool ActivateModernSettingPage(const WCHAR* page) extern ModernSettings::Setting GetModernSetting(LPCITEMIDLIST pidl); +static HRESULT Execute(const wchar_t* cmd) +{ + return (intptr_t)::ShellExecute(nullptr, L"open", cmd, nullptr, nullptr, SW_SHOWNORMAL) > 32 ? S_OK : E_FAIL; +} + static HRESULT OpenItemByPidl(LPCITEMIDLIST pidl) { auto child = ILFindLastID(pidl); @@ -80,10 +85,49 @@ static HRESULT OpenItemByPidl(LPCITEMIDLIST pidl) if (setting.hostId == L"{6E6DDBCB-9C89-434B-A994-D5F22239523B}") { + if (setting.deepLink.empty()) + return E_INVALIDARG; + std::wstring cmd(L"windowsdefender://"); cmd += setting.deepLink; - return (intptr_t)::ShellExecute(nullptr, L"open", cmd.c_str(), nullptr, nullptr, SW_SHOWNORMAL) > 32 ? S_OK : E_FAIL; + return Execute(cmd.c_str()); + } + + if (setting.hostId == L"{7E0522FC-1AC4-41CA-AFD0-3610417A9C41}") + { + if (setting.pageId.empty()) + return E_INVALIDARG; + + std::wstring cmd(L"shell:::"); + cmd += setting.pageId; + + return Execute(cmd.c_str()); + } + + if (setting.hostId == L"{12B1697E-D3A0-4DBC-B568-CCF64A3F934D}") + { + if (setting.deepLink.empty()) + return E_INVALIDARG; + + std::wstring cmd(setting.deepLink); + + if (cmd.compare(0, 8, L"shell:::") == 0) + return Execute(cmd.c_str()); + + cmd.resize(MAX_PATH); + DoEnvironmentSubst(cmd.data(), (UINT)cmd.size()); + + STARTUPINFO startupInfo = { sizeof(startupInfo) }; + PROCESS_INFORMATION processInfo{}; + + if (!CreateProcess(nullptr, cmd.data(), nullptr, nullptr, FALSE, 0, nullptr, nullptr, &startupInfo, &processInfo)) + return E_FAIL; + + CloseHandle(processInfo.hThread); + CloseHandle(processInfo.hProcess); + + return S_OK; } if (setting.pageId.empty()) diff --git a/Src/StartMenu/StartMenuHelper/ModernSettingsShellFolder.cpp b/Src/StartMenu/StartMenuHelper/ModernSettingsShellFolder.cpp index 21f9443..37ba950 100644 --- a/Src/StartMenu/StartMenuHelper/ModernSettingsShellFolder.cpp +++ b/Src/StartMenu/StartMenuHelper/ModernSettingsShellFolder.cpp @@ -91,16 +91,11 @@ public: ULONG i = 0; while (SUCCEEDED(hr) && i < celt && m_item < m_items.size()) { - const auto& s = m_items[m_item]; - if ((s.hostId.empty() && s.deepLink.empty()) || - (s.hostId == L"{6E6DDBCB-9C89-434B-A994-D5F22239523B}" && !s.deepLink.empty())) + hr = m_parent->CreateChildID(m_items[m_item], &rgelt[i]); + if (SUCCEEDED(hr)) { - hr = m_parent->CreateChildID(s.fileName, &rgelt[i]); - if (SUCCEEDED(hr)) - { - celtFetched++; - i++; - } + celtFetched++; + i++; } m_item++; @@ -141,7 +136,7 @@ public: private: CComPtr m_parent; std::shared_ptr m_settings; - std::vector m_items; + std::vector m_items; DWORD m_item = 0; };