147 m_bGroupPolicyActive(0),
148 m_pDynamicEntries(
NULL),
151 m_pStaticEntries(
NULL),
166 while (pDynamicEntry)
168 pNextDynamic = pDynamicEntry->
pNext;
171 pDynamicEntry = pNextDynamic;
178 pNextStatic = pStaticEntry->
pNext;
181 pStaticEntry = pNextStatic;
197 if (!pdcm->
pcmcb && !lpfn)
199 ERR(
"CDefaultContextMenu needs a callback!\n");
232 ERR(
"GetCurFolder failed\n");
277 pEntry->hkClass = hkeyClass;
287 pLastEntry->pNext =
pEntry;
325 TRACE(
"pDataObj=%p\n", pDataObj.
p);
329 bRet =
SUCCEEDED(pDataObj->QueryGetData(&formatetc));
372 ERR(
"IContextMenu->QueryInterface(IShellExtInit) failed.clsid %s hr 0x%x\n",
wine_dbgstr_guid(pclsid),
hr);
400 while (pLastEntry->
pNext)
401 pLastEntry = pLastEntry->
pNext;
421 TRACE(
"RegOpenKeyExW failed\n");
447 ERR(
"CLSIDFromString failed for clsid %S hr 0x%x\n", pwszClsid,
hr);
454 L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved",
461 ERR(
"Shell extension %s not approved!\n", pwszClsid);
468 WARN(
"Failed to get context menu entires from shell extension! clsid: %S\n", pwszClsid);
486 HRESULT hr =
pEntry->pCM->QueryContextMenu(hMenu, *pIndexMenu, idCmdFirst + cIds, idCmdLast, CMF_NORMAL);
489 pEntry->iIdCmdFirst = cIds;
491 (*pIndexMenu) +=
pEntry->NumIds;
494 if(idCmdFirst + cIds >= idCmdLast)
576 ERR(
"Failed to load string\n");
592 DWORD cbVerb =
sizeof(wszVerb);
611 mii.
wID = iIdCmdFirst + cIds;
619 if (mii.
wID >= iIdCmdLast)
651 ERR(
"failed to load string %p\n", dwTypeData);
675 UINT idCmdNext = idCmdFirst;
678 TRACE(
"BuildShellItemContextMenu entered\n");
691 idCmdNext = idCmdFirst + cIds;
697 idCmdNext = idCmdFirst + cIds;
701 QCMINFO qcminfo = {hMenu, IndexMenu, idCmdNext, idCmdLast,
NULL};
708 idCmdNext = idCmdFirst + cIds;
711 if (
uFlags & CMF_VERBSONLY)
719 SFGAOF rfg = SFGAO_BROWSABLE | SFGAO_CANCOPY | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANDELETE | SFGAO_CANRENAME | SFGAO_HASPROPSHEET | SFGAO_FILESYSTEM | SFGAO_FOLDER;
725 HMENU hmenuDefault =
LoadMenu(_AtlBaseModule.GetResourceInstance(),
L"MENU_SHV_FILE");
728 if (!(rfg & SFGAO_CANMOVE))
730 if (!(rfg & SFGAO_CANCOPY))
734 if (!(rfg & SFGAO_CANLINK))
736 if (!(rfg & SFGAO_CANDELETE))
738 if (!(rfg & SFGAO_CANRENAME))
740 if (!(rfg & SFGAO_HASPROPSHEET))
745 cIds += idMax - idCmdNext;
762 FORMATETC formatetc2;
768 if (
SUCCEEDED(pda->GetData(&formatetc2, &medium2)))
773 if (*pdwFlag == DROPEFFECT_COPY)
779 ERR(
"No drop effect obtained");
848 STGMEDIUM medium = {0};
849 medium.tymed = TYMED_HGLOBAL;
853 *pdwFlag = bCopy ? DROPEFFECT_COPY : DROPEFFECT_MOVE;
878 hr = psb->QueryActiveShellView(&lpSV);
882 SVSIF selFlags = SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE | SVSI_FOCUSED | SVSI_SELECT;
883 hr = lpSV->SelectItem(
m_apidl[0], selFlags);
912 ERR(
"m_pDataObj is NULL\n");
940 return pContextMenu->InvokeCommand(lpici);
950 WCHAR wszNewFolder[25];
992 hr = psv->SelectItem(pidlNewItem, SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE |
993 SVSI_FOCUSED | SVSI_SELECT);
1012 if (idCmd < pEntry->iIdCmdFirst || idCmd >
pEntry->iIdCmdFirst +
pEntry->NumIds)
1019 #define MAX_VERB 260 1067 return pEntry->pCM->InvokeCommand(lpcmi);
1090 if (
SUCCEEDED(psb->GetControlWindow(FCW_TREE, &hwndTree)) && hwndTree)
1091 FlagsName =
L"ExplorerFlags";
1093 FlagsName =
L"BrowserFlags";
1131 if (pidlFull ==
NULL)
1152 sei.
cbSize =
sizeof(sei);
1181 while (
pEntry && (iCmd--) > 0)
1227 LocalInvokeInfo = *lpcmi;
1326 if (
uFlags == GCS_HELPTEXTA ||
1327 uFlags == GCS_HELPTEXTW ||
1342 idCommand -=
pEntry->iIdCmdFirst;
1343 return pEntry->pCM->GetCommandString(idCommand,
1353 if (
uFlags == GCS_VALIDATEA ||
uFlags == GCS_VALIDATEW)
1359 while (
pEntry && (CmdId--) > 0)
1391 if (
uFlags == GCS_VALIDATEA ||
uFlags == GCS_VALIDATEW)
1426 *CmdId = pDrawStruct->
itemID;
1432 *CmdId = pMeasureStruct->
itemID;
1444 pDrawStruct->
itemID = CmdId;
1450 pMeasureStruct->
itemID = CmdId;
1510 return m_site->QueryInterface(
riid, ppvSite);
1517 return ShellObjectCreatorInit<CDefaultContextMenu>(pdcm, lpfn,
riid,
ppv);
1556 const HKEY *ahkeyClsKeys,
1568 dcm.
aKeys = ahkeyClsKeys;
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
#define FCIDM_SHVIEW_UNDO
HRESULT WINAPI OleSetClipboard(IDataObject *data)
#define SEE_MASK_CLASSKEY
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
void WINAPI ILFree(LPITEMIDLIST pidl)
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
VOID WINAPI CoTaskMemFree(LPVOID ptr)
#define CFSTR_SHELLIDLIST
#define CFSTR_PREFERREDDROPEFFECT
#define InitFormatEtc(fe, cf, med)
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)
#define PathRemoveFileSpec
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
#define FCIDM_SHVIEW_OPEN
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
#define FCIDM_SHVIEW_COPYTO
const char * wine_dbgstr_guid(const GUID *guid)
#define MAKEINTRESOURCEA(i)
#define IID_PPV_ARG(Itype, ppType)
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
#define FCIDM_SHVIEW_PROPERTIES
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
#define FCIDM_SHVIEW_INSERTLINK
_In_ PSID _Out_writes_to_opt_ cchName LPSTR _Inout_ LPDWORD cchName
HRESULT WINAPI SHForwardContextMenuMsg(IUnknown *pUnk, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult, BOOL useIContextMenu2)
LONG WINAPI RegCloseKey(HKEY hKey)
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
HRESULT WINAPI OleGetClipboard(IDataObject **obj)
#define FCIDM_SHVIEW_INSERT
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
HRESULT WINAPI IUnknown_SetSite(IUnknown *obj, IUnknown *site)
#define FCIDM_SHVIEW_MOVETO
#define DFM_INVOKECOMMAND
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
_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
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
#define MAKE_HRESULT(sev, fac, code)
HRESULT WINAPI SHCoCreateInstance(LPCWSTR aclsid, const CLSID *clsid, LPUNKNOWN pUnkOuter, REFIID refiid, LPVOID *ppv)
#define FCIDM_SHVIEW_NEWFOLDER
#define IID_NULL_PPV_ARG(Itype, ppType)
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 FCIDM_SHVIEW_EXPLORE
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
#define FCIDM_SHVIEW_COPY
BOOL WINAPI DeleteMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
#define FAILED_UNEXPECTEDLY(hr)
#define DFM_MERGECONTEXTMENU
#define STDMETHODCALLTYPE
const IID IID_IObjectWithSite
#define DFM_CMD_PROPERTIES
DWORD WINAPI SHAnsiToUnicode(LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen)
unsigned __int3264 UINT_PTR
#define FCIDM_SHVIEW_DELETE
struct _DynamicShellEntry_ * pNext
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
HRESULT(CALLBACK * LPFNDFMCALLBACK)(_In_opt_ IShellFolder *, _In_opt_ HWND, _In_opt_ IDataObject *, UINT, WPARAM, LPARAM)
SHORT WINAPI GetAsyncKeyState(_In_ int)
HRESULT CRecyclerDropTarget_CreateInstance(REFIID riid, LPVOID *ppvOut)
#define memcpy(s1, s2, n)
INT WINAPI SHUnicodeToAnsi(LPCWSTR lpSrcStr, LPSTR lpDstStr, INT iLen)
HMENU WINAPI GetSubMenu(_In_ HMENU, _In_ int)
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define FCIDM_SHVIEW_CREATELINK
_In_ DWORD _Out_ _In_ WORD wFlags
int WINAPI SHCreateDirectory(HWND hWnd, LPCWSTR path)
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
STRSAFEAPI StringCchCopyA(STRSAFE_LPSTR pszDest, size_t cchDest, STRSAFE_LPCSTR pszSrc)
#define shell32_hInstance
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
#define FCIDM_SHVIEW_RENAME
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
#define COM_INTERFACE_ENTRY_IID(iid, x)
struct _StaticShellEntry_ * pNext
BOOL WINAPI InsertMenuItemW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW)
#define SID_IShellBrowser
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
HRESULT WINAPI SHILCreateFromPathW(LPCWSTR path, LPITEMIDLIST *ppidl, DWORD *attributes)
void WINAPI SHFree(LPVOID pv)
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
int strcmp(const char *String1, const char *String2)
BOOL WINAPI PathYetAnotherMakeUniqueName(LPWSTR buffer, LPCWSTR path, LPCWSTR shortname, LPCWSTR longname)
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)
ITEMIDLIST UNALIGNED * LPITEMIDLIST
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define HeapFree(x, y, z)
PITEMID_CHILD * _ILCopyaPidl(PCUITEMID_CHILD_ARRAY apidlsrc, UINT cidl)
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
BOOL WINAPI SHSimulateDrop(IDropTarget *pDrop, IDataObject *pDataObj, DWORD grfKeyState, PPOINTL lpPt, DWORD *pdwEffect)
#define HKEY_LOCAL_MACHINE