63 UINT idCmdBase = pQCMI->idCmdFirst, idCmdFirst = idCmdBase;
70 if (fCmf & CMF_DEFAULTONLY)
80 for (
UINT iKey = 0; iKey < nKeys; ++iKey)
86 if (
FAILED(
hr =
pInit->Initialize(pidlFolder, pDO, pKeys[iKey])))
94 hr = pCM->
QueryContextMenu(pQCMI->hmenu, pQCMI->indexMenu + nOffset, idCmdFirst, pQCMI->idCmdLast, fCmf);
96 const UINT idThisFirst = idCmdFirst - idCmdBase;
97 DCMENTRY dcme = { pCM, idThisFirst, idThisFirst + nCount - 1 };
100 idCmdFirst += nCount;
129 else if (
id >=
p->idCmdFirst && id <= p->idCmdLast)
131 CMINVOKECOMMANDINFOEX ici;
133 ici.cbSize =
min(
sizeof(ici), pICI->cbSize);
135 ici.lpVerbW = (
PWSTR)ici.lpVerb;
136 return p->pCM->InvokeCommand((CMINVOKECOMMANDINFO*)&ici);
155#define DCM_FCIDM_SHVIEW_OFFSET 0x7000
201 const UINT gcs = IsUnicode ? GCS_VERBW : GCS_VERBA;
202 for (
UINT id = idFirst;
id <= idLast; ++
id)
219 return Ch ==
L' ' ||
Ch ==
L',';
390 m_bGroupPolicyActive(0),
428 if (!pdcm->
pcmcb && !lpfn)
430 ERR(
"CDefaultContextMenu needs a callback!\n");
465 ERR(
"GetCurFolder failed\n");
493 if (
info.Verb.CompareNoCase(szVerb) == 0)
552 TRACE(
"pDataObj=%p\n", pDataObj.
p);
556 bRet =
SUCCEEDED(pDataObj->QueryGetData(&formatetc));
626 TRACE(
"RegOpenKeyExW failed\n");
652 ERR(
"CLSIDFromString failed for clsid %S hr 0x%x\n", pwszClsid,
hr);
659 L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved",
666 ERR(
"Shell extension %s not approved!\n", pwszClsid);
673 WARN(
"Failed to get context menu entires from shell extension! clsid: %S\n", pwszClsid);
693 HRESULT hr =
info.pCM->QueryContextMenu(hMenu, *pIndexMenu, idCmdFirst + cIds, idCmdLast,
uFlags);
696 info.iIdCmdFirst = cIds;
698 (*pIndexMenu) +=
info.NumIds;
701 if (idCmdFirst + cIds >= idCmdLast)
704 TRACE(
"pEntry hr %x contextmenu %p cmdfirst %x num ids %x\n",
hr,
info.pCM.p,
info.iIdCmdFirst,
info.NumIds);
719 WCHAR wszDispVerb[80];
720 UINT fState, idVerbRes;
721 UINT cIds = 0, indexFirst = *pIndexMenu, indexDefault;
722 int iDefVerbIndex = -1;
744 if (
info.Verb.CompareNoCase(
L"open") == 0)
750 else if (
info.Verb.CompareNoCase(
L"explore") == 0)
759 else if (
info.Verb.CompareNoCase(
L"printto") == 0)
776 if (!(
uFlags & CMF_OPTIMIZEFORINVOKE))
778 DWORD cbVerb =
sizeof(wszDispVerb);
780 if (
res || !*wszDispVerb)
798 if (!hide && !(
uFlags & CMF_EXTENDEDVERBS))
804 if (!hide && !(
uFlags & CMF_DISABLEDVERBS))
811 fState &= ~MFS_DEFAULT;
814 cmdFlags |= ECF_SEPARATORBEFORE;
816 cmdFlags |= ECF_SEPARATORAFTER;
824 fState &= ~MFS_DEFAULT;
829 if (cmdFlags & ECF_SEPARATORBEFORE)
839 if (verbIndex < iDefVerbIndex || iDefVerbIndex < 0)
841 iDefVerbIndex = verbIndex;
843 forceFirstPos =
TRUE;
847 fState &= ~MFS_DEFAULT;
851 else if (iDefVerbIndex >= 0)
853 fState &= ~MFS_DEFAULT;
856 forceFirstPos =
FALSE;
860 mii.
wID = iIdCmdFirst + cIds;
864 if (cmdFlags & ECF_SEPARATORAFTER)
871 indexDefault = *pIndexMenu;
875 if (mii.
wID >= iIdCmdLast)
907 ERR(
"failed to load string %p\n", dwTypeData);
925 if ((
uFlags & CMF_NODEFAULT) ||
969 TRACE(
"BuildShellItemContextMenu entered\n");
982 idCmdNext = idCmdFirst + cIds;
988 idCmdNext = idCmdFirst + cIds;
992 QCMINFO qcminfo = {hMenu, IndexMenu, idCmdNext, idCmdLast,
NULL};
1000 idCmdNext = idCmdFirst + cIds;
1005 UINT idDefaultOffset = 0;
1007 if (!(
uFlags & CMF_VERBSONLY) && !isBackgroundMenu)
1010 SFGAOF rfg = SFGAO_BROWSABLE | SFGAO_CANCOPY | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANDELETE | SFGAO_CANRENAME | SFGAO_HASPROPSHEET | SFGAO_FILESYSTEM | SFGAO_FOLDER;
1019 if (!(rfg & SFGAO_CANMOVE))
1021 if (!(rfg & SFGAO_CANCOPY))
1025 if (!(rfg & SFGAO_CANLINK))
1027 if (!(rfg & SFGAO_CANDELETE))
1029 if (!(rfg & SFGAO_CANRENAME) || !(
uFlags & CMF_CANRENAME))
1031 if (!(rfg & SFGAO_HASPROPSHEET))
1034 idDefaultOffset = idCmdNext;
1037 cIds += idMax - idCmdNext;
1066 FORMATETC formatetc2;
1072 if (
SUCCEEDED(pda->GetData(&formatetc2, &medium2)))
1077 if (*pdwFlag == DROPEFFECT_COPY)
1084 ERR(
"No drop effect obtained\n");
1157 FORMATETC formatetc;
1159 STGMEDIUM medium = {0};
1160 medium.tymed = TYMED_HGLOBAL;
1164 *pdwFlag = bCopy ? DROPEFFECT_COPY : DROPEFFECT_MOVE;
1177 psfv->SetClipboard(!bCopy);
1199 hr = psb->QueryActiveShellView(&lpSV);
1203 SVSIF selFlags = SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE | SVSI_FOCUSED | SVSI_SELECT;
1204 hr = lpSV->SelectItem(
m_apidl[0], selFlags);
1229 ERR(
"TODO: Undo\n");
1240 WCHAR wszNewFolder[25];
1282 hr = psv->SelectItem(pidlNewItem, SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE |
1283 SVSI_FOCUSED | SVSI_SELECT);
1299 if (idCmd >=
info.iIdCmdFirst +
info.NumIds)
1302 if (idCmd < info.iIdCmdFirst || idCmd >
info.iIdCmdFirst +
info.NumIds)
1403 if (
SUCCEEDED(psb->GetControlWindow(FCW_TREE, &hwndTree)) && hwndTree)
1404 FlagsName =
L"ExplorerFlags";
1406 FlagsName =
L"BrowserFlags";
1442 hr = psb->BrowseObject(pidl,
wFlags & ~SBSP_RELATIVE);
1450 const BOOL unicode = IsUnicode(*lpcmi);
1453 if (pidlFull ==
NULL)
1498 if (!sei.
lpClass && (lpcmi->
fMask & (CMIC_MASK_HASLINKNAME | CMIC_MASK_HASTITLE)) && unicode)
1530 if (lpcmi->
fMask & CMIC_MASK_SHIFT_DOWN)
1532 if (lpcmi->
fMask & CMIC_MASK_CONTROL_DOWN)
1537 if (lpcmi->
fMask & CMIC_MASK_PTINVOKE)
1601 BOOL Unicode = IsUnicode(*lpcmi);
1631 memcpy(&LocalInvokeInfo, lpcmi,
min(
sizeof(LocalInvokeInfo), lpcmi->
cbSize));
1676 ERR(
"Unable to add OFFSET to DataObject!\n");
1730 if (
uFlags == GCS_HELPTEXTA ||
1731 uFlags == GCS_HELPTEXTW ||
1755 idCommand -=
pEntry->iIdCmdFirst;
1756 return pEntry->pCM->GetCommandString(idCommand,
1766 if (
uFlags == GCS_VALIDATEA ||
uFlags == GCS_VALIDATEW)
1804 if (
uFlags == GCS_VALIDATEA ||
uFlags == GCS_VALIDATEW)
1838 *CmdId = pDrawStruct->
itemID;
1844 *CmdId = pMeasureStruct->
itemID;
1900 return m_site->QueryInterface(
riid, ppvSite);
1907 return ShellObjectCreatorInit<CDefaultContextMenu>(pdcm, lpfn,
riid,
ppv);
1946 const HKEY *ahkeyClsKeys,
1958 dcm.
aKeys = ahkeyClsKeys;
HRESULT CRecyclerDropTarget_CreateInstance(REFIID riid, LPVOID *ppvOut)
static _Out_opt_ PULONGLONG Start
#define shell32_hInstance
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define RegCloseKey(hKey)
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
static UINT RosGetProcessEffectiveVersion(VOID)
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)
#define DFM_GETDEFSTATICID
#define DFM_INVOKECOMMANDEX
#define DFM_MERGECONTEXTMENU
#define DFM_INVOKECOMMAND
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
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)
INT WINAPI StringFromGUID2(REFGUID guid, LPOLESTR str, INT cmax)
HRESULT WINAPI CLSIDFromString(LPCOLESTR str, LPCLSID clsid)
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
void WINAPI CoTaskMemFree(void *ptr)
LPWSTR WINAPI StrChrW(LPCWSTR lpszStr, WCHAR ch)
#define ERROR_NO_MORE_ITEMS
int WINAPI lstrcmpiA(LPCSTR str1, LPCSTR str2)
#define IS_INTRESOURCE(x)
DWORD WINAPI GetVersion(void)
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
_ACRTIMP int __cdecl _wcsnicmp(const wchar_t *, const wchar_t *, size_t)
HRESULT WINAPI OleSetClipboard(IDataObject *data)
HRESULT WINAPI OleGetClipboard(IDataObject **obj)
HRESULT WINAPI IUnknown_QueryService(IUnknown *obj, REFGUID sid, REFIID iid, void **out)
DWORD WINAPI SHAnsiToUnicode(const char *src, WCHAR *dest, int dest_len)
DWORD WINAPI SHUnicodeToAnsi(const WCHAR *src, char *dest, int dest_len)
HKEY WINAPI SHRegDuplicateHKey(HKEY hKey)
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
#define DCMA_GetEntry(hDCMA, iItem)
EXTERN_C HRESULT IUnknown_InitializeCommand(_In_ IUnknown *pUnk, _In_ PCWSTR pszCommandName, _In_opt_ IPropertyBag *pPB)
EXTERN_C HRESULT InvokeIExecuteCommandWithDataObject(_In_ IExecuteCommand *pEC, _In_ PCWSTR pszCommandName, _In_opt_ IPropertyBag *pPB, _In_ IDataObject *pDO, _In_opt_ LPCMINVOKECOMMANDINFOEX pICI, _In_opt_ IUnknown *pSite)
HRESULT SHELL32_ShowPropertiesDialog(IDataObject *pdtobj)
DWORD RegGetDword(HKEY hKey, PCWSTR pszPath, PCWSTR pszName, DWORD nDefVal)
BOOL RegKeyExists(HKEY hKey, LPCWSTR Path)
#define DCIA_GetCount(hDCIA)
static BOOL RegValueExists(HKEY hKey, LPCWSTR Name)
#define DCIA_GetEntry(hDCIA, iItem)
void WINAPI SHFree(LPVOID pv)
HRESULT WINAPI SHExtCoCreateInstance(_In_opt_ LPCWSTR aclsid, _In_opt_ const CLSID *clsid, _In_opt_ LPUNKNOWN pUnkOuter, _In_ REFIID riid, _Out_ LPVOID *ppv)
HRESULT WINAPI SHCoCreateInstance(LPCWSTR aclsid, const CLSID *clsid, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppv)
BOOL WINAPI PathYetAnotherMakeUniqueName(LPWSTR buffer, LPCWSTR path, LPCWSTR shortname, LPCWSTR longname)
BOOL WINAPI SHSimulateDrop(IDropTarget *pDrop, IDataObject *pDataObj, DWORD grfKeyState, PPOINTL lpPt, DWORD *pdwEffect)
HRESULT WINAPI SHCreatePropertyBagOnRegKey(HKEY hKey, LPCWSTR subkey, DWORD grfMode, REFIID riid, void **ppv)
#define FAILED_UNEXPECTEDLY
#define MAKE_HRESULT(sev, fac, code)
BOOL WINAPI DSA_Destroy(HDSA hdsa)
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
#define InitFormatEtc(fe, cf, med)
GLenum GLuint GLenum GLsizei const GLchar * buf
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
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
static ERESOURCE GlobalLock
#define COM_INTERFACE_ENTRY_IID(iid, x)
#define memcpy(s1, s2, n)
const IID IID_IObjectWithSite
static IActiveScriptSite * site
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
unsigned __int3264 UINT_PTR
PITEMID_CHILD * _ILCopyaPidl(PCUITEMID_CHILD_ARRAY apidlsrc, UINT cidl)
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
void WINAPI ILFree(LPITEMIDLIST pidl)
HRESULT WINAPI SHILCreateFromPathW(LPCWSTR path, LPITEMIDLIST *ppidl, DWORD *attributes)
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
#define DSA_AppendItem(hdsa, pitem)
#define PathRemoveFileSpec
HRESULT WINAPI SHForwardContextMenuMsg(IUnknown *pUnk, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult, BOOL useIContextMenu2)
static __inline const char * wine_dbgstr_guid(const GUID *id)
#define _WIN32_WINNT_WIN7
#define _WIN32_WINNT_VISTA
static __inline LPWSTR __SHCloneStrAtoW(WCHAR **target, const char *source)
#define SEE_MASK_CLASSKEY
static BOOL SHELL_IsContextMenuMsg(UINT uMsg)
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
int WINAPI SHCreateDirectory(HWND hWnd, LPCWSTR path)
#define SID_IShellBrowser
#define CFSTR_SHELLIDLIST
#define CFSTR_PREFERREDDROPEFFECT
#define DFM_CMD_NEWFOLDER
#define DFM_CMD_PROPERTIES
HRESULT(CALLBACK * LPFNDFMCALLBACK)(_In_opt_ IShellFolder *, _In_opt_ HWND, _In_opt_ IDataObject *, UINT, WPARAM, LPARAM)
DWORD WINAPI SHRestricted(RESTRICTIONS rest)
#define FCIDM_SHVIEW_UNDO
#define FCIDM_SHVIEW_COPY
#define FCIDM_SHVIEW_INSERTLINK
#define FCIDM_SHVIEW_NEWFOLDER
#define FCIDM_SHVIEW_PROPERTIES
#define FCIDM_SHVIEW_DELETE
#define FCIDM_SHVIEW_RENAME
#define FCIDM_SHVIEW_CREATELINK
#define FCIDM_SHVIEW_INSERT
ITEMIDLIST UNALIGNED * LPITEMIDLIST
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
STRSAFEAPI StringCchCopyA(STRSAFE_LPSTR pszDest, size_t cchDest, STRSAFE_LPCSTR pszSrc)
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
STRSAFEAPI StringCchCopyNW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc, size_t cchToCopy)
CComPtr< IContextMenu > pCM
#define FIELD_OFFSET(t, f)
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
_Must_inspect_result_ _In_ WDFCMRESLIST List
DWORD WINAPI GetLastError(void)
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
WINBASEAPI _In_ DWORD _Out_ _In_ WORD wFlags
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
#define ERROR_NO_ASSOCIATION
_In_ DWORD _In_ int _In_ int _In_opt_ LPNLSVERSIONINFO _In_opt_ LPVOID lpReserved
#define HKEY_LOCAL_MACHINE
#define HKEY_CLASSES_ROOT
UINT WINAPI GetMenuDefaultItem(_In_ HMENU hMenu, _In_ UINT fByPos, _In_ UINT gmdiFlags)
BOOL WINAPI SetMenuDefaultItem(_In_ HMENU, _In_ UINT, _In_ UINT)
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)
BOOL WINAPI DeleteMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
UINT WINAPI GetMenuItemID(_In_ HMENU, _In_ int)
HMENU WINAPI GetSubMenu(_In_ HMENU, _In_ int)
#define MAKEINTRESOURCEA(i)
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define MAKEINTRESOURCEW(i)
HMENU WINAPI LoadMenuW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
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
_Must_inspect_result_ _In_ ULONG Flags
#define IID_PPV_ARG(Itype, ppType)
#define IID_NULL_PPV_ARG(Itype, ppType)