diff options
author | Christian Kamm <mail@ckamm.de> | 2019-02-27 14:36:54 +0300 |
---|---|---|
committer | Markus Goetz <markus@woboq.com> | 2019-02-28 08:59:07 +0300 |
commit | 40a8b9b44ac0e956d080ba545939b4a47aba70c9 (patch) | |
tree | 8dbd341401b666ac16514ad004927dd234ae0a3f /shell_integration | |
parent | bff46622d56eb94d230d0e7db9bb24a8d246794c (diff) |
Windows: Fix context menu handling only own verbs #7004
Previously it'd handle all verbs as if they were our own.
Diffstat (limited to 'shell_integration')
-rw-r--r-- | shell_integration/windows/OCContextMenu/OCContextMenu.cpp | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/shell_integration/windows/OCContextMenu/OCContextMenu.cpp b/shell_integration/windows/OCContextMenu/OCContextMenu.cpp index 9356187fe..86d8fea12 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); |