ReactOS 0.4.15-dev-8058-ga7cbb60
CDefaultContextMenu.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: shell32
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/shell32/shv_item_new.c
5 * PURPOSE: provides default context menu implementation
6 * PROGRAMMERS: Johannes Anderwald (johannes.anderwald@reactos.org)
7 */
8
9#include "precomp.h"
10#include <compat_undoc.h>
11
13
14
15// FIXME: 260 is correct, but should this be part of the SDK or just MAX_PATH?
16#define MAX_VERB 260
17
18static HRESULT
20{
21 WCHAR buf[42];
22 DWORD cb = sizeof(buf);
25}
26
27static inline bool RegValueExists(HKEY hKey, LPCWSTR Name)
28{
30}
31
33{
34 MENUITEMINFOW mii;
35 mii.cbSize = FIELD_OFFSET(MENUITEMINFOW, hbmpItem); // USER32 version agnostic
36 mii.fMask = MIIM_TYPE;
37 mii.fType = Flags;
38 return InsertMenuItemW(hMenu, Pos, TRUE, &mii);
39}
40
41typedef struct _DynamicShellEntry_
42{
48
49typedef struct _StaticShellEntry_
50{
54
55#define DCM_FCIDM_SHVIEW_OFFSET 0x7000 // Offset from the menu ids in the menu resource to FCIDM_SHVIEW_*
56
57//
58// verbs for InvokeCommandInfo
59//
60static const struct _StaticInvokeCommandMap_
61{
66{
67 { "RunAs", 0 }, // Unimplemented
68 { "Print", 0 }, // Unimplemented
69 { "Preview", 0 }, // Unimplemented
70 { "Open", FCIDM_SHVIEW_OPEN },
71 { CMDSTR_NEWFOLDERA, FCIDM_SHVIEW_NEWFOLDER, (SHORT)DFM_CMD_NEWFOLDER },
72 { "cut", FCIDM_SHVIEW_CUT, /* ? */ },
79 { "copyto", FCIDM_SHVIEW_COPYTO },
80 { "moveto", FCIDM_SHVIEW_MOVETO },
81};
82
84 public CComObjectRootEx<CComMultiThreadModelNoCS>,
85 public IContextMenu3,
86 public IObjectWithSite,
87 public IServiceProvider
88{
89 private:
102 UINT m_iIdSHEFirst; /* first used id */
103 UINT m_iIdSHELast; /* last used id */
105 UINT m_iIdSCMFirst; /* first static used id */
106 UINT m_iIdSCMLast; /* last static used id */
107 UINT m_iIdCBFirst; /* first callback used id */
108 UINT m_iIdCBLast; /* last callback used id */
109 UINT m_iIdDfltFirst; /* first default part id */
110 UINT m_iIdDfltLast; /* last default part id */
111 HWND m_hwnd; /* window passed to callback */
112
114 void AddStaticEntry(const HKEY hkeyClass, const WCHAR *szVerb, UINT uFlags);
116 void TryPickDefault(HMENU hMenu, UINT idCmdFirst, UINT DfltOffset, UINT uFlags);
120 UINT AddShellExtensionsToMenu(HMENU hMenu, UINT* pIndexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags);
121 UINT AddStaticContextMenusToMenu(HMENU hMenu, UINT* IndexMenu, UINT iIdCmdFirst, UINT iIdCmdLast, UINT uFlags);
138 BOOL MapVerbToCmdId(PVOID Verb, PUINT idCmd, BOOL IsUnicode);
139
140 public:
144
145 // IContextMenu
146 STDMETHOD(QueryContextMenu)(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override;
148 STDMETHOD(GetCommandString)(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen) override;
149
150 // IContextMenu2
152
153 // IContextMenu3
154 STDMETHOD(HandleMenuMsg2)(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) override;
155
156 // IObjectWithSite
157 STDMETHOD(SetSite)(IUnknown *pUnkSite) override;
158 STDMETHOD(GetSite)(REFIID riid, void **ppvSite) override;
159
160 // IServiceProvider
162 {
163 return IUnknown_QueryService(m_site, svc, riid, ppv);
164 }
165
167 COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
168 COM_INTERFACE_ENTRY_IID(IID_IContextMenu2, IContextMenu2)
169 COM_INTERFACE_ENTRY_IID(IID_IContextMenu3, IContextMenu3)
171 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider, IServiceProvider)
173};
174
176 m_psf(NULL),
177 m_pmcb(NULL),
178 m_pfnmcb(NULL),
179 m_cidl(0),
180 m_apidl(NULL),
181 m_pDataObj(NULL),
182 m_aKeys(NULL),
183 m_cKeys(NULL),
184 m_pidlFolder(NULL),
185 m_bGroupPolicyActive(0),
186 m_iIdSHEFirst(0),
187 m_iIdSHELast(0),
188 m_iIdSCMFirst(0),
189 m_iIdSCMLast(0),
190 m_iIdCBFirst(0),
191 m_iIdCBLast(0),
192 m_iIdDfltFirst(0),
193 m_iIdDfltLast(0),
194 m_hwnd(NULL)
195{
196}
197
199{
200 m_DynamicEntries.RemoveAll();
201 m_StaticEntries.RemoveAll();
202
203 for (UINT i = 0; i < m_cKeys; i++)
206
207 if (m_pidlFolder)
209 _ILFreeaPidl(const_cast<PITEMID_CHILD *>(m_apidl), m_cidl);
210}
211
213{
214 TRACE("cidl %u\n", pdcm->cidl);
215
216 if (!pdcm->pcmcb && !lpfn)
217 {
218 ERR("CDefaultContextMenu needs a callback!\n");
219 return E_INVALIDARG;
220 }
221
222 m_cidl = pdcm->cidl;
224 if (m_cidl && !m_apidl)
225 return E_OUTOFMEMORY;
226 m_psf = pdcm->psf;
227 m_pmcb = pdcm->pcmcb;
228 m_pfnmcb = lpfn;
229 m_hwnd = pdcm->hwnd;
230
231 m_cKeys = pdcm->cKeys;
232 if (pdcm->cKeys)
233 {
234 m_aKeys = (HKEY*)HeapAlloc(GetProcessHeap(), 0, sizeof(HKEY) * pdcm->cKeys);
235 if (!m_aKeys)
236 return E_OUTOFMEMORY;
237 memcpy(m_aKeys, pdcm->aKeys, sizeof(HKEY) * pdcm->cKeys);
238 }
239
240 m_psf->GetUIObjectOf(pdcm->hwnd, m_cidl, m_apidl, IID_NULL_PPV_ARG(IDataObject, &m_pDataObj));
241
242 if (pdcm->pidlFolder)
243 {
245 }
246 else
247 {
249 if (SUCCEEDED(m_psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &pf))))
250 {
251 if (FAILED(pf->GetCurFolder(&m_pidlFolder)))
252 ERR("GetCurFolder failed\n");
253 }
254 TRACE("pidlFolder %p\n", m_pidlFolder);
255 }
256
257 return S_OK;
258}
259
261{
262 if (m_pmcb)
263 {
264 return m_pmcb->CallBack(m_psf, m_hwnd, m_pDataObj, uMsg, wParam, (LPARAM)lParam);
265 }
266 else if(m_pfnmcb)
267 {
269 }
270
271 return E_FAIL;
272}
273
274void CDefaultContextMenu::AddStaticEntry(const HKEY hkeyClass, const WCHAR *szVerb, UINT uFlags)
275{
276 POSITION it = m_StaticEntries.GetHeadPosition();
277 while (it != NULL)
278 {
279 const StaticShellEntry& info = m_StaticEntries.GetNext(it);
280 if (info.Verb.CompareNoCase(szVerb) == 0)
281 {
282 /* entry already exists */
283 return;
284 }
285 }
286
287 TRACE("adding verb %s\n", debugstr_w(szVerb));
288
289 if (!wcsicmp(szVerb, L"open") && !(uFlags & CMF_NODEFAULT))
290 {
291 /* open verb is always inserted in front */
292 m_StaticEntries.AddHead({ szVerb, hkeyClass });
293 }
294 else
295 {
296 m_StaticEntries.AddTail({ szVerb, hkeyClass });
297 }
298}
299
301{
302 WCHAR wszName[40];
303 DWORD cchName, dwIndex = 0;
304 HKEY hShellKey;
305
306 LRESULT lres = RegOpenKeyExW(hKey, L"shell", 0, KEY_READ, &hShellKey);
307 if (lres != STATUS_SUCCESS)
308 return;
309
310 while(TRUE)
311 {
312 cchName = _countof(wszName);
313 if (RegEnumKeyExW(hShellKey, dwIndex++, wszName, &cchName, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
314 break;
315
316 AddStaticEntry(hKey, wszName, uFlags);
317 }
318
319 RegCloseKey(hShellKey);
320}
321
322static
323BOOL
325{
326 BOOL bRet = FALSE;
327 CComPtr<IDataObject> pDataObj;
328
329 if (SUCCEEDED(OleGetClipboard(&pDataObj)))
330 {
331 FORMATETC formatetc;
332
333 TRACE("pDataObj=%p\n", pDataObj.p);
334
335 /* Set the FORMATETC structure*/
336 InitFormatEtc(formatetc, RegisterClipboardFormatW(CFSTR_SHELLIDLIST), TYMED_HGLOBAL);
337 bRet = SUCCEEDED(pDataObj->QueryGetData(&formatetc));
338 }
339
340 return bRet;
341}
342
343BOOL
345{
346 POSITION it = m_DynamicEntries.GetHeadPosition();
347 while (it != NULL)
348 {
349 const DynamicShellEntry& info = m_DynamicEntries.GetNext(it);
350 if (info.ClassID == clsid)
351 return TRUE;
352 }
353
354 return FALSE;
355}
356
359{
360 HRESULT hr;
361 TRACE("LoadDynamicContextMenuHandler entered with This %p hKey %p pclsid %s\n", this, hKey, wine_dbgstr_guid(&clsid));
362
364 return S_OK;
365
368 if (FAILED(hr))
369 {
370 ERR("SHCoCreateInstance(IContextMenu) failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
371 return hr;
372 }
373
374 CComPtr<IShellExtInit> pExtInit;
375 hr = pcm->QueryInterface(IID_PPV_ARG(IShellExtInit, &pExtInit));
376 if (FAILED(hr))
377 {
378 ERR("IContextMenu->QueryInterface(IShellExtInit) failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
379 return hr;
380 }
381
382 hr = pExtInit->Initialize(m_pidlFolder, m_pDataObj, hKey);
383 if (FAILED(hr))
384 {
385 WARN("IShellExtInit::Initialize failed.clsid %s hr 0x%x\n", wine_dbgstr_guid(&clsid), hr);
386 return hr;
387 }
388
389 if (m_site)
391
392 m_DynamicEntries.AddTail({ 0, 0, clsid, pcm });
393
394 return S_OK;
395}
396
397BOOL
399{
400 WCHAR wszName[MAX_PATH], wszBuf[MAX_PATH], *pwszClsid;
402 HRESULT hr;
403 HKEY hKey;
404
405 if (RegOpenKeyExW(hRootKey, L"shellex\\ContextMenuHandlers", 0, KEY_READ, &hKey) != ERROR_SUCCESS)
406 {
407 TRACE("RegOpenKeyExW failed\n");
408 return FALSE;
409 }
410
411 DWORD dwIndex = 0;
412 while (TRUE)
413 {
414 cchName = _countof(wszName);
415 if (RegEnumKeyExW(hKey, dwIndex++, wszName, &cchName, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
416 break;
417
418 /* Key name or key value is CLSID */
419 CLSID clsid;
420 hr = CLSIDFromString(wszName, &clsid);
421 if (hr == S_OK)
422 pwszClsid = wszName;
423 else
424 {
425 DWORD cchBuf = _countof(wszBuf);
426 if (RegGetValueW(hKey, wszName, NULL, RRF_RT_REG_SZ, NULL, wszBuf, &cchBuf) == ERROR_SUCCESS)
427 hr = CLSIDFromString(wszBuf, &clsid);
428 pwszClsid = wszBuf;
429 }
430
431 if (FAILED(hr))
432 {
433 ERR("CLSIDFromString failed for clsid %S hr 0x%x\n", pwszClsid, hr);
434 continue;
435 }
436
438 {
440 L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved",
441 pwszClsid,
443 NULL,
444 NULL,
446 {
447 ERR("Shell extension %s not approved!\n", pwszClsid);
448 continue;
449 }
450 }
451
453 if (FAILED(hr))
454 WARN("Failed to get context menu entires from shell extension! clsid: %S\n", pwszClsid);
455 }
456
458 return TRUE;
459}
460
461UINT
463{
464 UINT cIds = 0;
465
466 if (m_DynamicEntries.IsEmpty())
467 return cIds;
468
469 POSITION it = m_DynamicEntries.GetHeadPosition();
470 while (it != NULL)
471 {
473
474 HRESULT hr = info.pCM->QueryContextMenu(hMenu, *pIndexMenu, idCmdFirst + cIds, idCmdLast, uFlags);
475 if (SUCCEEDED(hr))
476 {
477 info.iIdCmdFirst = cIds;
478 info.NumIds = HRESULT_CODE(hr);
479 (*pIndexMenu) += info.NumIds;
480
481 cIds += info.NumIds;
482 if (idCmdFirst + cIds >= idCmdLast)
483 break;
484 }
485 TRACE("pEntry hr %x contextmenu %p cmdfirst %x num ids %x\n", hr, info.pCM.p, info.iIdCmdFirst, info.NumIds);
486 }
487 return cIds;
488}
489
490UINT
492 HMENU hMenu,
493 UINT* pIndexMenu,
494 UINT iIdCmdFirst,
495 UINT iIdCmdLast,
496 UINT uFlags)
497{
499 MENUITEMINFOW mii = { sizeof(mii) };
500 UINT idResource;
501 WCHAR wszVerb[40];
502 UINT fState;
503 UINT cIds = 0, indexFirst = *pIndexMenu;
504
506 mii.fType = MFT_STRING;
507
508 POSITION it = m_StaticEntries.GetHeadPosition();
509 bool first = true;
510 while (it != NULL)
511 {
513 BOOL forceFirstPos = FALSE;
514
515 fState = MFS_ENABLED;
516
517 /* set first entry as default */
518 if (first)
519 {
520 fState |= MFS_DEFAULT;
521 first = false;
522 }
523
524 if (info.Verb.CompareNoCase(L"open") == 0)
525 {
526 idResource = IDS_OPEN_VERB;
527 fState |= MFS_DEFAULT; /* override default when open verb is found */
528 forceFirstPos++;
529 }
530 else if (info.Verb.CompareNoCase(L"explore") == 0)
531 {
532 idResource = IDS_EXPLORE_VERB;
533 if (uFlags & CMF_EXPLORE)
534 {
535 fState |= MFS_DEFAULT;
536 forceFirstPos++;
537 }
538 }
539 else if (info.Verb.CompareNoCase(L"runas") == 0)
540 idResource = IDS_RUNAS_VERB;
541 else if (info.Verb.CompareNoCase(L"edit") == 0)
542 idResource = IDS_EDIT_VERB;
543 else if (info.Verb.CompareNoCase(L"find") == 0)
544 idResource = IDS_FIND_VERB;
545 else if (info.Verb.CompareNoCase(L"print") == 0)
546 idResource = IDS_PRINT_VERB;
547 else if (info.Verb.CompareNoCase(L"printto") == 0)
548 continue;
549 else
550 idResource = 0;
551
552 /* By default use verb for menu item name */
553 mii.dwTypeData = (LPWSTR)info.Verb.GetString();
554
555 WCHAR wszKey[sizeof("shell\\") + MAX_VERB];
556 HRESULT hr;
557 hr = StringCbPrintfW(wszKey, sizeof(wszKey), L"shell\\%s", info.Verb.GetString());
559 {
560 continue;
561 }
562
563 UINT cmdFlags = 0;
564 bool hide = false;
565 HKEY hkVerb;
566 if (idResource > 0)
567 {
568 if (!(uFlags & CMF_OPTIMIZEFORINVOKE))
569 {
570 if (LoadStringW(shell32_hInstance, idResource, wszVerb, _countof(wszVerb)))
571 mii.dwTypeData = wszVerb; /* use translated verb */
572 else
573 ERR("Failed to load string\n");
574 }
575
576 if (RegOpenKeyW(info.hkClass, wszKey, &hkVerb) != ERROR_SUCCESS)
577 hkVerb = NULL;
578 }
579 else
580 {
581 if (RegOpenKeyW(info.hkClass, wszKey, &hkVerb) == ERROR_SUCCESS)
582 {
583 if (!(uFlags & CMF_OPTIMIZEFORINVOKE))
584 {
585 DWORD cbVerb = sizeof(wszVerb);
586
587 LONG res = RegLoadMUIStringW(hkVerb, L"MUIVerb", wszVerb, cbVerb, NULL, 0, NULL);
588 if (res || !*wszVerb)
589 res = RegLoadMUIStringW(hkVerb, NULL, wszVerb, cbVerb, NULL, 0, NULL);
590
591 if (res == ERROR_SUCCESS && *wszVerb)
592 {
593 /* use description for the menu entry */
594 mii.dwTypeData = wszVerb;
595 }
596 }
597 }
598 else
599 {
600 hkVerb = NULL;
601 }
602 }
603
604 if (hkVerb)
605 {
606 if (!(uFlags & CMF_EXTENDEDVERBS))
607 hide = RegValueExists(hkVerb, L"Extended");
608
609 if (!hide)
610 hide = RegValueExists(hkVerb, L"ProgrammaticAccessOnly");
611
612 if (!hide && !(uFlags & CMF_DISABLEDVERBS))
613 hide = RegValueExists(hkVerb, L"LegacyDisable");
614
615 if (RegValueExists(hkVerb, L"NeverDefault"))
616 fState &= ~MFS_DEFAULT;
617
618 if (RegValueExists(hkVerb, L"SeparatorBefore"))
619 cmdFlags |= ECF_SEPARATORBEFORE;
620 if (RegValueExists(hkVerb, L"SeparatorAfter"))
621 cmdFlags |= ECF_SEPARATORAFTER;
622
623 RegCloseKey(hkVerb);
624 }
625
626 if (((uFlags & CMF_NODEFAULT) && ntver >= _WIN32_WINNT_VISTA) ||
627 ((uFlags & CMF_DONOTPICKDEFAULT) && ntver >= _WIN32_WINNT_WIN7))
628 {
629 fState &= ~MFS_DEFAULT;
630 }
631
632 if (!hide)
633 {
634 if (cmdFlags & ECF_SEPARATORBEFORE)
635 {
636 if (InsertMenuItemAt(hMenu, *pIndexMenu, MF_SEPARATOR))
637 (*pIndexMenu)++;
638 }
639
640 mii.fState = fState;
641 mii.wID = iIdCmdFirst + cIds;
642 if (InsertMenuItemW(hMenu, forceFirstPos ? indexFirst : *pIndexMenu, TRUE, &mii))
643 (*pIndexMenu)++;
644
645 if (cmdFlags & ECF_SEPARATORAFTER)
646 {
647 if (InsertMenuItemAt(hMenu, *pIndexMenu, MF_SEPARATOR))
648 (*pIndexMenu)++;
649 }
650 }
651 cIds++; // Always increment the id because it acts as the index into m_StaticEntries
652
653 if (mii.wID >= iIdCmdLast)
654 break;
655 }
656
657 return cIds;
658}
659
661 HMENU hMenu,
662 UINT indexMenu,
663 BOOL fByPosition,
664 UINT wID,
665 UINT fType,
666 LPCWSTR dwTypeData,
667 UINT fState)
668{
669 MENUITEMINFOW mii;
670 WCHAR wszText[100];
671
672 ZeroMemory(&mii, sizeof(mii));
673 mii.cbSize = sizeof(mii);
674 if (fType == MFT_SEPARATOR)
675 mii.fMask = MIIM_ID | MIIM_TYPE;
676 else if (fType == MFT_STRING)
677 {
679 if (IS_INTRESOURCE(dwTypeData))
680 {
681 if (LoadStringW(shell32_hInstance, LOWORD((ULONG_PTR)dwTypeData), wszText, _countof(wszText)))
682 mii.dwTypeData = wszText;
683 else
684 {
685 ERR("failed to load string %p\n", dwTypeData);
686 return;
687 }
688 }
689 else
690 mii.dwTypeData = (LPWSTR)dwTypeData;
691 mii.fState = fState;
692 }
693
694 mii.wID = wID;
695 mii.fType = fType;
696 InsertMenuItemW(hMenu, indexMenu, fByPosition, &mii);
697}
698
699void
701{
702 // Are we allowed to pick a default?
704 if (((uFlags & CMF_NODEFAULT) && ntver >= _WIN32_WINNT_VISTA) ||
705 ((uFlags & CMF_DONOTPICKDEFAULT) && ntver >= _WIN32_WINNT_WIN7))
706 {
707 return;
708 }
709
710 // Do we already have a default?
711 if ((int)GetMenuDefaultItem(hMenu, MF_BYPOSITION, 0) != -1)
712 return;
713
714 // Does the view want to pick one?
715 INT_PTR forceDfm = 0;
716 if (_DoCallback(DFM_GETDEFSTATICID, 0, &forceDfm) == S_OK && forceDfm)
717 {
718 for (UINT i = 0; i < _countof(g_StaticInvokeCmdMap); ++i)
719 {
720 UINT menuItemId = g_StaticInvokeCmdMap[i].IntVerb + DfltOffset - DCM_FCIDM_SHVIEW_OFFSET;
721 if (g_StaticInvokeCmdMap[i].DfmCmd == forceDfm &&
722 SetMenuDefaultItem(hMenu, menuItemId, MF_BYCOMMAND))
723 {
724 return;
725 }
726 }
727 }
728
729 // Don't want to pick something like cut or delete as the default but
730 // a static or dynamic verb is a good default.
732 SetMenuDefaultItem(hMenu, idCmdFirst, MF_BYCOMMAND);
733}
734
736WINAPI
738 HMENU hMenu,
739 UINT IndexMenu,
740 UINT idCmdFirst,
741 UINT idCmdLast,
742 UINT uFlags)
743{
744 HRESULT hr;
745 UINT idCmdNext = idCmdFirst;
746 UINT cIds = 0;
747
748 TRACE("BuildShellItemContextMenu entered\n");
749
750 /* Load static verbs and shell extensions from registry */
751 for (UINT i = 0; i < m_cKeys && !(uFlags & CMF_NOVERBS); i++)
752 {
755 }
756
757 /* Add static context menu handlers */
758 cIds = AddStaticContextMenusToMenu(hMenu, &IndexMenu, idCmdFirst, idCmdLast, uFlags);
759 m_iIdSCMFirst = 0; // FIXME: This should be = idCmdFirst?
760 m_iIdSCMLast = cIds;
761 idCmdNext = idCmdFirst + cIds;
762
763 /* Add dynamic context menu handlers */
764 cIds += AddShellExtensionsToMenu(hMenu, &IndexMenu, idCmdNext, idCmdLast, uFlags);
766 m_iIdSHELast = cIds;
767 idCmdNext = idCmdFirst + cIds;
768 TRACE("SH_LoadContextMenuHandlers first %x last %x\n", m_iIdSHEFirst, m_iIdSHELast);
769
770 /* Now let the callback add its own items */
771 QCMINFO qcminfo = {hMenu, IndexMenu, idCmdNext, idCmdLast, NULL};
773 {
774 UINT added = qcminfo.idCmdFirst - idCmdNext;
775 cIds += added;
776 IndexMenu += added;
778 m_iIdCBLast = cIds;
779 idCmdNext = idCmdFirst + cIds;
780 }
781
782 //TODO: DFM_MERGECONTEXTMENU_BOTTOM
783
784 UINT idDefaultOffset = 0;
785 BOOL isBackgroundMenu = !m_cidl;
786 if (!(uFlags & CMF_VERBSONLY) && !isBackgroundMenu)
787 {
788 /* Get the attributes of the items */
789 SFGAOF rfg = SFGAO_BROWSABLE | SFGAO_CANCOPY | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANDELETE | SFGAO_CANRENAME | SFGAO_HASPROPSHEET | SFGAO_FILESYSTEM | SFGAO_FOLDER;
790 hr = m_psf->GetAttributesOf(m_cidl, m_apidl, &rfg);
792 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cIds);
793
794 /* Add the default part of the menu */
795 HMENU hmenuDefault = LoadMenu(_AtlBaseModule.GetResourceInstance(), L"MENU_SHV_FILE");
796
797 /* Remove uneeded entries */
798 if (!(rfg & SFGAO_CANMOVE))
799 DeleteMenu(hmenuDefault, IDM_CUT, MF_BYCOMMAND);
800 if (!(rfg & SFGAO_CANCOPY))
801 DeleteMenu(hmenuDefault, IDM_COPY, MF_BYCOMMAND);
802 if (!((rfg & SFGAO_FILESYSTEM) && HasClipboardData()))
803 DeleteMenu(hmenuDefault, IDM_INSERT, MF_BYCOMMAND);
804 if (!(rfg & SFGAO_CANLINK))
805 DeleteMenu(hmenuDefault, IDM_CREATELINK, MF_BYCOMMAND);
806 if (!(rfg & SFGAO_CANDELETE))
807 DeleteMenu(hmenuDefault, IDM_DELETE, MF_BYCOMMAND);
808 if (!(rfg & SFGAO_CANRENAME) || !(uFlags & CMF_CANRENAME))
809 DeleteMenu(hmenuDefault, IDM_RENAME, MF_BYCOMMAND);
810 if (!(rfg & SFGAO_HASPROPSHEET))
811 DeleteMenu(hmenuDefault, IDM_PROPERTIES, MF_BYCOMMAND);
812
813 idDefaultOffset = idCmdNext;
814 UINT idMax = Shell_MergeMenus(hMenu, GetSubMenu(hmenuDefault, 0), IndexMenu, idCmdNext, idCmdLast, 0);
815 m_iIdDfltFirst = cIds;
816 cIds += idMax - idCmdNext;
817 m_iIdDfltLast = cIds;
818
819 DestroyMenu(hmenuDefault);
820 }
821
822 TryPickDefault(hMenu, idCmdFirst, idDefaultOffset, uFlags);
823
824 // TODO: DFM_MERGECONTEXTMENU_TOP
825
826 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cIds);
827}
828
830{
831 HRESULT hr;
832
834 hr = OleGetClipboard(&pda);
836 return hr;
837
838 FORMATETC formatetc2;
839 STGMEDIUM medium2;
841
842 DWORD dwKey= 0;
843
844 if (SUCCEEDED(pda->GetData(&formatetc2, &medium2)))
845 {
846 DWORD * pdwFlag = (DWORD*)GlobalLock(medium2.hGlobal);
847 if (pdwFlag)
848 {
849 if (*pdwFlag == DROPEFFECT_COPY)
850 dwKey = MK_CONTROL;
851 else
852 dwKey = MK_SHIFT;
853 }
854 else
855 {
856 ERR("No drop effect obtained\n");
857 }
858 GlobalUnlock(medium2.hGlobal);
859 }
860
861 if (bLink)
862 {
863 dwKey = MK_CONTROL|MK_SHIFT;
864 }
865
867 if (m_cidl)
868 hr = m_psf->GetUIObjectOf(NULL, 1, &m_apidl[0], IID_NULL_PPV_ARG(IDropTarget, &pdrop));
869 else
870 hr = m_psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pdrop));
871
873 return hr;
874
875 SHSimulateDrop(pdrop, pda, dwKey, NULL, NULL);
876
877 TRACE("CP result %x\n", hr);
878 return S_OK;
879}
880
883{
885 return E_FAIL;
886}
887
889{
890 if (!m_cidl || !m_pDataObj)
891 return E_FAIL;
892
894 HRESULT hr = m_psf->CreateViewObject(NULL, IID_PPV_ARG(IDropTarget, &pDT));
896 return hr;
897
899
900 return S_OK;
901}
902
904{
905 if (!m_cidl || !m_pDataObj)
906 return E_FAIL;
907
911 return hr;
912
913 DWORD grfKeyState = (lpcmi->fMask & CMIC_MASK_SHIFT_DOWN) ? MK_SHIFT : 0;
914 SHSimulateDrop(pDT, m_pDataObj, grfKeyState, NULL, NULL);
915
916 return S_OK;
917}
918
920{
921 if (!m_cidl || !m_pDataObj)
922 return E_FAIL;
923
924 FORMATETC formatetc;
926 STGMEDIUM medium = {0};
927 medium.tymed = TYMED_HGLOBAL;
928 medium.hGlobal = GlobalAlloc(GHND, sizeof(DWORD));
929 DWORD* pdwFlag = (DWORD*)GlobalLock(medium.hGlobal);
930 if (pdwFlag)
931 *pdwFlag = bCopy ? DROPEFFECT_COPY : DROPEFFECT_MOVE;
932 GlobalUnlock(medium.hGlobal);
933 m_pDataObj->SetData(&formatetc, &medium, TRUE);
934
937 return hr;
938
939 return S_OK;
940}
941
943{
945 HRESULT hr;
946
947 if (!m_site || !m_cidl)
948 return E_FAIL;
949
950 /* Get a pointer to the shell browser */
953 return hr;
954
956 hr = psb->QueryActiveShellView(&lpSV);
958 return hr;
959
960 SVSIF selFlags = SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE | SVSI_FOCUSED | SVSI_SELECT;
961 hr = lpSV->SelectItem(m_apidl[0], selFlags);
963 return hr;
964
965 return S_OK;
966}
967
971{
973
974 // We are asked to run the default property sheet
975 if (hr == S_FALSE)
976 {
978 }
979
980 return hr;
981}
982
985{
986 ERR("TODO: Undo\n");
987 return E_NOTIMPL;
988}
989
992{
993 HRESULT hr = E_FAIL;
994 if (!m_pDataObj)
995 {
996 ERR("m_pDataObj is NULL\n");
997 return hr;
998 }
999
1000 CComPtr<IContextMenu> pContextMenu;
1001 if (bCopy)
1002 hr = SHCoCreateInstance(NULL, &CLSID_CopyToMenu, NULL,
1003 IID_PPV_ARG(IContextMenu, &pContextMenu));
1004 else
1005 hr = SHCoCreateInstance(NULL, &CLSID_MoveToMenu, NULL,
1006 IID_PPV_ARG(IContextMenu, &pContextMenu));
1008 return hr;
1009
1011 hr = pContextMenu->QueryInterface(IID_PPV_ARG(IShellExtInit, &pInit));
1013 return hr;
1014
1015 hr = pInit->Initialize(m_pidlFolder, m_pDataObj, NULL);
1017 return hr;
1018
1019 if (bCopy)
1020 lpici->lpVerb = "copyto";
1021 else
1022 lpici->lpVerb = "moveto";
1023
1024 return pContextMenu->InvokeCommand((LPCMINVOKECOMMANDINFO)lpici);
1025}
1026
1027// This code is taken from CNewMenu and should be shared between the 2 classes
1028HRESULT
1031{
1032 WCHAR wszPath[MAX_PATH];
1033 WCHAR wszName[MAX_PATH];
1034 WCHAR wszNewFolder[25];
1035 HRESULT hr;
1036
1037 /* Get folder path */
1040 return hr;
1041
1042 if (!LoadStringW(shell32_hInstance, IDS_NEWFOLDER, wszNewFolder, _countof(wszNewFolder)))
1043 return E_FAIL;
1044
1045 /* Create the name of the new directory */
1046 if (!PathYetAnotherMakeUniqueName(wszName, wszPath, NULL, wszNewFolder))
1047 return E_FAIL;
1048
1049 /* Create the new directory and show the appropriate dialog in case of error */
1050 if (SHCreateDirectory(lpici->hwnd, wszName) != ERROR_SUCCESS)
1051 return E_FAIL;
1052
1053 /* Show and select the new item in the def view */
1054 LPITEMIDLIST pidl;
1055 PITEMID_CHILD pidlNewItem;
1057
1058 /* Notify the view object about the new item */
1060
1061 if (!m_site)
1062 return S_OK;
1063
1064 /* Get a pointer to the shell view */
1067 return S_OK;
1068
1069 /* Attempt to get the pidl of the new item */
1070 hr = SHILCreateFromPathW(wszName, &pidl, NULL);
1072 return hr;
1073
1074 pidlNewItem = ILFindLastID(pidl);
1075
1076 hr = psv->SelectItem(pidlNewItem, SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE |
1077 SVSI_FOCUSED | SVSI_SELECT);
1079 return hr;
1080
1081 SHFree(pidl);
1082
1083 return S_OK;
1084}
1085
1087{
1088 POSITION it = m_DynamicEntries.GetHeadPosition();
1089 while (it != NULL)
1090 {
1092
1093 if (idCmd >= info.iIdCmdFirst + info.NumIds)
1094 continue;
1095
1096 if (idCmd < info.iIdCmdFirst || idCmd > info.iIdCmdFirst + info.NumIds)
1097 return NULL;
1098
1099 return &info;
1100 }
1101
1102 return NULL;
1103}
1104
1105BOOL
1107{
1108 WCHAR UnicodeStr[MAX_VERB];
1109
1110 /* Loop through all the static verbs looking for a match */
1111 for (UINT i = 0; i < _countof(g_StaticInvokeCmdMap); i++)
1112 {
1113 /* We can match both ANSI and unicode strings */
1114 if (IsUnicode)
1115 {
1116 /* The static verbs are ANSI, get a unicode version before doing the compare */
1117 SHAnsiToUnicode(g_StaticInvokeCmdMap[i].szStringVerb, UnicodeStr, MAX_VERB);
1118 if (!wcscmp(UnicodeStr, (LPWSTR)Verb))
1119 {
1120 /* Return the Corresponding Id */
1121 *idCmd = g_StaticInvokeCmdMap[i].IntVerb;
1122 return TRUE;
1123 }
1124 }
1125 else
1126 {
1127 if (!strcmp(g_StaticInvokeCmdMap[i].szStringVerb, (LPSTR)Verb))
1128 {
1129 *idCmd = g_StaticInvokeCmdMap[i].IntVerb;
1130 return TRUE;
1131 }
1132 }
1133 }
1134
1135 return FALSE;
1136}
1137
1138HRESULT
1141{
1142 TRACE("verb %p first %x last %x\n", lpcmi->lpVerb, m_iIdSHEFirst, m_iIdSHELast);
1143
1144 UINT idCmd = LOWORD(lpcmi->lpVerb);
1146 if (!pEntry)
1147 return E_FAIL;
1148
1149 /* invoke the dynamic context menu */
1150 lpcmi->lpVerb = MAKEINTRESOURCEA(idCmd - pEntry->iIdCmdFirst);
1151 return pEntry->pCM->InvokeCommand((LPCMINVOKECOMMANDINFO)lpcmi);
1152}
1153
1154DWORD
1156{
1158 HWND hwndTree;
1159 LPCWSTR FlagsName;
1160 WCHAR wszKey[sizeof("shell\\") + MAX_VERB];
1161 HRESULT hr;
1162 DWORD wFlags;
1163 DWORD cbVerb;
1164
1165 if (!m_site)
1166 return 0;
1167
1168 /* Get a pointer to the shell browser */
1170 if (FAILED(hr))
1171 return 0;
1172
1173 /* See if we are in Explore or Browse mode. If the browser's tree is present, we are in Explore mode.*/
1174 if (SUCCEEDED(psb->GetControlWindow(FCW_TREE, &hwndTree)) && hwndTree)
1175 FlagsName = L"ExplorerFlags";
1176 else
1177 FlagsName = L"BrowserFlags";
1178
1179 /* Try to get the flag from the verb */
1180 hr = StringCbPrintfW(wszKey, sizeof(wszKey), L"shell\\%s", pEntry->Verb.GetString());
1182 return 0;
1183
1184 cbVerb = sizeof(wFlags);
1185 if (RegGetValueW(pEntry->hkClass, wszKey, FlagsName, RRF_RT_REG_DWORD, NULL, &wFlags, &cbVerb) == ERROR_SUCCESS)
1186 {
1187 return wFlags;
1188 }
1189
1190 return 0;
1191}
1192
1193HRESULT
1196{
1198 HRESULT hr;
1199
1200 if (!m_site)
1201 return E_FAIL;
1202
1203 /* Get a pointer to the shell browser */
1205 if (FAILED(hr))
1206 return hr;
1207
1208 PIDLIST_ABSOLUTE pidl;
1209 hr = SHILCombine(m_pidlFolder, pidlChild, &pidl);
1211 return hr;
1212
1213 hr = psb->BrowseObject(pidl, wFlags & ~SBSP_RELATIVE);
1214 ILFree(pidl);
1215 return hr;
1216}
1217
1218HRESULT
1220{
1221 LPITEMIDLIST pidlFull = ILCombine(m_pidlFolder, pidl);
1222 if (pidlFull == NULL)
1223 {
1224 return E_FAIL;
1225 }
1226
1227 WCHAR wszPath[MAX_PATH];
1228 BOOL bHasPath = SHGetPathFromIDListW(pidlFull, wszPath);
1229
1230 WCHAR wszDir[MAX_PATH];
1231 if (bHasPath)
1232 {
1233 wcscpy(wszDir, wszPath);
1234 PathRemoveFileSpec(wszDir);
1235 }
1236 else
1237 {
1238 if (!SHGetPathFromIDListW(m_pidlFolder, wszDir))
1239 *wszDir = UNICODE_NULL;
1240 }
1241
1243 ZeroMemory(&sei, sizeof(sei));
1244 sei.cbSize = sizeof(sei);
1245 sei.hwnd = lpcmi->hwnd;
1246 sei.nShow = SW_SHOWNORMAL;
1247 sei.lpVerb = pEntry->Verb;
1248 sei.lpDirectory = wszDir;
1249 sei.lpIDList = pidlFull;
1250 sei.hkeyClass = pEntry->hkClass;
1252 if (bHasPath)
1253 {
1254 sei.lpFile = wszPath;
1255 }
1256
1257 ShellExecuteExW(&sei);
1258
1259 ILFree(pidlFull);
1260
1261 return S_OK;
1262}
1263
1264HRESULT
1267{
1268 INT iCmd = LOWORD(lpcmi->lpVerb);
1269 HRESULT hr;
1270 UINT i;
1271
1272 POSITION it = m_StaticEntries.FindIndex(iCmd);
1273
1274 if (it == NULL)
1275 return E_INVALIDARG;
1276
1278
1279 CRegKey VerbKey;
1280 WCHAR VerbKeyPath[sizeof("shell\\") + MAX_VERB];
1281 hr = StringCbPrintfW(VerbKeyPath, sizeof(VerbKeyPath), L"shell\\%s", pEntry->Verb.GetString());
1282 if (SUCCEEDED(hr) && m_pDataObj &&
1283 VerbKey.Open(pEntry->hkClass, VerbKeyPath, KEY_READ) == ERROR_SUCCESS)
1284 {
1285 CLSID clsid;
1286
1287 DWORD KeyState = 0;
1288 if (lpcmi->fMask & CMIC_MASK_SHIFT_DOWN)
1289 KeyState |= MK_SHIFT;
1290 if (lpcmi->fMask & CMIC_MASK_CONTROL_DOWN)
1291 KeyState |= MK_CONTROL;
1292
1293 POINTL *pPtl = NULL;
1294 C_ASSERT(sizeof(POINT) == sizeof(POINTL));
1295 if (lpcmi->fMask & CMIC_MASK_PTINVOKE)
1296 pPtl = (POINTL*)&lpcmi->ptInvoke;
1297
1298 // TODO: IExecuteCommand
1299
1301 hr = SHELL_GetRegCLSID(VerbKey, L"DropTarget", L"CLSID", clsid);
1302 if (SUCCEEDED(hr))
1303 hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_PPV_ARG(IDropTarget, &pDT));
1304 if (SUCCEEDED(hr))
1305 {
1306 IUnknown_SetSite(pDT, static_cast<IContextMenu*>(this));
1307 hr = SHSimulateDrop(pDT, m_pDataObj, KeyState, pPtl, NULL);
1308 IUnknown_SetSite(pDT, NULL);
1309 return hr;
1310 }
1311 }
1312
1313 /* Get the browse flags to see if we need to browse */
1315
1316 for (i=0; i < m_cidl; i++)
1317 {
1318 /* Check if we need to browse */
1319 if (wFlags)
1320 {
1321 hr = TryToBrowse(lpcmi, m_apidl[i], wFlags);
1322 if (SUCCEEDED(hr))
1323 {
1324 /* In WinXP if we have browsed, we don't open any more folders.
1325 * In Win7 we browse to the first folder we find and
1326 * open new windows for each of the rest of the folders */
1328 if (ntver >= _WIN32_WINNT_VISTA)
1329 wFlags = 0; // FIXME: = SBSP_NEWBROWSER | (wFlags & ~SBSP_SAMEBROWSER);
1330 else
1331 i = m_cidl;
1332
1333 continue;
1334 }
1335 }
1336
1337 InvokePidl(lpcmi, m_apidl[i], pEntry);
1338 }
1339
1340 return S_OK;
1341}
1342
1343HRESULT
1344WINAPI
1347{
1348 CMINVOKECOMMANDINFOEX LocalInvokeInfo = {};
1350 UINT CmdId;
1351
1352 /* Take a local copy of the fixed members of the
1353 struct as we might need to modify the verb */
1354 memcpy(&LocalInvokeInfo, lpcmi, min(sizeof(LocalInvokeInfo), lpcmi->cbSize));
1355
1356 /* Check if this is a string verb */
1357 if (!IS_INTRESOURCE(LocalInvokeInfo.lpVerb))
1358 {
1359 /* Get the ID which corresponds to this verb, and update our local copy */
1360 if (MapVerbToCmdId((LPVOID)LocalInvokeInfo.lpVerb, &CmdId, FALSE))
1361 LocalInvokeInfo.lpVerb = MAKEINTRESOURCEA(CmdId);
1362 }
1363
1364 CmdId = LOWORD(LocalInvokeInfo.lpVerb);
1365
1366 if (!m_DynamicEntries.IsEmpty() && CmdId >= m_iIdSHEFirst && CmdId < m_iIdSHELast)
1367 {
1368 LocalInvokeInfo.lpVerb -= m_iIdSHEFirst;
1369 Result = InvokeShellExt(&LocalInvokeInfo);
1370 return Result;
1371 }
1372
1373 if (!m_StaticEntries.IsEmpty() && CmdId >= m_iIdSCMFirst && CmdId < m_iIdSCMLast)
1374 {
1375 LocalInvokeInfo.lpVerb -= m_iIdSCMFirst;
1376 Result = InvokeRegVerb(&LocalInvokeInfo);
1377 // TODO: if (FAILED(Result) && !(lpcmi->fMask & CMIC_MASK_FLAG_NO_UI)) SHELL_ErrorBox(m_pSite, Result);
1378 return Result;
1379 }
1380
1381 if (m_iIdCBFirst != m_iIdCBLast && CmdId >= m_iIdCBFirst && CmdId < m_iIdCBLast)
1382 {
1384 return Result;
1385 }
1386
1387 if (m_iIdDfltFirst != m_iIdDfltLast && CmdId >= m_iIdDfltFirst && CmdId < m_iIdDfltLast)
1388 {
1389 CmdId -= m_iIdDfltFirst;
1390 /* See the definitions of IDM_CUT and co to see how this works */
1391 CmdId += DCM_FCIDM_SHVIEW_OFFSET;
1392 }
1393
1394 if (LocalInvokeInfo.cbSize >= sizeof(CMINVOKECOMMANDINFOEX) && (LocalInvokeInfo.fMask & CMIC_MASK_PTINVOKE))
1395 {
1396 if (m_pDataObj && FAILED_UNEXPECTEDLY(DataObject_SetOffset(m_pDataObj, &LocalInvokeInfo.ptInvoke)))
1397 {
1398 ERR("Unable to add OFFSET to DataObject!\n");
1399 }
1400 }
1401
1402 /* Check if this is a Id */
1403 switch (CmdId)
1404 {
1406 Result = DoPaste(&LocalInvokeInfo, FALSE);
1407 break;
1409 Result = DoPaste(&LocalInvokeInfo, TRUE);
1410 break;
1411 case FCIDM_SHVIEW_OPEN:
1413 Result = DoOpenOrExplore(&LocalInvokeInfo);
1414 break;
1415 case FCIDM_SHVIEW_COPY:
1416 case FCIDM_SHVIEW_CUT:
1417 Result = DoCopyOrCut(&LocalInvokeInfo, CmdId == FCIDM_SHVIEW_COPY);
1418 break;
1420 Result = DoCreateLink(&LocalInvokeInfo);
1421 break;
1423 Result = DoDelete(&LocalInvokeInfo);
1424 break;
1426 Result = DoRename(&LocalInvokeInfo);
1427 break;
1429 Result = DoProperties(&LocalInvokeInfo);
1430 break;
1432 Result = DoCreateNewFolder(&LocalInvokeInfo);
1433 break;
1435 Result = DoCopyToMoveToFolder(&LocalInvokeInfo, TRUE);
1436 break;
1438 Result = DoCopyToMoveToFolder(&LocalInvokeInfo, FALSE);
1439 break;
1440 case FCIDM_SHVIEW_UNDO:
1441 Result = DoUndo(&LocalInvokeInfo);
1442 break;
1443 default:
1445 ERR("Unhandled Verb %xl\n", LOWORD(LocalInvokeInfo.lpVerb));
1446 break;
1447 }
1448
1449 return Result;
1450}
1451
1452HRESULT
1453WINAPI
1455 UINT_PTR idCommand,
1456 UINT uFlags,
1457 UINT* lpReserved,
1458 LPSTR lpszName,
1459 UINT uMaxNameLen)
1460{
1461 /* We don't handle the help text yet */
1462 if (uFlags == GCS_HELPTEXTA ||
1463 uFlags == GCS_HELPTEXTW ||
1464 HIWORD(idCommand) != 0)
1465 {
1466 return E_NOTIMPL;
1467 }
1468
1469 UINT CmdId = LOWORD(idCommand);
1470
1471 if (!m_DynamicEntries.IsEmpty() && CmdId >= m_iIdSHEFirst && CmdId < m_iIdSHELast)
1472 {
1473 idCommand -= m_iIdSHEFirst;
1475 if (!pEntry)
1476 return E_FAIL;
1477
1478 idCommand -= pEntry->iIdCmdFirst;
1479 return pEntry->pCM->GetCommandString(idCommand,
1480 uFlags,
1481 lpReserved,
1482 lpszName,
1483 uMaxNameLen);
1484 }
1485
1486 if (!m_StaticEntries.IsEmpty() && CmdId >= m_iIdSCMFirst && CmdId < m_iIdSCMLast)
1487 {
1488 /* Validation just returns S_OK on a match. The id exists. */
1489 if (uFlags == GCS_VALIDATEA || uFlags == GCS_VALIDATEW)
1490 return S_OK;
1491
1492 CmdId -= m_iIdSCMFirst;
1493
1494 POSITION it = m_StaticEntries.FindIndex(CmdId);
1495
1496 if (it == NULL)
1497 return E_INVALIDARG;
1498
1500
1501 if (uFlags == GCS_VERBW)
1502 return StringCchCopyW((LPWSTR)lpszName, uMaxNameLen, pEntry->Verb);
1503
1504 if (uFlags == GCS_VERBA)
1505 {
1506 if (SHUnicodeToAnsi(pEntry->Verb, lpszName, uMaxNameLen))
1507 return S_OK;
1508 }
1509
1510 return E_INVALIDARG;
1511 }
1512
1513 //FIXME: Should we handle callbacks here?
1514 if (m_iIdDfltFirst != m_iIdDfltLast && CmdId >= m_iIdDfltFirst && CmdId < m_iIdDfltLast)
1515 {
1516 CmdId -= m_iIdDfltFirst;
1517 /* See the definitions of IDM_CUT and co to see how this works */
1518 CmdId += DCM_FCIDM_SHVIEW_OFFSET;
1519 }
1520
1521 /* Loop looking for a matching Id */
1522 for (UINT i = 0; i < _countof(g_StaticInvokeCmdMap); i++)
1523 {
1524 if (g_StaticInvokeCmdMap[i].IntVerb == CmdId)
1525 {
1526 /* Validation just returns S_OK on a match */
1527 if (uFlags == GCS_VALIDATEA || uFlags == GCS_VALIDATEW)
1528 return S_OK;
1529
1530 /* Return a copy of the ANSI verb */
1531 if (uFlags == GCS_VERBA)
1532 return StringCchCopyA(lpszName, uMaxNameLen, g_StaticInvokeCmdMap[i].szStringVerb);
1533
1534 /* Convert the ANSI verb to unicode and return that */
1535 if (uFlags == GCS_VERBW)
1536 {
1537 if (SHAnsiToUnicode(g_StaticInvokeCmdMap[i].szStringVerb, (LPWSTR)lpszName, uMaxNameLen))
1538 return S_OK;
1539 }
1540 }
1541 }
1542
1543 return E_INVALIDARG;
1544}
1545
1546HRESULT
1547WINAPI
1549 UINT uMsg,
1550 WPARAM wParam,
1551 LPARAM lParam)
1552{
1553 /* FIXME: Should we implement this as well? */
1554 return S_OK;
1555}
1556
1558{
1559 if (uMsg == WM_DRAWITEM)
1560 {
1561 DRAWITEMSTRUCT* pDrawStruct = reinterpret_cast<DRAWITEMSTRUCT*>(lParam);
1562 *CmdId = pDrawStruct->itemID;
1563 return S_OK;
1564 }
1565 else if (uMsg == WM_MEASUREITEM)
1566 {
1567 MEASUREITEMSTRUCT* pMeasureStruct = reinterpret_cast<MEASUREITEMSTRUCT*>(lParam);
1568 *CmdId = pMeasureStruct->itemID;
1569 return S_OK;
1570 }
1571
1572 return E_FAIL;
1573}
1574
1576{
1577 if (uMsg == WM_DRAWITEM)
1578 {
1579 DRAWITEMSTRUCT* pDrawStruct = reinterpret_cast<DRAWITEMSTRUCT*>(lParam);
1580 pDrawStruct->itemID = CmdId;
1581 return S_OK;
1582 }
1583 else if (uMsg == WM_MEASUREITEM)
1584 {
1585 MEASUREITEMSTRUCT* pMeasureStruct = reinterpret_cast<MEASUREITEMSTRUCT*>(lParam);
1586 pMeasureStruct->itemID = CmdId;
1587 return S_OK;
1588 }
1589
1590 return E_FAIL;
1591}
1592
1593HRESULT
1594WINAPI
1596 UINT uMsg,
1597 WPARAM wParam,
1598 LPARAM lParam,
1599 LRESULT *plResult)
1600{
1601 if (uMsg == WM_INITMENUPOPUP)
1602 {
1603 POSITION it = m_DynamicEntries.GetHeadPosition();
1604 while (it != NULL)
1605 {
1607 SHForwardContextMenuMsg(info.pCM, uMsg, wParam, lParam, plResult, TRUE);
1608 }
1609 return S_OK;
1610 }
1611
1612 UINT CmdId;
1613 HRESULT hr = SHGetMenuIdFromMenuMsg(uMsg, lParam, &CmdId);
1614 if (FAILED(hr))
1615 return S_FALSE;
1616
1617 if (CmdId < m_iIdSHEFirst || CmdId >= m_iIdSHELast)
1618 return S_FALSE;
1619
1620 CmdId -= m_iIdSHEFirst;
1622 if (pEntry)
1623 {
1624 SHSetMenuIdInMenuMsg(uMsg, lParam, CmdId - pEntry->iIdCmdFirst);
1625 SHForwardContextMenuMsg(pEntry->pCM, uMsg, wParam, lParam, plResult, TRUE);
1626 }
1627
1628 return S_OK;
1629}
1630
1631HRESULT
1632WINAPI
1634{
1635 m_site = pUnkSite;
1636 return S_OK;
1637}
1638
1639HRESULT
1640WINAPI
1642{
1643 if (!m_site)
1644 return E_FAIL;
1645
1646 return m_site->QueryInterface(riid, ppvSite);
1647}
1648
1649static
1650HRESULT
1652{
1653 return ShellObjectCreatorInit<CDefaultContextMenu>(pdcm, lpfn, riid, ppv);
1654}
1655
1656/*************************************************************************
1657 * SHCreateDefaultContextMenu [SHELL32.325] Vista API
1658 *
1659 */
1660
1661HRESULT
1662WINAPI
1664{
1665 HRESULT hr;
1666
1667 if (!ppv)
1668 return E_INVALIDARG;
1669
1672 return hr;
1673
1674 return S_OK;
1675}
1676
1677/*************************************************************************
1678 * CDefFolderMenu_Create2 [SHELL32.701]
1679 *
1680 */
1681
1682HRESULT
1683WINAPI
1685 PCIDLIST_ABSOLUTE pidlFolder,
1686 HWND hwnd,
1687 UINT cidl,
1689 IShellFolder *psf,
1690 LPFNDFMCALLBACK lpfn,
1691 UINT nKeys,
1692 const HKEY *ahkeyClsKeys,
1693 IContextMenu **ppcm)
1694{
1695 DEFCONTEXTMENU dcm;
1696 dcm.hwnd = hwnd;
1697 dcm.pcmcb = NULL;
1698 dcm.pidlFolder = pidlFolder;
1699 dcm.psf = psf;
1700 dcm.cidl = cidl;
1701 dcm.apidl = apidl;
1703 dcm.cKeys = nKeys;
1704 dcm.aKeys = ahkeyClsKeys;
1705
1708 return hr;
1709
1710 return S_OK;
1711}
static bool RegValueExists(HKEY hKey, LPCWSTR Name)
static const struct _StaticInvokeCommandMap_ g_StaticInvokeCmdMap[]
struct _DynamicShellEntry_ * PDynamicShellEntry
struct _DynamicShellEntry_ DynamicShellEntry
static BOOL HasClipboardData()
void WINAPI _InsertMenuItemW(HMENU hMenu, UINT indexMenu, BOOL fByPosition, UINT wID, UINT fType, LPCWSTR dwTypeData, UINT fState)
static HRESULT CDefaultContextMenu_CreateInstance(const DEFCONTEXTMENU *pdcm, LPFNDFMCALLBACK lpfn, REFIID riid, void **ppv)
HRESULT WINAPI SHCreateDefaultContextMenu(const DEFCONTEXTMENU *pdcm, REFIID riid, void **ppv)
static HRESULT SHELL_GetRegCLSID(HKEY hKey, LPCWSTR SubKey, LPCWSTR Value, CLSID &clsid)
static BOOL InsertMenuItemAt(HMENU hMenu, UINT Pos, UINT Flags)
HRESULT SHSetMenuIdInMenuMsg(UINT uMsg, LPARAM lParam, UINT CmdId)
#define DCM_FCIDM_SHVIEW_OFFSET
struct _StaticShellEntry_ StaticShellEntry
struct _StaticShellEntry_ * PStaticShellEntry
HRESULT WINAPI CDefFolderMenu_Create2(PCIDLIST_ABSOLUTE pidlFolder, HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IShellFolder *psf, LPFNDFMCALLBACK lpfn, UINT nKeys, const HKEY *ahkeyClsKeys, IContextMenu **ppcm)
#define MAX_VERB
HRESULT SHGetMenuIdFromMenuMsg(UINT uMsg, LPARAM lParam, UINT *CmdId)
HRESULT CRecyclerDropTarget_CreateInstance(REFIID riid, LPVOID *ppvOut)
#define shell32_hInstance
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define IDM_PROPERTIES
Definition: resources.h:9
#define STDMETHOD(m)
Definition: basetyps.h:62
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
#define UNIMPLEMENTED
Definition: debug.h:118
#define WARN(fmt,...)
Definition: debug.h:115
#define ERR(fmt,...)
Definition: debug.h:113
HANDLE HKEY
Definition: registry.h:26
#define RegCloseKey(hKey)
Definition: registry.h:49
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
LONG Open(HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired=KEY_READ|KEY_WRITE) noexcept
Definition: atlbase.h:1173
HRESULT InvokeRegVerb(LPCMINVOKECOMMANDINFOEX lpcmi)
virtual HRESULT STDMETHODCALLTYPE QueryService(REFGUID svc, REFIID riid, void **ppv)
UINT AddShellExtensionsToMenu(HMENU hMenu, UINT *pIndexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
HRESULT DoRename(LPCMINVOKECOMMANDINFOEX lpcmi)
STDMETHOD() GetCommandString(UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen) override
BOOL MapVerbToCmdId(PVOID Verb, PUINT idCmd, BOOL IsUnicode)
HRESULT DoCreateLink(LPCMINVOKECOMMANDINFOEX lpcmi)
CComPtr< IDataObject > m_pDataObj
UINT AddStaticContextMenusToMenu(HMENU hMenu, UINT *IndexMenu, UINT iIdCmdFirst, UINT iIdCmdLast, UINT uFlags)
CComPtr< IShellFolder > m_psf
HRESULT DoUndo(LPCMINVOKECOMMANDINFOEX lpcmi)
PCUITEMID_CHILD_ARRAY m_apidl
STDMETHOD() SetSite(IUnknown *pUnkSite) override
STDMETHOD() QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) override
CComPtr< IContextMenuCB > m_pmcb
PDynamicShellEntry GetDynamicEntry(UINT idCmd)
CAtlList< StaticShellEntry > m_StaticEntries
HRESULT DoCopyOrCut(LPCMINVOKECOMMANDINFOEX lpcmi, BOOL bCopy)
void AddStaticEntry(const HKEY hkeyClass, const WCHAR *szVerb, UINT uFlags)
HRESULT DoDelete(LPCMINVOKECOMMANDINFOEX lpcmi)
HRESULT DoCopyToMoveToFolder(LPCMINVOKECOMMANDINFOEX lpici, BOOL bCopy)
DWORD BrowserFlagsFromVerb(LPCMINVOKECOMMANDINFOEX lpcmi, PStaticShellEntry pEntry)
CAtlList< DynamicShellEntry > m_DynamicEntries
HRESULT WINAPI Initialize(const DEFCONTEXTMENU *pdcm, LPFNDFMCALLBACK lpfn)
BOOL IsShellExtensionAlreadyLoaded(REFCLSID clsid)
STDMETHOD() HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam) override
HRESULT TryToBrowse(LPCMINVOKECOMMANDINFOEX lpcmi, LPCITEMIDLIST pidl, DWORD wFlags)
HRESULT DoProperties(LPCMINVOKECOMMANDINFOEX lpcmi)
CComPtr< IUnknown > m_site
BOOL EnumerateDynamicContextHandlerForKey(HKEY hRootKey)
HRESULT DoCreateNewFolder(LPCMINVOKECOMMANDINFOEX lpici)
HRESULT DoPaste(LPCMINVOKECOMMANDINFOEX lpcmi, BOOL bLink)
STDMETHOD() GetSite(REFIID riid, void **ppvSite) override
HRESULT DoOpenOrExplore(LPCMINVOKECOMMANDINFOEX lpcmi)
HRESULT LoadDynamicContextMenuHandler(HKEY hKey, REFCLSID clsid)
void TryPickDefault(HMENU hMenu, UINT idCmdFirst, UINT DfltOffset, UINT uFlags)
HRESULT InvokeShellExt(LPCMINVOKECOMMANDINFOEX lpcmi)
STDMETHOD() HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) override
HRESULT _DoCallback(UINT uMsg, WPARAM wParam, LPVOID lParam)
STDMETHOD() InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) override
PIDLIST_ABSOLUTE m_pidlFolder
HRESULT InvokePidl(LPCMINVOKECOMMANDINFOEX lpcmi, LPCITEMIDLIST pidl, PStaticShellEntry pEntry)
void AddStaticEntriesForKey(HKEY hKey, UINT uFlags)
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
static UINT RosGetProcessEffectiveVersion(VOID)
Definition: compat_undoc.h:39
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
ush Pos
Definition: deflate.h:92
#define ERROR_SUCCESS
Definition: deptool.c:10
LONG RegLoadMUIStringW(IN HKEY hKey, IN LPCWSTR pszValue OPTIONAL, OUT LPWSTR pszOutBuf, IN DWORD cbOutBuf, OUT LPDWORD pcbData OPTIONAL, IN DWORD Flags, IN LPCWSTR pszDirectory OPTIONAL)
Definition: muireg.c:53
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define DFM_GETDEFSTATICID
Definition: precomp.h:47
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
Definition: reg.c:1931
LONG WINAPI RegEnumKeyExW(_In_ HKEY hKey, _In_ DWORD dwIndex, _Out_ LPWSTR lpName, _Inout_ LPDWORD lpcbName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPWSTR lpClass, _Inout_opt_ LPDWORD lpcbClass, _Out_opt_ PFILETIME lpftLastWriteTime)
Definition: reg.c:2504
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3268
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
UINT uFlags
Definition: api.c:59
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define MAX_PATH
Definition: compat.h:34
#define HeapFree(x, y, z)
Definition: compat.h:735
#define wcsicmp
Definition: compat.h:15
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
HRESULT WINAPI OleSetClipboard(IDataObject *data)
Definition: clipboard.c:2199
HRESULT WINAPI OleGetClipboard(IDataObject **obj)
Definition: clipboard.c:2249
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
Definition: compobj.c:2338
#define RRF_RT_REG_DWORD
Definition: driver.c:578
#define RRF_RT_REG_SZ
Definition: driver.c:575
HRESULT WINAPI Shell_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdtobj)
Definition: shlfolder.cpp:497
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
HRESULT WINAPI SHCoCreateInstance(LPCWSTR aclsid, const CLSID *clsid, LPUNKNOWN pUnkOuter, REFIID refiid, LPVOID *ppv)
Definition: shellole.c:105
BOOL WINAPI PathYetAnotherMakeUniqueName(LPWSTR buffer, LPCWSTR path, LPCWSTR shortname, LPCWSTR longname)
Definition: shellpath.c:699
BOOL WINAPI SHSimulateDrop(IDropTarget *pDrop, IDataObject *pDataObj, DWORD grfKeyState, PPOINTL lpPt, DWORD *pdwEffect)
Definition: ordinal.c:1824
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
Definition: ordinal.c:1497
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
Definition: ordinal.c:1407
DWORD WINAPI SHAnsiToUnicode(LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen)
Definition: string.c:2667
INT WINAPI SHUnicodeToAnsi(LPCWSTR lpSrcStr, LPSTR lpDstStr, INT iLen)
Definition: string.c:2791
#define MAKE_HRESULT(sev, fac, code)
Definition: dmerror.h:30
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
Definition: ebrowser.c:83
#define InitFormatEtc(fe, cf, med)
Definition: editor.h:32
#define IDS_NEWFOLDER
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
PWDFDEVICE_INIT pInit
FxAutoRegKey hKey
PLIST_ENTRY pEntry
Definition: fxioqueue.cpp:4484
GLuint res
Definition: glext.h:9613
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
const GLint * first
Definition: glext.h:5794
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
Definition: heapmem.c:755
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define C_ASSERT(e)
Definition: intsafe.h:73
#define debugstr_w
Definition: kernel32.h:32
#define BEGIN_COM_MAP(x)
Definition: atlcom.h:581
#define COM_INTERFACE_ENTRY_IID(iid, x)
Definition: atlcom.h:601
#define END_COM_MAP()
Definition: atlcom.h:592
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
const IID IID_IObjectWithSite
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
#define min(a, b)
Definition: monoChain.cc:55
REFCLSID clsid
Definition: msctf.c:82
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
unsigned int * PUINT
Definition: ndis.h:50
unsigned int UINT
Definition: ndis.h:50
#define KEY_READ
Definition: nt_native.h:1023
#define UNICODE_NULL
#define L(x)
Definition: ntvdm.h:50
#define LOWORD(l)
Definition: pedump.c:82
short SHORT
Definition: pedump.c:59
long LONG
Definition: pedump.c:60
PITEMID_CHILD * _ILCopyaPidl(PCUITEMID_CHILD_ARRAY apidlsrc, UINT cidl)
Definition: pidl.c:2707
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:938
HRESULT WINAPI SHILCreateFromPathW(LPCWSTR path, LPITEMIDLIST *ppidl, DWORD *attributes)
Definition: pidl.c:401
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:198
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:712
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1353
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
Definition: pidl.c:2690
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
#define err(...)
HRESULT WINAPI SHForwardContextMenuMsg(IUnknown *pUnk, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult, BOOL useIContextMenu2)
Definition: rosordinal.c:11
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:197
#define _WIN32_WINNT_WIN7
Definition: sdkddkver.h:28
#define _WIN32_WINNT_VISTA
Definition: sdkddkver.h:25
#define SEE_MASK_CLASSKEY
Definition: shellapi.h:26
#define SEE_MASK_IDLIST
Definition: shellapi.h:27
#define STATUS_SUCCESS
Definition: shellext.h:65
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2391
int WINAPI SHCreateDirectory(HWND hWnd, LPCWSTR path)
Definition: shlfileop.cpp:847
HRESULT hr
Definition: shlfolder.c:183
#define SID_IFolderView
#define SID_IShellBrowser
UINT WINAPI Shell_MergeMenus(HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uIDAdjust, UINT uIDAdjustMax, ULONG uFlags)
Definition: shlmenu.c:856
#define DFM_CMD_DELETE
Definition: shlobj.h:2593
#define CFSTR_SHELLIDLIST
Definition: shlobj.h:543
#define CFSTR_PREFERREDDROPEFFECT
Definition: shlobj.h:553
#define SHCNE_MKDIR
Definition: shlobj.h:1878
#define DFM_CMD_NEWFOLDER
Definition: shlobj.h:2598
#define DFM_CMD_COPY
Definition: shlobj.h:2595
#define DFM_CMD_PASTE
Definition: shlobj.h:2599
#define SHCNF_FLUSH
Definition: shlobj.h:1913
#define SHCNF_PATHW
Definition: shlobj.h:1910
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2597
HRESULT(CALLBACK * LPFNDFMCALLBACK)(_In_opt_ IShellFolder *, _In_opt_ HWND, _In_opt_ IDataObject *, UINT, WPARAM, LPARAM)
Definition: shlobj.h:2553
#define DFM_CMD_RENAME
Definition: shlobj.h:2605
#define DFM_CMD_LINK
Definition: shlobj.h:2596
#define PathRemoveFileSpec
Definition: shlwapi.h:1035
#define FCIDM_SHVIEW_CUT
Definition: shresdef.h:826
#define FCIDM_SHVIEW_OPEN
Definition: shresdef.h:853
#define FCIDM_SHVIEW_UNDO
Definition: shresdef.h:829
#define IDM_DELETE
Definition: shresdef.h:866
#define FCIDM_SHVIEW_COPY
Definition: shresdef.h:827
#define IDS_OPEN_VERB
Definition: shresdef.h:212
#define IDM_INSERT
Definition: shresdef.h:864
#define FCIDM_SHVIEW_INSERTLINK
Definition: shresdef.h:830
#define IDS_FIND_VERB
Definition: shresdef.h:216
#define FCIDM_SHVIEW_NEWFOLDER
Definition: shresdef.h:849
#define IDM_RENAME
Definition: shresdef.h:867
#define IDM_COPY
Definition: shresdef.h:863
#define FCIDM_SHVIEW_EXPLORE
Definition: shresdef.h:852
#define FCIDM_SHVIEW_PROPERTIES
Definition: shresdef.h:825
#define IDS_EXPLORE_VERB
Definition: shresdef.h:213
#define IDM_CUT
Definition: shresdef.h:862
#define IDM_CREATELINK
Definition: shresdef.h:865
#define IDS_PRINT_VERB
Definition: shresdef.h:217
#define FCIDM_SHVIEW_COPYTO
Definition: shresdef.h:831
#define FCIDM_SHVIEW_MOVETO
Definition: shresdef.h:832
#define FCIDM_SHVIEW_DELETE
Definition: shresdef.h:824
#define FCIDM_SHVIEW_RENAME
Definition: shresdef.h:846
#define FCIDM_SHVIEW_CREATELINK
Definition: shresdef.h:847
#define IDS_RUNAS_VERB
Definition: shresdef.h:214
#define IDS_EDIT_VERB
Definition: shresdef.h:215
#define FCIDM_SHVIEW_INSERT
Definition: shresdef.h:828
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define _countof(array)
Definition: sndvol32.h:68
#define TRACE(s)
Definition: solgame.cpp:4
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
STRSAFEAPI StringCchCopyA(STRSAFE_LPSTR pszDest, size_t cchDest, STRSAFE_LPCSTR pszSrc)
Definition: strsafe.h:145
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:557
IContextMenuCB * pcmcb
Definition: shlobj.h:2535
IShellFolder * psf
Definition: shlobj.h:2537
IUnknown * punkAssociationInfo
Definition: shlobj.h:2540
PCUITEMID_CHILD_ARRAY apidl
Definition: shlobj.h:2539
const HKEY * aKeys
Definition: shlobj.h:2542
PCIDLIST_ABSOLUTE pidlFolder
Definition: shlobj.h:2536
CComPtr< IContextMenu > pCM
Definition: scsiwmi.h:51
UINT idCmdFirst
Definition: shlobj.h:1383
LPCWSTR lpDirectory
Definition: shellapi.h:334
LPWSTR dwTypeData
Definition: winuser.h:3269
int32_t INT_PTR
Definition: typedefs.h:64
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define HIWORD(l)
Definition: typedefs.h:247
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
#define ZeroMemory
Definition: winbase.h:1712
#define GHND
Definition: winbase.h:297
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
Definition: winbase.h:2767
_In_ DWORD _Out_ _In_ WORD wFlags
Definition: wincon.h:531
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
LONG_PTR LRESULT
Definition: windef.h:209
UINT_PTR WPARAM
Definition: windef.h:207
CONST void * LPCVOID
Definition: windef.h:191
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:2357
#define SEVERITY_SUCCESS
Definition: winerror.h:64
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define HRESULT_CODE(hr)
Definition: winerror.h:76
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define SW_SHOWNORMAL
Definition: winuser.h:770
#define MK_SHIFT
Definition: winuser.h:2369
UINT WINAPI GetMenuDefaultItem(_In_ HMENU hMenu, _In_ UINT fByPos, _In_ UINT gmdiFlags)
#define MF_BYCOMMAND
Definition: winuser.h:202
#define MIIM_ID
Definition: winuser.h:722
BOOL WINAPI SetMenuDefaultItem(_In_ HMENU, _In_ UINT, _In_ UINT)
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define IS_INTRESOURCE(i)
Definition: winuser.h:580
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)
BOOL WINAPI DeleteMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
#define MFT_SEPARATOR
Definition: winuser.h:744
#define WM_DRAWITEM
Definition: winuser.h:1645
#define MIIM_STATE
Definition: winuser.h:721
#define MFS_DEFAULT
Definition: winuser.h:748
HMENU WINAPI GetSubMenu(_In_ HMENU, _In_ int)
#define WM_INITMENUPOPUP
Definition: winuser.h:1746
#define MK_CONTROL
Definition: winuser.h:2370
#define MF_SEPARATOR
Definition: winuser.h:137
#define MF_BYPOSITION
Definition: winuser.h:203
#define LoadMenu
Definition: winuser.h:5817
#define WM_MEASUREITEM
Definition: winuser.h:1646
#define MFS_ENABLED
Definition: winuser.h:750
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define MFT_STRING
Definition: winuser.h:746
#define MIIM_DATA
Definition: winuser.h:726
#define MIIM_TYPE
Definition: winuser.h:725
BOOL WINAPI InsertMenuItemW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW)
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
static void Initialize()
Definition: xlate.c:212
#define IID_PPV_ARG(Itype, ppType)
#define IID_NULL_PPV_ARG(Itype, ppType)
const char * LPCSTR
Definition: xmlstorage.h:183
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185