ReactOS 0.4.15-dev-6712-g46b4b55
CRegFolder.cpp
Go to the documentation of this file.
1/*
2 * ReactOS Shell
3 *
4 * Copyright 2016 Giannis Adamopoulos
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21#include <precomp.h>
22
24
26 HWND hwnd,
27 IDataObject *pdtobj,
28 UINT uMsg,
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}
96
98 HWND hwnd,
99 UINT cidl,
101 IShellFolder *psf,
102 IContextMenu **ppcm)
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 }
120 }
121 AddClassKeyToArray(L"Folder", hKeys, &cKeys);
122
123 return CDefFolderMenu_Create2(pidlFolder, hwnd, cidl, apidl, psf, RegFolderContextMenuCallback, cKeys, hKeys, ppcm);
124}
125
127{
128 CComPtr<IDefaultExtractIconInit> initIcon;
129 HRESULT hr;
130 GUID const * riid;
131 int icon_idx;
132 WCHAR wTemp[MAX_PATH];
133
135 if (FAILED(hr))
136 return hr;
137
138 if (_ILIsDesktop(pidl))
139 {
140 initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_DESKTOP);
141 return initIcon->QueryInterface(iid, ppvOut);
142 }
143
144 riid = _ILGetGUIDPointer(pidl);
145 if (!riid)
146 return E_FAIL;
147
148 /* my computer and other shell extensions */
149 WCHAR xriid[50];
150
151 swprintf(xriid, L"CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
152 riid->Data1, riid->Data2, riid->Data3,
153 riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3],
154 riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7]);
155
156 const WCHAR* iconname = NULL;
157 if (_ILIsBitBucket(pidl))
158 {
159 CComPtr<IEnumIDList> EnumIDList;
161
162 CComPtr<IShellFolder2> psfRecycleBin;
163 CComPtr<IShellFolder> psfDesktop;
164 hr = SHGetDesktopFolder(&psfDesktop);
165
166 if (SUCCEEDED(hr))
167 hr = psfDesktop->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder2, &psfRecycleBin));
168 if (SUCCEEDED(hr))
169 hr = psfRecycleBin->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &EnumIDList);
170
171 ULONG itemcount;
172 LPITEMIDLIST pidl = NULL;
173 if (SUCCEEDED(hr) && (hr = EnumIDList->Next(1, &pidl, &itemcount)) == S_OK)
174 {
175 CoTaskMemFree(pidl);
176 iconname = L"Full";
177 } else {
178 iconname = L"Empty";
179 }
180 }
181
182 if (HCR_GetIconW(xriid, wTemp, iconname, MAX_PATH, &icon_idx))
183 {
184 initIcon->SetNormalIcon(wTemp, icon_idx);
185 }
186 else
187 {
188 // FIXME: Delete these hacks and make HCR_GetIconW and registry working
189 if (IsEqualGUID(*riid, CLSID_MyComputer))
190 initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_MY_COMPUTER);
191 else if (IsEqualGUID(*riid, CLSID_MyDocuments))
192 initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_MY_DOCUMENTS);
193 else if (IsEqualGUID(*riid, CLSID_NetworkPlaces))
194 initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_MY_NETWORK_PLACES);
195 else if (IsEqualGUID(*riid, CLSID_Internet))
196 initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_WEB_BROWSER);
197 else
198 initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_FOLDER);
199 }
200
201 return initIcon->QueryInterface(iid, ppvOut);
202}
203
205 public CEnumIDListBase
206{
207 public:
210 HRESULT Initialize(LPCWSTR lpszEnumKeyName, DWORD dwFlags);
211 HRESULT AddItemsFromKey(HKEY hkey_root, LPCWSTR szRepPath);
212
214 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
216};
217
219{
224};
225
227{
228}
229
231{
232}
233
235{
237
238 if (!(dwFlags & SHCONTF_FOLDERS))
239 return S_OK;
240
242 L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\%s\\Namespace",
243 lpszEnumKeyName);
245 return hr;
246
249
250 return S_OK;
251}
252
254{
256 HKEY hkey;
257
258 if (RegOpenKeyW(hkey_root, szRepPath, &hkey) != ERROR_SUCCESS)
259 return S_FALSE;
260
261 for (int idx = 0; ; idx++)
262 {
263 if (RegEnumKeyW(hkey, idx, name, MAX_PATH) != ERROR_SUCCESS)
264 break;
265
266 /* If the name of the key is not a guid try to get the default value of the key */
267 if (name[0] != L'{')
268 {
269 DWORD dwSize = sizeof(name);
271 }
272
273 if (*name == '{')
274 {
276
277 if (pidl)
278 AddToEnumList(pidl);
279 }
280 }
281
282 RegCloseKey(hkey);
283
284 return S_OK;
285}
286
288 public CComObjectRootEx<CComMultiThreadModelNoCS>,
289 public IShellFolder2
290{
291 private:
293 CAtlStringW m_rootPath;
294 CAtlStringW m_enumKeyName;
295 CComHeapPtr<ITEMIDLIST> m_pidlRoot;
296
298 public:
299 CRegFolder();
300 ~CRegFolder();
301 HRESULT WINAPI Initialize(const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName);
302
303 // IShellFolder
304 virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes);
305 virtual HRESULT WINAPI EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList);
306 virtual HRESULT WINAPI BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut);
307 virtual HRESULT WINAPI BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut);
309 virtual HRESULT WINAPI CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut);
310 virtual HRESULT WINAPI GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut);
311 virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut);
313 virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut);
314
315 /* ShellFolder2 */
316 virtual HRESULT WINAPI GetDefaultSearchGUID(GUID *pguid);
318 virtual HRESULT WINAPI GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay);
319 virtual HRESULT WINAPI GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags);
320 virtual HRESULT WINAPI GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv);
321 virtual HRESULT WINAPI GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd);
323
325
327
329 COM_INTERFACE_ENTRY_IID(IID_IShellFolder2, IShellFolder2)
330 COM_INTERFACE_ENTRY_IID(IID_IShellFolder, IShellFolder)
332};
333
335{
336}
337
339{
340}
341
342HRESULT WINAPI CRegFolder::Initialize(const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName)
343{
344 memcpy(&m_guid, pGuid, sizeof(m_guid));
345
346 m_rootPath = lpszPath;
347 if (!m_rootPath)
348 return E_OUTOFMEMORY;
349
350 m_enumKeyName = lpszEnumKeyName;
351 if (!m_enumKeyName)
352 return E_OUTOFMEMORY;
353
354 m_pidlRoot.Attach(ILClone(pidlRoot));
355 if (!m_pidlRoot)
356 return E_OUTOFMEMORY;
357
358 return S_OK;
359}
360
362{
363 DWORD dwAttributes = *pdwAttributes;
364
365 /* First try to get them from the registry */
366 if (!HCR_GetFolderAttributes(pidl, pdwAttributes))
367 {
368 /* We couldn't get anything */
369 *pdwAttributes = 0;
370 }
371
372 /* Items have more attributes when on desktop */
374 {
375 *pdwAttributes |= (dwAttributes & (SFGAO_CANLINK|SFGAO_CANDELETE|SFGAO_CANRENAME|SFGAO_HASPROPSHEET));
376 }
377
378 /* In any case, links can be created */
379 if (*pdwAttributes == NULL)
380 {
381 *pdwAttributes |= (dwAttributes & SFGAO_CANLINK);
382 }
383 return S_OK;
384}
385
387 ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes)
388{
389 LPITEMIDLIST pidl;
390
391 if (!lpszDisplayName || !ppidl)
392 return E_INVALIDARG;
393
394 *ppidl = 0;
395
396 if (pchEaten)
397 *pchEaten = 0;
398
399 UINT cch = wcslen(lpszDisplayName);
400 if (cch < 39 || lpszDisplayName[0] != L':' || lpszDisplayName[1] != L':')
401 return E_FAIL;
402
403 pidl = _ILCreateGuidFromStrW(lpszDisplayName + 2);
404 if (pidl == NULL)
405 return E_FAIL;
406
407 if (cch < 41)
408 {
409 *ppidl = pidl;
410 if (pdwAttributes && *pdwAttributes)
411 {
412 GetGuidItemAttributes(*ppidl, pdwAttributes);
413 }
414 }
415 else
416 {
417 HRESULT hr = SHELL32_ParseNextElement(this, hwndOwner, pbc, &pidl, lpszDisplayName + 41, pchEaten, pdwAttributes);
418 if (SUCCEEDED(hr))
419 {
420 *ppidl = pidl;
421 }
422 return hr;
423 }
424
425 return S_OK;
426}
427
428HRESULT WINAPI CRegFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
429{
430 return ShellObjectCreatorInit<CRegFolderEnum>(m_enumKeyName, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
431}
432
434{
435 CComPtr<IPersistFolder> pFolder;
436 HRESULT hr;
437
438 if (!ppvOut || !pidl || !pidl->mkid.cb)
439 return E_INVALIDARG;
440
441 *ppvOut = NULL;
442
443 GUID *pGUID = _ILGetGUIDPointer(pidl);
444 if (!pGUID)
445 {
446 ERR("CRegFolder::BindToObject called for non guid item!\n");
447 return E_INVALIDARG;
448 }
449
450 hr = SHELL32_BindToSF(m_pidlRoot, NULL, pidl, pGUID, riid, ppvOut);
452 return hr;
453
454 return S_OK;
455}
456
458{
459 return E_NOTIMPL;
460}
461
463{
464 if (!pidl1 || !pidl2 || pidl1->mkid.cb == 0 || pidl2->mkid.cb == 0)
465 {
466 ERR("Got an empty pidl!\n");
467 return E_INVALIDARG;
468 }
469
470 GUID const *clsid1 = _ILGetGUIDPointer (pidl1);
471 GUID const *clsid2 = _ILGetGUIDPointer (pidl2);
472
473 if (!clsid1 && !clsid2)
474 {
475 ERR("Got no guid pidl!\n");
476 return E_INVALIDARG;
477 }
478 else if (clsid1 && clsid2)
479 {
480 if (memcmp(clsid1, clsid2, sizeof(GUID)) == 0)
481 return SHELL32_CompareChildren(this, lParam, pidl1, pidl2);
482
483 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
484 }
485
486 /* Guid folders come first compared to everything else */
487 /* And Drives come before folders in My Computer */
489 {
490 return MAKE_COMPARE_HRESULT(clsid1 ? 1 : -1);
491 }
492 else
493 {
494 return MAKE_COMPARE_HRESULT(clsid1 ? -1 : 1);
495 }
496}
497
499{
500 return E_NOTIMPL;
501}
502
504{
505 if (!rgfInOut || !cidl || !apidl)
506 return E_INVALIDARG;
507
508 if (*rgfInOut == 0)
509 *rgfInOut = ~0;
510
511 while(cidl > 0 && *apidl)
512 {
513 if (_ILIsSpecialFolder(*apidl))
514 GetGuidItemAttributes(*apidl, rgfInOut);
515 else
516 ERR("Got an unknown pidl here!\n");
517 apidl++;
518 cidl--;
519 }
520
521 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
522 *rgfInOut &= ~SFGAO_VALIDATE;
523
524 return S_OK;
525}
526
528 REFIID riid, UINT * prgfInOut, LPVOID * ppvOut)
529{
530 LPVOID pObj = NULL;
532
533 if (!ppvOut)
534 return hr;
535
536 *ppvOut = NULL;
537
538 if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
539 {
540 hr = CGuidItemExtractIcon_CreateInstance(apidl[0], riid, &pObj);
541 }
542 else if (IsEqualIID (riid, IID_IContextMenu) && (cidl >= 1))
543 {
544 if (!_ILGetGUIDPointer (apidl[0]))
545 {
546 ERR("Got non guid item!\n");
547 return E_FAIL;
548 }
549
550 hr = CGuidItemContextMenu_CreateInstance(m_pidlRoot, hwndOwner, cidl, apidl, static_cast<IShellFolder*>(this), (IContextMenu**)&pObj);
551 }
552 else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
553 {
554 hr = IDataObject_Constructor (hwndOwner, m_pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
555 }
556 else
557 {
559 }
560
561 *ppvOut = pObj;
562 return hr;
563
564}
565
567{
568 if (!strRet || (!_ILIsSpecialFolder(pidl) && pidl != NULL))
569 return E_INVALIDARG;
570
571 if (!pidl || !pidl->mkid.cb)
572 {
574 {
575 LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
576 if (!pszPath)
577 return E_OUTOFMEMORY;
578
579 /* parsing name like ::{...} */
580 pszPath[0] = ':';
581 pszPath[1] = ':';
582 SHELL32_GUIDToStringW(m_guid, &pszPath[2]);
583
584 strRet->uType = STRRET_WSTR;
585 strRet->pOleStr = pszPath;
586
587 return S_OK;
588 }
589 else
590 {
591 BOOL bRet;
592 WCHAR wstrName[MAX_PATH+1];
593 bRet = HCR_GetClassNameW(m_guid, wstrName, MAX_PATH);
594 if (!bRet)
595 return E_FAIL;
596
597 return SHSetStrRet(strRet, wstrName);
598
599 }
600 }
601
602 HRESULT hr;
603 GUID const *clsid = _ILGetGUIDPointer (pidl);
604
605 /* First of all check if we need to query the name from the child item */
608 {
609 int bWantsForParsing = FALSE;
610
611 /*
612 * We can only get a filesystem path from a shellfolder if the
613 * value WantsFORPARSING in CLSID\\{...}\\shellfolder exists.
614 *
615 * Exception: The MyComputer folder doesn't have this key,
616 * but any other filesystem backed folder it needs it.
617 */
618 if (IsEqualIID (*clsid, CLSID_MyComputer))
619 {
620 bWantsForParsing = TRUE;
621 }
622 else
623 {
624 HKEY hkeyClass;
625 if (HCR_RegOpenClassIDKey(*clsid, &hkeyClass))
626 {
627 LONG res = SHGetValueW(hkeyClass, L"Shellfolder", L"WantsForParsing", NULL, NULL, NULL);
628 bWantsForParsing = (res == ERROR_SUCCESS);
629 RegCloseKey(hkeyClass);
630 }
631 }
632
633 if (bWantsForParsing)
634 {
635 /*
636 * we need the filesystem path to the destination folder.
637 * Only the folder itself can know it
638 */
639 return SHELL32_GetDisplayNameOfChild (this, pidl, dwFlags, strRet);
640 }
641 }
642
643 /* Allocate the buffer for the result */
644 LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
645 if (!pszPath)
646 return E_OUTOFMEMORY;
647
648 hr = S_OK;
649
651 {
652 wcscpy(pszPath, m_rootPath);
653 PWCHAR pItemName = &pszPath[wcslen(pszPath)];
654
655 /* parsing name like ::{...} */
656 pItemName[0] = ':';
657 pItemName[1] = ':';
658 SHELL32_GUIDToStringW (*clsid, &pItemName[2]);
659 }
660 else
661 {
662 /* user friendly name */
663 if (!HCR_GetClassNameW (*clsid, pszPath, MAX_PATH))
664 hr = E_FAIL;
665 }
666
667 if (SUCCEEDED(hr))
668 {
669 strRet->uType = STRRET_WSTR;
670 strRet->pOleStr = pszPath;
671 }
672 else
673 {
674 CoTaskMemFree(pszPath);
675 }
676
677 return hr;
678}
679
680HRESULT WINAPI CRegFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, /* simple pidl */
681 LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut)
682{
683 GUID const *clsid = _ILGetGUIDPointer (pidl);
684 LPOLESTR pStr;
685 HRESULT hr;
686 WCHAR szName[100];
687
688 if (!clsid)
689 {
690 ERR("Pidl is not reg item!\n");
691 return E_FAIL;
692 }
693
694 hr = StringFromCLSID(*clsid, &pStr);
696 return hr;
697
698 swprintf(szName, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\%s", pStr);
699
700 DWORD cbData = (wcslen(lpName) + 1) * sizeof(WCHAR);
702
703 CoTaskMemFree(pStr);
704
705 if (res == ERROR_SUCCESS)
706 {
707 *pPidlOut = ILClone(pidl);
708 return S_OK;
709 }
710
711 return E_FAIL;
712}
713
714
716{
717 return E_NOTIMPL;
718}
719
721{
722 return E_NOTIMPL;
723}
724
726{
727 if (pSort)
728 *pSort = 0;
729 if (pDisplay)
730 *pDisplay = 0;
731
732 return S_OK;
733}
734
736{
737 if (iColumn >= REGISTRY_COL_COUNT)
738 return E_INVALIDARG;
740 return S_OK;
741}
742
744{
745 return E_NOTIMPL;
746}
747
749{
750 if (!psd)
751 return E_INVALIDARG;
752
753 GUID const *clsid = _ILGetGUIDPointer (pidl);
754
755 if (!clsid)
756 {
757 ERR("Pidl is not reg item!\n");
758 return E_INVALIDARG;
759 }
760
761 switch(iColumn)
762 {
764 return GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
766 return SHSetStrRet(&psd->str, IDS_SYSTEMFOLDER);
768 HKEY hKey;
770 return SHSetStrRet(&psd->str, "");
771
772 psd->str.cStr[0] = 0x00;
773 psd->str.uType = STRRET_CSTR;
774 RegLoadMUIStringA(hKey, "InfoTip", psd->str.cStr, MAX_PATH, NULL, 0, NULL);
776 return S_OK;
777 default:
778 /* Return an empty string when we area asked for a column we don't support.
779 Only the regfolder is supposed to do this as it supports less columns compared to other folder
780 and its contents are supposed to be presented alongside items that support more columns. */
781 return SHSetStrRet(&psd->str, "");
782 }
783 return E_FAIL;
784}
785
787{
788 return E_NOTIMPL;
789}
790
791/* In latest windows version this is exported but it takes different arguments! */
792HRESULT CRegFolder_CreateInstance(const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName, REFIID riid, void **ppv)
793{
794 return ShellObjectCreatorInit<CRegFolder>(pGuid, pidlRoot, lpszPath, lpszEnumKeyName, riid, ppv);
795}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
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 WINAPI SHGetDesktopFolder(IShellFolder **psf)
HRESULT WINAPI SHCreateDefaultExtractIcon(REFIID riid, void **ppv)
HRESULT IDataObject_Constructor(HWND hwndOwner, PCIDLIST_ABSOLUTE pMyPidl, PCUIDLIST_RELATIVE_ARRAY apidl, UINT cidl, BOOL bExtendedObject, IDataObject **dataObject)
HRESULT CRegFolder_CreateInstance(const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName, REFIID riid, void **ppv)
Definition: CRegFolder.cpp:792
registry_columns
Definition: CRegFolder.cpp:219
@ REGISTRY_COL_COUNT
Definition: CRegFolder.cpp:223
@ REGISTRY_COL_TYPE
Definition: CRegFolder.cpp:221
@ REGISTRY_COL_NAME
Definition: CRegFolder.cpp:220
@ REGISTRY_COL_VALUE
Definition: CRegFolder.cpp:222
HRESULT CALLBACK RegFolderContextMenuCallback(IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CRegFolder.cpp:25
HRESULT CGuidItemExtractIcon_CreateInstance(LPCITEMIDLIST pidl, REFIID iid, LPVOID *ppvOut)
Definition: CRegFolder.cpp:126
HRESULT CGuidItemContextMenu_CreateInstance(PCIDLIST_ABSOLUTE pidlFolder, HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IShellFolder *psf, IContextMenu **ppcm)
Definition: CRegFolder.cpp:97
LONG WINAPI RegLoadMUIStringA(IN HKEY hKey, IN LPCSTR pszValue OPTIONAL, OUT LPSTR pszOutBuf, IN DWORD cbOutBuf, OUT LPDWORD pcbData OPTIONAL, IN DWORD Flags, IN LPCSTR pszDirectory OPTIONAL)
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define IDI_SHELL_FOLDER
Definition: treeview.c:36
#define IDI_SHELL_MY_COMPUTER
Definition: treeview.c:38
#define ERR(fmt,...)
Definition: debug.h:110
#define RegCloseKey(hKey)
Definition: registry.h:47
BOOL AddToEnumList(LPITEMIDLIST pidl)
HRESULT Initialize(LPCWSTR lpszEnumKeyName, DWORD dwFlags)
Definition: CRegFolder.cpp:234
HRESULT AddItemsFromKey(HKEY hkey_root, LPCWSTR szRepPath)
Definition: CRegFolder.cpp:253
virtual HRESULT WINAPI MapColumnToSCID(UINT column, SHCOLUMNID *pscid)
Definition: CRegFolder.cpp:786
virtual HRESULT WINAPI EnumSearches(IEnumExtraSearch **ppenum)
Definition: CRegFolder.cpp:720
virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes)
Definition: CRegFolder.cpp:386
virtual HRESULT WINAPI GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv)
Definition: CRegFolder.cpp:743
virtual HRESULT WINAPI BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut)
Definition: CRegFolder.cpp:433
CAtlStringW m_enumKeyName
Definition: CRegFolder.cpp:294
virtual HRESULT WINAPI GetDefaultSearchGUID(GUID *pguid)
Definition: CRegFolder.cpp:715
CAtlStringW m_rootPath
Definition: CRegFolder.cpp:293
virtual HRESULT WINAPI EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
Definition: CRegFolder.cpp:428
CComHeapPtr< ITEMIDLIST > m_pidlRoot
Definition: CRegFolder.cpp:295
virtual HRESULT WINAPI GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags)
Definition: CRegFolder.cpp:735
virtual HRESULT WINAPI GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: CRegFolder.cpp:566
virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut)
Definition: CRegFolder.cpp:680
virtual HRESULT WINAPI GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut)
Definition: CRegFolder.cpp:503
virtual HRESULT WINAPI CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
Definition: CRegFolder.cpp:498
virtual HRESULT WINAPI BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut)
Definition: CRegFolder.cpp:457
virtual HRESULT WINAPI CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2)
Definition: CRegFolder.cpp:462
HRESULT GetGuidItemAttributes(LPCITEMIDLIST pidl, LPDWORD pdwAttributes)
Definition: CRegFolder.cpp:361
virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut)
Definition: CRegFolder.cpp:527
virtual HRESULT WINAPI GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd)
Definition: CRegFolder.cpp:748
HRESULT WINAPI Initialize(const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName)
Definition: CRegFolder.cpp:342
virtual HRESULT WINAPI GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay)
Definition: CRegFolder.cpp:725
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
unsigned int idx
Definition: utils.c:41
#define GET_SHGDN_RELATION(dwFlags)
Definition: precomp.h:53
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
#define GET_SHGDN_FOR(dwFlags)
Definition: precomp.h:52
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
Definition: reg.c:1962
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3288
LONG WINAPI RegEnumKeyW(HKEY hKey, DWORD dwIndex, LPWSTR lpName, DWORD cbName)
Definition: reg.c:2413
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
HRESULT WINAPI StringFromCLSID(REFCLSID id, LPOLESTR *idstr)
Definition: compobj.c:2412
#define RRF_RT_REG_SZ
Definition: driver.c:575
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
DWORD WINAPI SHGetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, LPDWORD pwType, LPVOID pvData, LPDWORD pcbData)
Definition: reg.c:1236
DWORD WINAPI SHSetValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue, DWORD dwType, LPCVOID pvData, DWORD cbData)
Definition: reg.c:1306
#define swprintf
Definition: precomp.h:40
static BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
WCHAR swShell32Name[MAX_PATH]
Definition: folders.cpp:22
FxAutoRegKey hKey
GLuint res
Definition: glext.h:9613
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define BEGIN_COM_MAP(x)
Definition: atlcom.h:581
#define COM_INTERFACE_ENTRY_IID(iid, x)
Definition: atlcom.h:601
#define DECLARE_PROTECT_FINAL_CONSTRUCT()
Definition: atlcom.h:679
#define DECLARE_NOT_AGGREGATABLE(x)
Definition: atlcom.h:651
#define END_COM_MAP()
Definition: atlcom.h:592
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202
static IParseDisplayName ParseDisplayName
Definition: moniker.c:816
static LPOLESTR
Definition: stg_prop.c:27
REFCLSID clsid
Definition: msctf.c:82
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
unsigned int UINT
Definition: ndis.h:50
#define L(x)
Definition: ntvdm.h:50
interface IBindCtx * LPBC
Definition: objfwd.h:18
const GUID IID_IDataObject
long LONG
Definition: pedump.c:60
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:228
BOOL _ILIsBitBucket(LPCITEMIDLIST pidl)
Definition: pidl.c:1946
BOOL _ILIsMyComputer(LPCITEMIDLIST pidl)
Definition: pidl.c:1935
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
Definition: pidl.c:2650
BOOL _ILIsNetHood(LPCITEMIDLIST pidl)
Definition: pidl.c:1913
LPITEMIDLIST _ILCreateGuidFromStrW(LPCWSTR szGUID)
Definition: pidl.c:1729
IID * _ILGetGUIDPointer(LPCITEMIDLIST pidl)
Definition: pidl.c:2329
static const WCHAR szName[]
Definition: powrprof.c:45
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
BOOL SH_ShowRecycleBinProperties(WCHAR sDrive)
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len)
Definition: classes.c:342
BOOL HCR_GetFolderAttributes(LPCITEMIDLIST pidlFolder, LPDWORD pdwAttributes)
Definition: classes.c:510
BOOL HCR_GetIconW(LPCWSTR szClass, LPWSTR szDest, LPCWSTR szName, DWORD len, int *picon_idx)
Definition: classes.c:288
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:82
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:561
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:160
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:198
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:216
static __inline int SHELL32_GUIDToStringW(REFGUID guid, LPWSTR str)
Definition: shfldr.h:81
void AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:269
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:239
HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE *ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
Definition: shlfolder.cpp:329
BOOL HCR_RegOpenClassIDKey(REFIID riid, HKEY *hkey)
Definition: classes.c:227
HRESULT SHELL32_ParseNextElement(IShellFolder2 *psf, HWND hwndOwner, LPBC pbc, LPITEMIDLIST *pidlInOut, LPOLESTR szNext, DWORD *pEaten, DWORD *pdwAttributes)
Definition: shlfolder.cpp:71
HINSTANCE WINAPI ShellExecuteW(HWND hwnd, LPCWSTR lpVerb, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd)
Definition: shlexec.cpp:2379
HRESULT hr
Definition: shlfolder.c:183
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2468
#define IDS_SYSTEMFOLDER
Definition: shresdef.h:337
#define IDI_SHELL_MY_DOCUMENTS
Definition: shresdef.h:663
#define IDI_SHELL_MY_NETWORK_PLACES
Definition: shresdef.h:555
#define IDI_SHELL_DESKTOP
Definition: shresdef.h:572
#define IDI_SHELL_WEB_BROWSER
Definition: shresdef.h:758
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
ITEMID_CHILD UNALIGNED * PUITEMID_CHILD
Definition: shtypes.idl:68
@ STRRET_CSTR
Definition: shtypes.idl:87
@ STRRET_WSTR
Definition: shtypes.idl:85
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
@ SHCOLSTATE_TYPE_STR
Definition: shtypes.idl:121
@ SHCOLSTATE_ONBYDEFAULT
Definition: shtypes.idl:125
const ITEMIDLIST_RELATIVE UNALIGNED * PCUIDLIST_RELATIVE
Definition: shtypes.idl:57
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
STRRET str
Definition: shtypes.idl:108
char cStr[MAX_PATH]
Definition: shtypes.idl:98
UINT uType
Definition: shtypes.idl:93
LPWSTR pOleStr
Definition: shtypes.idl:96
Definition: copy.c:22
Definition: name.c:39
uint32_t * LPDWORD
Definition: typedefs.h:59
uint16_t * PWCHAR
Definition: typedefs.h:56
uint32_t ULONG
Definition: typedefs.h:59
DWORD dwAttributes
Definition: vdmdbg.h:34
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
Definition: wdfdevice.h:2699
_In_ LPCSTR lpName
Definition: winbase.h:2779
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:2357
#define E_NOINTERFACE
Definition: winerror.h:2364
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define SW_SHOWNORMAL
Definition: winuser.h:764
#define SW_SHOWDEFAULT
Definition: winuser.h:774
static void Initialize()
Definition: xlate.c:212
#define IID_PPV_ARG(Itype, ppType)
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185