From 8a0defef3d84131a19bb4f331004230cc7f42121 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Sun, 2 Oct 2016 13:22:01 +0000 Subject: [PATCH] [SHELL32] - CNetFolder: Use the Folder class for the items shown. The same is done in shell extensions (in windows) that use the CDefaultContextMenu and want the Open and Explore verbs to be shown. This behaviour was first discovered by gigaherz when ntobjshex was tested in windows. CORE-12086 svn path=/trunk/; revision=72891 --- reactos/dll/win32/shell32/folders/CNetFolder.cpp | 7 +++++-- reactos/dll/win32/shell32/shfldr.h | 2 ++ reactos/dll/win32/shell32/shlfolder.cpp | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/shell32/folders/CNetFolder.cpp b/reactos/dll/win32/shell32/folders/CNetFolder.cpp index 81e3a99f9cd..d0a9d3c810f 100644 --- a/reactos/dll/win32/shell32/folders/CNetFolder.cpp +++ b/reactos/dll/win32/shell32/folders/CNetFolder.cpp @@ -417,8 +417,11 @@ HRESULT WINAPI CNetFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CH if (IsEqualIID(riid, IID_IContextMenu) && (cidl >= 1)) { - IContextMenu * pCm = NULL; - hr = CDefFolderMenu_Create2(pidlRoot, hwndOwner, cidl, apidl, static_cast(this), NULL, 0, NULL, &pCm); + IContextMenu * pCm = NULL; + HKEY hkey; + UINT cKeys = 0; + AddClassKeyToArray(L"Folder", &hkey, &cKeys); + hr = CDefFolderMenu_Create2(pidlRoot, hwndOwner, cidl, apidl, static_cast(this), NULL, cKeys, &hkey, &pCm); pObj = pCm; } else if (IsEqualIID(riid, IID_IDataObject) && (cidl >= 1)) diff --git a/reactos/dll/win32/shell32/shfldr.h b/reactos/dll/win32/shell32/shfldr.h index 54ed1b45a2a..a8543e688d4 100644 --- a/reactos/dll/win32/shell32/shfldr.h +++ b/reactos/dll/win32/shell32/shfldr.h @@ -83,6 +83,8 @@ static __inline int SHELL32_GUIDToStringW (REFGUID guid, LPWSTR str) void SHELL_FS_ProcessDisplayFilename(LPWSTR szPath, DWORD dwFlags); BOOL SHELL_FS_HideExtension(LPWSTR pwszPath); +void AddClassKeyToArray(const WCHAR * szClass, HKEY* array, UINT* cKeys); + #ifdef __cplusplus HRESULT inline SHSetStrRet(LPSTRRET pStrRet, DWORD resId) diff --git a/reactos/dll/win32/shell32/shlfolder.cpp b/reactos/dll/win32/shell32/shlfolder.cpp index d632fb085ed..cf1987c1344 100644 --- a/reactos/dll/win32/shell32/shlfolder.cpp +++ b/reactos/dll/win32/shell32/shlfolder.cpp @@ -462,6 +462,20 @@ HRESULT SHELL32_CompareDetails(IShellFolder2* isf, LPARAM lParam, LPCITEMIDLIST return MAKE_COMPARE_HRESULT(ret); } +void AddClassKeyToArray(const WCHAR * szClass, HKEY* array, UINT* cKeys) +{ + if (*cKeys >= 16) + return; + + HKEY hkey; + LSTATUS result = RegOpenKeyExW(HKEY_CLASSES_ROOT, szClass, 0, KEY_READ | KEY_QUERY_VALUE, &hkey); + if (result != ERROR_SUCCESS) + return; + + array[*cKeys] = hkey; + *cKeys += 1; +} + /*********************************************************************** * SHCreateLinks *