ReactOS 0.4.15-dev-7924-g5949c20
CRegFolder.cpp File Reference
#include <precomp.h>
Include dependency graph for CRegFolder.cpp:

Go to the source code of this file.

Classes

class  CRegFolderEnum
 
class  CRegFolder
 

Enumerations

enum  registry_columns { REGISTRY_COL_NAME , REGISTRY_COL_TYPE , REGISTRY_COL_VALUE , REGISTRY_COL_COUNT }
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (shell)
 
HRESULT CALLBACK RegFolderContextMenuCallback (IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
HRESULT CGuidItemContextMenu_CreateInstance (PCIDLIST_ABSOLUTE pidlFolder, HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IShellFolder *psf, IContextMenu **ppcm)
 
HRESULT FormatGUIDKey (LPWSTR KeyName, SIZE_T KeySize, LPCWSTR RegPath, const GUID *riid)
 
HRESULT CGuidItemExtractIcon_CreateInstance (LPCITEMIDLIST pidl, REFIID iid, LPVOID *ppvOut)
 
HRESULT CRegFolder_CreateInstance (const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName, REFIID riid, void **ppv)
 

Enumeration Type Documentation

◆ registry_columns

Enumerator
REGISTRY_COL_NAME 
REGISTRY_COL_TYPE 
REGISTRY_COL_VALUE 
REGISTRY_COL_COUNT 

Definition at line 236 of file CRegFolder.cpp.

237{
242};
@ REGISTRY_COL_COUNT
Definition: CRegFolder.cpp:241
@ REGISTRY_COL_TYPE
Definition: CRegFolder.cpp:239
@ REGISTRY_COL_NAME
Definition: CRegFolder.cpp:238
@ REGISTRY_COL_VALUE
Definition: CRegFolder.cpp:240

Function Documentation

◆ CGuidItemContextMenu_CreateInstance()

HRESULT CGuidItemContextMenu_CreateInstance ( PCIDLIST_ABSOLUTE  pidlFolder,
HWND  hwnd,
UINT  cidl,
PCUITEMID_CHILD_ARRAY  apidl,
IShellFolder psf,
IContextMenu **  ppcm 
)

Definition at line 97 of file CRegFolder.cpp.

103{
104 HKEY hKeys[10];
105 UINT cKeys = 0;
106
107 GUID *pGuid = _ILGetGUIDPointer(apidl[0]);
108 if (pGuid)
109 {
110 LPOLESTR pwszCLSID;
111 WCHAR key[60];
112
113 wcscpy(key, L"CLSID\\");
114 HRESULT hr = StringFromCLSID(*pGuid, &pwszCLSID);
115 if (hr == S_OK)
116 {
117 wcscpy(&key[6], pwszCLSID);
118 AddClassKeyToArray(key, hKeys, &cKeys);
119 CoTaskMemFree(pwszCLSID);
120 }
121 }
122 AddClassKeyToArray(L"Folder", hKeys, &cKeys);
123
124 return CDefFolderMenu_Create2(pidlFolder, hwnd, cidl, apidl, psf, RegFolderContextMenuCallback, cKeys, hKeys, ppcm);
125}
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)
HRESULT CALLBACK RegFolderContextMenuCallback(IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CRegFolder.cpp:25
HRESULT WINAPI StringFromCLSID(REFCLSID id, LPOLESTR *idstr)
Definition: compobj.c:2412
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
#define S_OK
Definition: intsafe.h:52
static LPOLESTR
Definition: stg_prop.c:27
unsigned int UINT
Definition: ndis.h:50
#define L(x)
Definition: ntvdm.h:50
IID * _ILGetGUIDPointer(LPCITEMIDLIST pidl)
Definition: pidl.c:2369
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
LSTATUS AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:277
HRESULT hr
Definition: shlfolder.c:183
Definition: copy.c:22
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by CRegFolder::GetUIObjectOf().

◆ CGuidItemExtractIcon_CreateInstance()

HRESULT CGuidItemExtractIcon_CreateInstance ( LPCITEMIDLIST  pidl,
REFIID  iid,
LPVOID ppvOut 
)

Definition at line 137 of file CRegFolder.cpp.

138{
139 CComPtr<IDefaultExtractIconInit> initIcon;
140 HRESULT hr;
141 GUID const * riid;
142 int icon_idx;
143 WCHAR wTemp[MAX_PATH];
144
146 if (FAILED(hr))
147 return hr;
148
149 if (_ILIsDesktop(pidl))
150 {
151 initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_DESKTOP);
152 return initIcon->QueryInterface(iid, ppvOut);
153 }
154
155 riid = _ILGetGUIDPointer(pidl);
156 if (!riid)
157 return E_FAIL;
158
159 /* Choose a correct icon for Recycle Bin (full or empty) */
160 const WCHAR* iconname = NULL;
161 if (_ILIsBitBucket(pidl))
162 {
163 CComPtr<IEnumIDList> EnumIDList;
165
166 CComPtr<IShellFolder2> psfRecycleBin;
167 CComPtr<IShellFolder> psfDesktop;
168 hr = SHGetDesktopFolder(&psfDesktop);
169
170 if (SUCCEEDED(hr))
171 hr = psfDesktop->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder2, &psfRecycleBin));
172 if (SUCCEEDED(hr))
173 hr = psfRecycleBin->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &EnumIDList);
174
175 ULONG itemcount;
176 LPITEMIDLIST pidl = NULL;
177 if (SUCCEEDED(hr) && (hr = EnumIDList->Next(1, &pidl, &itemcount)) == S_OK)
178 {
179 CoTaskMemFree(pidl);
180 iconname = L"Full";
181 } else {
182 iconname = L"Empty";
183 }
184 }
185
186 /* Prepare registry path for loading icons of My Computer and other shell extensions */
188
190 L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\%s",
191 riid);
193 return hr;
194
195 /* Load icon for the current user */
196 BOOL ret = HCU_GetIconW(KeyName, wTemp, iconname, _countof(wTemp), &icon_idx);
197 if (!ret)
198 {
199 /* Failed, load default system-wide icon */
200 hr = FormatGUIDKey(KeyName, _countof(KeyName), L"CLSID\\%s", riid);
202 return hr;
203
204 ret = HCR_GetIconW(KeyName, wTemp, iconname, _countof(wTemp), &icon_idx);
205 }
206
207 if (ret)
208 {
209 /* Success, set loaded icon */
210 initIcon->SetNormalIcon(wTemp, icon_idx);
211 }
212 else
213 {
214 /* Everything has failed, set blank paper icon */
215 WARN("Failed to load an icon for the item, setting blank icon\n");
216 initIcon->SetNormalIcon(swShell32Name, IDI_SHELL_DOCUMENT - 1);
217 }
218
219 return initIcon->QueryInterface(iid, ppvOut);
220}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
HRESULT WINAPI SHCreateDefaultExtractIcon(REFIID riid, void **ppv)
HRESULT FormatGUIDKey(LPWSTR KeyName, SIZE_T KeySize, LPCWSTR RegPath, const GUID *riid)
Definition: CRegFolder.cpp:127
#define WARN(fmt,...)
Definition: debug.h:112
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define MAX_PATH
Definition: compat.h:34
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
unsigned int BOOL
Definition: ntddk_ex.h:94
WCHAR swShell32Name[MAX_PATH]
Definition: folders.cpp:22
REFIID riid
Definition: atlbase.h:39
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
BOOL _ILIsBitBucket(LPCITEMIDLIST pidl)
Definition: pidl.c:1986
BOOL HCR_GetIconW(LPCWSTR szClass, LPWSTR szDest, LPCWSTR szName, DWORD len, int *picon_idx)
Definition: classes.c:291
#define IDI_SHELL_DESKTOP
Definition: shresdef.h:585
#define IDI_SHELL_DOCUMENT
Definition: shresdef.h:551
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
#define _countof(array)
Definition: sndvol32.h:68
uint32_t ULONG
Definition: typedefs.h:59
int ret
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
Definition: wdfdevice.h:2699
#define IID_PPV_ARG(Itype, ppType)

Referenced by CRegFolder::GetUIObjectOf().

◆ CRegFolder_CreateInstance()

HRESULT CRegFolder_CreateInstance ( const GUID pGuid,
LPCITEMIDLIST  pidlRoot,
LPCWSTR  lpszPath,
LPCWSTR  lpszEnumKeyName,
REFIID  riid,
void **  ppv 
)

Definition at line 866 of file CRegFolder.cpp.

867{
868 return ShellObjectCreatorInit<CRegFolder>(pGuid, pidlRoot, lpszPath, lpszEnumKeyName, riid, ppv);
869}
REFIID LPVOID * ppv
Definition: atlbase.h:39

Referenced by CDesktopFolder::FinalConstruct(), CDrivesFolder::FinalConstruct(), and CControlPanelFolder::Initialize().

◆ FormatGUIDKey()

HRESULT FormatGUIDKey ( LPWSTR  KeyName,
SIZE_T  KeySize,
LPCWSTR  RegPath,
const GUID riid 
)

Definition at line 127 of file CRegFolder.cpp.

128{
129 WCHAR xriid[40];
130
131 if (!StringFromGUID2(*riid, xriid, _countof(xriid) - 1))
132 return E_FAIL;
133
134 return StringCchPrintfW(KeyName, KeySize, RegPath, xriid);
135}
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
Definition: compobj.c:2434
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530

Referenced by CGuidItemExtractIcon_CreateInstance().

◆ RegFolderContextMenuCallback()

HRESULT CALLBACK RegFolderContextMenuCallback ( IShellFolder psf,
HWND  hwnd,
IDataObject pdtobj,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 25 of file CRegFolder.cpp.

31{
33 return S_OK;
34
35 PIDLIST_ABSOLUTE pidlFolder;
36 PUITEMID_CHILD *apidl;
37 UINT cidl;
38 HRESULT hr = SH_GetApidlFromDataObject(pdtobj, &pidlFolder, &apidl, &cidl);
40 return hr;
41
42 if (_ILIsMyComputer(apidl[0]))
43 {
44 if (32 >= (UINT_PTR)ShellExecuteW(hwnd,
45 L"open",
46 L"rundll32.exe",
47 L"shell32.dll,Control_RunDLL sysdm.cpl",
48 NULL,
50 {
51 hr = E_FAIL;
52 }
53 }
54 else if (_ILIsDesktop(apidl[0]))
55 {
56 if (32 >= (UINT_PTR)ShellExecuteW(hwnd,
57 L"open",
58 L"rundll32.exe",
59 L"shell32.dll,Control_RunDLL desk.cpl",
60 NULL,
62 {
63 hr = E_FAIL;
64 }
65 }
66 else if (_ILIsNetHood(apidl[0]))
67 {
68 // FIXME path!
69 if (32 >= (UINT_PTR)ShellExecuteW(NULL,
70 L"open",
71 L"explorer.exe",
72 L"::{7007ACC7-3202-11D1-AAD2-00805FC1270E}",
73 NULL,
75 {
76 hr = E_FAIL;
77 }
78 }
79 else if (_ILIsBitBucket(apidl[0]))
80 {
81 /* FIXME: detect the drive path of bitbucket if appropiate */
83 hr = E_FAIL;
84 }
85 else
86 {
87 /* Tell the caller to run the default action */
88 hr = S_FALSE;
89 }
90
91 SHFree(pidlFolder);
92 _ILFreeaPidl(apidl, cidl);
93
94 return hr;
95}
WPARAM wParam
Definition: combotst.c:138
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
BOOL _ILIsMyComputer(LPCITEMIDLIST pidl)
Definition: pidl.c:1975
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
Definition: pidl.c:2690
BOOL _ILIsNetHood(LPCITEMIDLIST pidl)
Definition: pidl.c:1953
BOOL SH_ShowRecycleBinProperties(WCHAR sDrive)
HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE *ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
Definition: shlfolder.cpp:361
HINSTANCE WINAPI ShellExecuteW(HWND hwnd, LPCWSTR lpVerb, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd)
Definition: shlexec.cpp:2402
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2597
ITEMID_CHILD UNALIGNED * PUITEMID_CHILD
Definition: shtypes.idl:68
#define S_FALSE
Definition: winerror.h:2357
#define SW_SHOWNORMAL
Definition: winuser.h:770
#define SW_SHOWDEFAULT
Definition: winuser.h:780

Referenced by CGuidItemContextMenu_CreateInstance().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( shell  )