From a704cca09079cbad15f7e6bca1144a76d25709a9 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Wed, 27 Feb 2019 12:36:54 +0100 Subject: [PATCH] Windows: Fix context menu handling only own verbs #7004 Previously it'd handle all verbs as if they were our own. Signed-off-by: Michael Schuster --- .../windows/OCContextMenu/OCContextMenu.cpp | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/shell_integration/windows/OCContextMenu/OCContextMenu.cpp b/shell_integration/windows/OCContextMenu/OCContextMenu.cpp index 582783f48..9e9052211 100644 --- a/shell_integration/windows/OCContextMenu/OCContextMenu.cpp +++ b/shell_integration/windows/OCContextMenu/OCContextMenu.cpp @@ -182,20 +182,38 @@ IFACEMETHODIMP OCContextMenu::InvokeCommand(LPCMINVOKECOMMANDINFO pici) { std::wstring command; + CMINVOKECOMMANDINFOEX *piciEx = nullptr; + if (pici->cbSize == sizeof(CMINVOKECOMMANDINFOEX)) + piciEx = (CMINVOKECOMMANDINFOEX*)pici; + // For the Unicode case, if the high-order word is not zero, the // command's verb string is in lpcmi->lpVerbW. - if (HIWORD(((CMINVOKECOMMANDINFOEX*)pici)->lpVerbW)) - { - command = ((CMINVOKECOMMANDINFOEX *)pici)->lpVerbW; - } else { + if (piciEx + && (piciEx->fMask & CMIC_MASK_UNICODE) + && HIWORD(((CMINVOKECOMMANDINFOEX*)pici)->lpVerbW)) { + + command = piciEx->lpVerbW; + + // Verify that we handle the verb + bool handled = false; + for (auto &item : m_info.menuItems) { + if (item.command == command) { + handled = true; + break; + } + } + if (!handled) + return E_FAIL; + } else if (IS_INTRESOURCE(pici->lpVerb)) { // If the command cannot be identified through the verb string, then // check the identifier offset. - auto offset = LOWORD(pici->lpVerb); if (offset >= m_info.menuItems.size()) return E_FAIL; command = m_info.menuItems[offset].command; + } else { + return E_FAIL; } OCClientInterface::SendRequest(command.data(), m_selectedFiles); -- 2.30.2