49#define DCM_FCIDM_SHVIEW_OFFSET 0x7000
90 const UINT gcs = IsUnicode ? GCS_VERBW : GCS_VERBA;
91 for (
UINT id = idFirst;
id <= idLast; ++
id)
108 return Ch ==
L' ' ||
Ch ==
L',';
246 m_bGroupPolicyActive(0),
283 if (!pdcm->
pcmcb && !lpfn)
285 ERR(
"CDefaultContextMenu needs a callback!\n");
319 ERR(
"GetCurFolder failed\n");
347 if (
info.Verb.CompareNoCase(szVerb) == 0)
406 TRACE(
"pDataObj=%p\n", pDataObj.
p);
410 bRet =
SUCCEEDED(pDataObj->QueryGetData(&formatetc));
480 TRACE(
"RegOpenKeyExW failed\n");
506 ERR(
"CLSIDFromString failed for clsid %S hr 0x%x\n", pwszClsid,
hr);
513 L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved",
520 ERR(
"Shell extension %s not approved!\n", pwszClsid);
527 WARN(
"Failed to get context menu entires from shell extension! clsid: %S\n", pwszClsid);
547 HRESULT hr =
info.pCM->QueryContextMenu(hMenu, *pIndexMenu, idCmdFirst + cIds, idCmdLast,
uFlags);
550 info.iIdCmdFirst = cIds;
552 (*pIndexMenu) +=
info.NumIds;
555 if (idCmdFirst + cIds >= idCmdLast)
558 TRACE(
"pEntry hr %x contextmenu %p cmdfirst %x num ids %x\n",
hr,
info.pCM.p,
info.iIdCmdFirst,
info.NumIds);
574 WCHAR wszDispVerb[80];
576 UINT cIds = 0, indexFirst = *pIndexMenu, indexDefault;
577 int iDefVerbIndex = -1;
598 if (
info.Verb.CompareNoCase(
L"open") == 0)
604 else if (
info.Verb.CompareNoCase(
L"explore") == 0)
613 else if (
info.Verb.CompareNoCase(
L"runas") == 0)
615 else if (
info.Verb.CompareNoCase(
L"edit") == 0)
617 else if (
info.Verb.CompareNoCase(
L"find") == 0)
619 else if (
info.Verb.CompareNoCase(
L"print") == 0)
621 else if (
info.Verb.CompareNoCase(
L"printto") == 0)
642 if (!(
uFlags & CMF_OPTIMIZEFORINVOKE))
647 ERR(
"Failed to load string\n");
657 if (!(
uFlags & CMF_OPTIMIZEFORINVOKE))
659 DWORD cbVerb =
sizeof(wszDispVerb);
661 if (
res || !*wszDispVerb)
679 if (!(
uFlags & CMF_EXTENDEDVERBS))
685 if (!hide && !(
uFlags & CMF_DISABLEDVERBS))
689 fState &= ~MFS_DEFAULT;
692 cmdFlags |= ECF_SEPARATORBEFORE;
694 cmdFlags |= ECF_SEPARATORAFTER;
702 fState &= ~MFS_DEFAULT;
707 if (cmdFlags & ECF_SEPARATORBEFORE)
717 if (verbIndex < iDefVerbIndex || iDefVerbIndex < 0)
719 iDefVerbIndex = verbIndex;
721 forceFirstPos =
TRUE;
725 fState &= ~MFS_DEFAULT;
729 else if (iDefVerbIndex >= 0)
731 fState &= ~MFS_DEFAULT;
734 forceFirstPos =
FALSE;
738 mii.
wID = iIdCmdFirst + cIds;
742 if (cmdFlags & ECF_SEPARATORAFTER)
749 indexDefault = *pIndexMenu;
753 if (mii.
wID >= iIdCmdLast)
785 ERR(
"failed to load string %p\n", dwTypeData);
803 if ((
uFlags & CMF_NODEFAULT) ||
844 UINT idCmdNext = idCmdFirst;
847 TRACE(
"BuildShellItemContextMenu entered\n");
860 idCmdNext = idCmdFirst + cIds;
866 idCmdNext = idCmdFirst + cIds;
870 QCMINFO qcminfo = {hMenu, IndexMenu, idCmdNext, idCmdLast,
NULL};
878 idCmdNext = idCmdFirst + cIds;
883 UINT idDefaultOffset = 0;
885 if (!(
uFlags & CMF_VERBSONLY) && !isBackgroundMenu)
888 SFGAOF rfg = SFGAO_BROWSABLE | SFGAO_CANCOPY | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANDELETE | SFGAO_CANRENAME | SFGAO_HASPROPSHEET | SFGAO_FILESYSTEM | SFGAO_FOLDER;
894 HMENU hmenuDefault =
LoadMenuW(_AtlBaseModule.GetResourceInstance(),
L"MENU_SHV_FILE");
897 if (!(rfg & SFGAO_CANMOVE))
899 if (!(rfg & SFGAO_CANCOPY))
903 if (!(rfg & SFGAO_CANLINK))
905 if (!(rfg & SFGAO_CANDELETE))
907 if (!(rfg & SFGAO_CANRENAME) || !(
uFlags & CMF_CANRENAME))
909 if (!(rfg & SFGAO_HASPROPSHEET))
912 idDefaultOffset = idCmdNext;
915 cIds += idMax - idCmdNext;
937 FORMATETC formatetc2;
943 if (
SUCCEEDED(pda->GetData(&formatetc2, &medium2)))
948 if (*pdwFlag == DROPEFFECT_COPY)
955 ERR(
"No drop effect obtained\n");
1023 FORMATETC formatetc;
1025 STGMEDIUM medium = {0};
1026 medium.tymed = TYMED_HGLOBAL;
1030 *pdwFlag = bCopy ? DROPEFFECT_COPY : DROPEFFECT_MOVE;
1055 hr = psb->QueryActiveShellView(&lpSV);
1059 SVSIF selFlags = SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE | SVSI_FOCUSED | SVSI_SELECT;
1060 hr = lpSV->SelectItem(
m_apidl[0], selFlags);
1085 ERR(
"TODO: Undo\n");
1095 ERR(
"m_pDataObj is NULL\n");
1119 lpici->
lpVerb =
"copyto";
1121 lpici->
lpVerb =
"moveto";
1133 WCHAR wszNewFolder[25];
1175 hr = psv->SelectItem(pidlNewItem, SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE |
1176 SVSI_FOCUSED | SVSI_SELECT);
1192 if (idCmd >=
info.iIdCmdFirst +
info.NumIds)
1195 if (idCmd < info.iIdCmdFirst || idCmd >
info.iIdCmdFirst +
info.NumIds)
1285 if (
SUCCEEDED(psb->GetControlWindow(FCW_TREE, &hwndTree)) && hwndTree)
1286 FlagsName =
L"ExplorerFlags";
1288 FlagsName =
L"BrowserFlags";
1331 hr = psb->BrowseObject(pidl,
wFlags & ~SBSP_RELATIVE);
1339 const BOOL unicode = IsUnicode(*lpcmi);
1342 if (pidlFull ==
NULL)
1387 if (!sei.
lpClass && (lpcmi->
fMask & (CMIC_MASK_HASLINKNAME | CMIC_MASK_HASTITLE)) && unicode)
1420 if (lpcmi->
fMask & CMIC_MASK_SHIFT_DOWN)
1422 if (lpcmi->
fMask & CMIC_MASK_CONTROL_DOWN)
1427 if (lpcmi->
fMask & CMIC_MASK_PTINVOKE)
1492 BOOL Unicode = IsUnicode(*lpcmi);
1522 memcpy(&LocalInvokeInfo, lpcmi,
min(
sizeof(LocalInvokeInfo), lpcmi->
cbSize));
1568 ERR(
"Unable to add OFFSET to DataObject!\n");
1632 if (
uFlags == GCS_HELPTEXTA ||
1633 uFlags == GCS_HELPTEXTW ||
1648 idCommand -=
pEntry->iIdCmdFirst;
1649 return pEntry->pCM->GetCommandString(idCommand,
1659 if (
uFlags == GCS_VALIDATEA ||
uFlags == GCS_VALIDATEW)
1697 if (
uFlags == GCS_VALIDATEA ||
uFlags == GCS_VALIDATEW)
1732 *CmdId = pDrawStruct->
itemID;
1738 *CmdId = pMeasureStruct->
itemID;
1750 pDrawStruct->
itemID = CmdId;
1756 pMeasureStruct->
itemID = CmdId;
1816 return m_site->QueryInterface(
riid, ppvSite);
1823 return ShellObjectCreatorInit<CDefaultContextMenu>(pdcm, lpfn,
riid,
ppv);
1862 const HKEY *ahkeyClsKeys,
1874 dcm.
aKeys = ahkeyClsKeys;
HRESULT CRecyclerDropTarget_CreateInstance(REFIID riid, LPVOID *ppvOut)
#define shell32_hInstance
static DWORD const LPVOID const lpReserved
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define STDMETHODCALLTYPE
#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)
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
#define ERROR_NO_MORE_ITEMS
#define HeapFree(x, y, z)
#define FAILED_UNEXPECTEDLY(hr)
int WINAPI lstrcmpiA(LPCSTR str1, LPCSTR str2)
HRESULT WINAPI OleSetClipboard(IDataObject *data)
HRESULT WINAPI OleGetClipboard(IDataObject **obj)
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
#define CmicFlagsToSeeFlags(flags)
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)
static BOOL RegValueExists(HKEY hKey, LPCWSTR Name)
void WINAPI SHFree(LPVOID pv)
HRESULT WINAPI SHCoCreateInstance(LPCWSTR aclsid, const CLSID *clsid, LPUNKNOWN pUnkOuter, REFIID refiid, 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 IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
HRESULT WINAPI SHCreatePropertyBagOnRegKey(HKEY hKey, LPCWSTR subkey, DWORD grfMode, REFIID riid, void **ppv)
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
DWORD WINAPI SHAnsiToUnicode(LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen)
INT WINAPI SHUnicodeToAnsi(LPCWSTR lpSrcStr, LPSTR lpDstStr, INT iLen)
#define MAKE_HRESULT(sev, fac, code)
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
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
VOID WINAPI CoTaskMemFree(LPVOID ptr)
#define COM_INTERFACE_ENTRY_IID(iid, x)
#define memcpy(s1, s2, n)
const IID IID_IObjectWithSite
static HMODULE MODULEINFO DWORD cb
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)
DWORD WINAPI GetVersion()
HRESULT WINAPI SHForwardContextMenuMsg(IUnknown *pUnk, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult, BOOL useIContextMenu2)
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_Check_return_ _CRTIMP int __cdecl _wcsnicmp(_In_reads_or_z_(_MaxCount) const wchar_t *_Str1, _In_reads_or_z_(_MaxCount) const wchar_t *_Str2, _In_ size_t _MaxCount)
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
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)
#define PathRemoveFileSpec
#define FCIDM_SHVIEW_OPEN
#define FCIDM_SHVIEW_UNDO
#define FCIDM_SHVIEW_COPY
#define FCIDM_SHVIEW_INSERTLINK
#define FCIDM_SHVIEW_NEWFOLDER
#define FCIDM_SHVIEW_EXPLORE
#define FCIDM_SHVIEW_PROPERTIES
#define FCIDM_SHVIEW_COPYTO
#define FCIDM_SHVIEW_MOVETO
#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 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
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
_In_ DWORD _Out_ _In_ WORD wFlags
#define HRESULT_FROM_WIN32(x)
#define HKEY_LOCAL_MACHINE
UINT WINAPI GetMenuDefaultItem(_In_ HMENU hMenu, _In_ UINT fByPos, _In_ UINT gmdiFlags)
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)
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)
BOOL WINAPI DeleteMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
HMENU WINAPI GetSubMenu(_In_ HMENU, _In_ int)
#define MAKEINTRESOURCEA(i)
BOOL WINAPI DestroyMenu(_In_ HMENU)
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)