ReactOS 0.4.15-dev-8058-ga7cbb60
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 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}
126
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}
136
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}
221
223 public CEnumIDListBase
224{
225 public:
228 HRESULT Initialize(LPCWSTR lpszEnumKeyName, DWORD dwFlags);
229 HRESULT AddItemsFromKey(HKEY hkey_root, LPCWSTR szRepPath);
230
232 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
234};
235
237{
238}
239
241{
242}
243
245{
247
248 if (!(dwFlags & SHCONTF_FOLDERS))
249 return S_OK;
250
252 L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\%s\\Namespace",
253 lpszEnumKeyName);
255 return hr;
256
259
260 return S_OK;
261}
262
264{
266 HKEY hkey;
267
268 if (RegOpenKeyW(hkey_root, szRepPath, &hkey) != ERROR_SUCCESS)
269 return S_FALSE;
270
271 for (int idx = 0; ; idx++)
272 {
273 if (RegEnumKeyW(hkey, idx, name, MAX_PATH) != ERROR_SUCCESS)
274 break;
275
276 /* If the name of the key is not a guid try to get the default value of the key */
277 if (name[0] != L'{')
278 {
279 DWORD dwSize = sizeof(name);
281 }
282
283 if (*name == '{')
284 {
286
287 if (pidl)
288 AddToEnumList(pidl);
289 }
290 }
291
292 RegCloseKey(hkey);
293
294 return S_OK;
295}
296
297/*
298 * These columns try to map to CFSFolder's columns because the CDesktopFolder
299 * displays CFSFolder and CRegFolder items in the same view.
300 */
302{
308
310 public CComObjectRootEx<CComMultiThreadModelNoCS>,
311 public IShellFolder2
312{
313 private:
315 CAtlStringW m_rootPath;
316 CAtlStringW m_enumKeyName;
317 CComHeapPtr<ITEMIDLIST> m_pidlRoot;
318
321
322 public:
323 CRegFolder();
324 ~CRegFolder();
325 HRESULT WINAPI Initialize(const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName);
326
327 // IShellFolder
328 STDMETHOD(ParseDisplayName)(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes) override;
329 STDMETHOD(EnumObjects)(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override;
330 STDMETHOD(BindToObject)(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override;
331 STDMETHOD(BindToStorage)(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override;
333 STDMETHOD(CreateViewObject)(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override;
334 STDMETHOD(GetAttributesOf)(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override;
335 STDMETHOD(GetUIObjectOf)(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) override;
337 STDMETHOD(SetNameOf)(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override;
338
339 /* ShellFolder2 */
340 STDMETHOD(GetDefaultSearchGUID)(GUID *pguid) override;
341 STDMETHOD(EnumSearches)(IEnumExtraSearch **ppenum) override;
342 STDMETHOD(GetDefaultColumn)(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override;
343 STDMETHOD(GetDefaultColumnState)(UINT iColumn, DWORD *pcsFlags) override;
344 STDMETHOD(GetDetailsEx)(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override;
345 STDMETHOD(GetDetailsOf)(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override;
347
349
351
353 COM_INTERFACE_ENTRY_IID(IID_IShellFolder2, IShellFolder2)
354 COM_INTERFACE_ENTRY_IID(IID_IShellFolder, IShellFolder)
356};
357
359{
360}
361
363{
364}
365
366HRESULT WINAPI CRegFolder::Initialize(const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName)
367{
368 memcpy(&m_guid, pGuid, sizeof(m_guid));
369
370 m_rootPath = lpszPath;
371 if (!m_rootPath)
372 return E_OUTOFMEMORY;
373
374 m_enumKeyName = lpszEnumKeyName;
375 if (!m_enumKeyName)
376 return E_OUTOFMEMORY;
377
378 m_pidlRoot.Attach(ILClone(pidlRoot));
379 if (!m_pidlRoot)
380 return E_OUTOFMEMORY;
381
382 return S_OK;
383}
384
386{
387 DWORD dwAttributes = *pdwAttributes;
388
389 /* First try to get them from the registry */
390 if (!HCR_GetFolderAttributes(pidl, pdwAttributes))
391 {
392 /* We couldn't get anything */
393 *pdwAttributes = 0;
394 }
395
396 /* Items have more attributes when on desktop */
398 {
399 *pdwAttributes |= (dwAttributes & (SFGAO_CANLINK|SFGAO_CANDELETE|SFGAO_CANRENAME|SFGAO_HASPROPSHEET));
400 }
401
402 /* In any case, links can be created */
403 if (*pdwAttributes == NULL)
404 {
405 *pdwAttributes |= (dwAttributes & SFGAO_CANLINK);
406 }
407 return S_OK;
408}
409
411{
413 if (IsEqualGUID(clsid, CLSID_Printers))
414 return TRUE;
415 if (IsEqualGUID(clsid, CLSID_ConnectionFolder))
416 return TRUE;
417 FIXME("Check registry\n");
418 return TRUE;
419}
420
422 ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes)
423{
424 if (!ppidl)
425 return E_INVALIDARG;
426
427 *ppidl = NULL;
428
429 if (!lpszDisplayName)
430 return E_INVALIDARG;
431
432 if (lpszDisplayName[0] != L':' || lpszDisplayName[1] != L':')
433 {
434 FIXME("What should we do here?\n");
435 return E_FAIL;
436 }
437
438 LPWSTR pch, pchNextOfComma = NULL;
439 for (pch = &lpszDisplayName[2]; *pch && *pch != L'\\'; ++pch)
440 {
441 if (*pch == L',' && !pchNextOfComma)
442 pchNextOfComma = pch + 1;
443 }
444
445 CLSID clsid;
446 if (!GUIDFromStringW(&lpszDisplayName[2], &clsid))
447 return CO_E_CLASSSTRING;
448
449 if (pchNextOfComma)
450 {
451 FIXME("Delegate folder\n");
452 return E_FAIL;
453 }
454
455 CComHeapPtr<ITEMIDLIST> pidlTemp(_ILCreateGuid(PT_GUID, clsid));
456 if (!pidlTemp)
457 return E_OUTOFMEMORY;
458
459 if (!_IsInNameSpace(pidlTemp) && !(BindCtx_GetMode(pbc, 0) & STGM_CREATE))
460 return E_INVALIDARG;
461
462 *ppidl = pidlTemp.Detach();
463
464 if (!*pch)
465 {
466 if (pdwAttributes && *pdwAttributes)
467 GetGuidItemAttributes(*ppidl, pdwAttributes);
468
469 return S_OK;
470 }
471
472 HRESULT hr = SHELL32_ParseNextElement(this, hwndOwner, pbc, ppidl, pch + 1, pchEaten,
473 pdwAttributes);
474 if (FAILED(hr))
475 {
476 ILFree(*ppidl);
477 *ppidl = NULL;
478 }
479 return hr;
480}
481
482HRESULT WINAPI CRegFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
483{
484 return ShellObjectCreatorInit<CRegFolderEnum>(m_enumKeyName, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
485}
486
488{
489 CComPtr<IPersistFolder> pFolder;
490 HRESULT hr;
491
492 if (!ppvOut || !pidl || !pidl->mkid.cb)
493 return E_INVALIDARG;
494
495 *ppvOut = NULL;
496
497 GUID *pGUID = _ILGetGUIDPointer(pidl);
498 if (!pGUID)
499 {
500 ERR("CRegFolder::BindToObject called for non guid item!\n");
501 return E_INVALIDARG;
502 }
503
504 hr = SHELL32_BindToSF(m_pidlRoot, NULL, pidl, pGUID, riid, ppvOut);
506 return hr;
507
508 return S_OK;
509}
510
512{
513 return E_NOTIMPL;
514}
515
517{
518 if (!pidl1 || !pidl2 || pidl1->mkid.cb == 0 || pidl2->mkid.cb == 0)
519 {
520 ERR("Got an empty pidl!\n");
521 return E_INVALIDARG;
522 }
523
524 GUID const *clsid1 = _ILGetGUIDPointer (pidl1);
525 GUID const *clsid2 = _ILGetGUIDPointer (pidl2);
526
527 if (!clsid1 && !clsid2)
528 {
529 ERR("Got no guid pidl!\n");
530 return E_INVALIDARG;
531 }
532 else if (clsid1 && clsid2)
533 {
534 if (memcmp(clsid1, clsid2, sizeof(GUID)) == 0)
535 return SHELL32_CompareChildren(this, lParam, pidl1, pidl2);
536
537 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
538 }
539
540 /* Guid folders come first compared to everything else */
541 /* And Drives come before folders in My Computer */
543 {
544 return MAKE_COMPARE_HRESULT(clsid1 ? 1 : -1);
545 }
546 else
547 {
548 return MAKE_COMPARE_HRESULT(clsid1 ? -1 : 1);
549 }
550}
551
553{
554 return E_NOTIMPL;
555}
556
558{
559 if (!rgfInOut || !cidl || !apidl)
560 return E_INVALIDARG;
561
562 if (*rgfInOut == 0)
563 *rgfInOut = ~0;
564
565 while(cidl > 0 && *apidl)
566 {
567 if (_ILIsSpecialFolder(*apidl))
568 GetGuidItemAttributes(*apidl, rgfInOut);
569 else
570 ERR("Got unknown pidl\n");
571 apidl++;
572 cidl--;
573 }
574
575 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
576 *rgfInOut &= ~SFGAO_VALIDATE;
577
578 return S_OK;
579}
580
582 REFIID riid, UINT * prgfInOut, LPVOID * ppvOut)
583{
584 LPVOID pObj = NULL;
586
587 if (!ppvOut)
588 return hr;
589
590 *ppvOut = NULL;
591
592 if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
593 {
594 hr = CGuidItemExtractIcon_CreateInstance(apidl[0], riid, &pObj);
595 }
596 else if (IsEqualIID (riid, IID_IContextMenu) && (cidl >= 1))
597 {
598 if (!_ILGetGUIDPointer (apidl[0]))
599 {
600 ERR("Got non guid item!\n");
601 return E_FAIL;
602 }
603
604 hr = CGuidItemContextMenu_CreateInstance(m_pidlRoot, hwndOwner, cidl, apidl, static_cast<IShellFolder*>(this), (IContextMenu**)&pObj);
605 }
606 else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
607 {
608 hr = IDataObject_Constructor (hwndOwner, m_pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
609 }
610 else
611 {
613 }
614
615 *ppvOut = pObj;
616 return hr;
617
618}
619
621{
622 if (!strRet || (!_ILIsSpecialFolder(pidl) && pidl != NULL))
623 return E_INVALIDARG;
624
625 if (!pidl || !pidl->mkid.cb)
626 {
628 {
629 LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
630 if (!pszPath)
631 return E_OUTOFMEMORY;
632
633 /* parsing name like ::{...} */
634 pszPath[0] = ':';
635 pszPath[1] = ':';
636 SHELL32_GUIDToStringW(m_guid, &pszPath[2]);
637
638 strRet->uType = STRRET_WSTR;
639 strRet->pOleStr = pszPath;
640
641 return S_OK;
642 }
643 else
644 {
645 BOOL bRet;
646 WCHAR wstrName[MAX_PATH+1];
647 bRet = HCR_GetClassNameW(m_guid, wstrName, MAX_PATH);
648 if (!bRet)
649 return E_FAIL;
650
651 return SHSetStrRet(strRet, wstrName);
652
653 }
654 }
655
656 HRESULT hr;
657 GUID const *clsid = _ILGetGUIDPointer (pidl);
658
659 /* First of all check if we need to query the name from the child item */
662 {
663 int bWantsForParsing = FALSE;
664
665 /*
666 * We can only get a filesystem path from a shellfolder if the
667 * value WantsFORPARSING in CLSID\\{...}\\shellfolder exists.
668 *
669 * Exception: The MyComputer folder doesn't have this key,
670 * but any other filesystem backed folder it needs it.
671 */
672 if (IsEqualIID (*clsid, CLSID_MyComputer))
673 {
674 bWantsForParsing = TRUE;
675 }
676 else
677 {
678 HKEY hkeyClass;
679 if (HCR_RegOpenClassIDKey(*clsid, &hkeyClass))
680 {
681 LONG res = SHGetValueW(hkeyClass, L"Shellfolder", L"WantsForParsing", NULL, NULL, NULL);
682 bWantsForParsing = (res == ERROR_SUCCESS);
683 RegCloseKey(hkeyClass);
684 }
685 }
686
687 if (bWantsForParsing)
688 {
689 /*
690 * we need the filesystem path to the destination folder.
691 * Only the folder itself can know it
692 */
693 return SHELL32_GetDisplayNameOfChild (this, pidl, dwFlags, strRet);
694 }
695 }
696
697 /* Allocate the buffer for the result */
698 SIZE_T cchPath = MAX_PATH + 1;
699 LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc(cchPath * sizeof(WCHAR));
700 if (!pszPath)
701 return E_OUTOFMEMORY;
702
703 hr = S_OK;
704
706 {
707 SIZE_T pathlen = 0;
708 PWCHAR pItemName = pszPath; // GET_SHGDN_RELATION(dwFlags) == SHGDN_INFOLDER
710 {
711 hr = StringCchCopyW(pszPath, cchPath, m_rootPath);
712 if (SUCCEEDED(hr))
713 {
714 pathlen = wcslen(pszPath);
715 pItemName = &pszPath[pathlen];
716 if (pathlen)
717 {
718 if (++pathlen < cchPath)
719 *pItemName++ = L'\\';
720 else
722 }
723 }
724 }
725
726 if (SUCCEEDED(hr) && pathlen + 2 + 38 + 1 < cchPath)
727 {
728 /* parsing name like ::{...} */
729 pItemName[0] = L':';
730 pItemName[1] = L':';
731 SHELL32_GUIDToStringW(*clsid, &pItemName[2]);
732 }
733 else
734 {
736 }
737 }
738 else
739 {
740 /* user friendly name */
741 if (!HCR_GetClassNameW(*clsid, pszPath, cchPath))
742 hr = E_FAIL;
743 }
744
745 if (SUCCEEDED(hr))
746 {
747 strRet->uType = STRRET_WSTR;
748 strRet->pOleStr = pszPath;
749 }
750 else
751 {
752 CoTaskMemFree(pszPath);
753 }
754
755 return hr;
756}
757
758HRESULT WINAPI CRegFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, /* simple pidl */
759 LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut)
760{
761 GUID const *clsid = _ILGetGUIDPointer (pidl);
762 LPOLESTR pStr;
763 HRESULT hr;
764 WCHAR szName[100];
765
766 if (!clsid)
767 {
768 ERR("Pidl is not reg item!\n");
769 return E_FAIL;
770 }
771
772 hr = StringFromCLSID(*clsid, &pStr);
774 return hr;
775
776 swprintf(szName, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\%s", pStr);
777
778 DWORD cbData = (wcslen(lpName) + 1) * sizeof(WCHAR);
780
781 CoTaskMemFree(pStr);
782
783 if (res == ERROR_SUCCESS)
784 {
785 *pPidlOut = ILClone(pidl);
786 return S_OK;
787 }
788
789 return E_FAIL;
790}
791
792
794{
795 return E_NOTIMPL;
796}
797
799{
800 return E_NOTIMPL;
801}
802
804{
805 if (pSort)
806 *pSort = 0;
807 if (pDisplay)
808 *pDisplay = 0;
809
810 return S_OK;
811}
812
814{
815 if (iColumn >= REGFOLDERCOLUMNCOUNT)
816 return E_INVALIDARG;
818 return S_OK;
819}
820
822{
823 return E_NOTIMPL;
824}
825
827{
828 if (!psd)
829 return E_INVALIDARG;
830
831 if (!pidl)
832 {
833 TRACE("CRegFolder has no column info\n");
834 return E_INVALIDARG;
835 }
836
837 GUID const *clsid = _ILGetGUIDPointer (pidl);
838
839 if (!clsid)
840 {
841 ERR("Pidl is not reg item!\n");
842 return E_INVALIDARG;
843 }
844
845 switch(iColumn)
846 {
847 case COL_NAME:
848 return GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
849 case COL_TYPE:
850 return SHSetStrRet(&psd->str, IDS_SYSTEMFOLDER);
851 case COL_INFOTIP:
852 HKEY hKey;
854 return SHSetStrRet(&psd->str, "");
855
856 psd->str.cStr[0] = 0x00;
857 psd->str.uType = STRRET_CSTR;
858 RegLoadMUIStringA(hKey, "InfoTip", psd->str.cStr, MAX_PATH, NULL, 0, NULL);
860 return S_OK;
861 default:
862 /* Return an empty string when we area asked for a column we don't support.
863 Only the regfolder is supposed to do this as it supports less columns compared to other folder
864 and its contents are supposed to be presented alongside items that support more columns. */
865 return SHSetStrRet(&psd->str, "");
866 }
867 return E_FAIL;
868}
869
871{
872 return E_NOTIMPL;
873}
874
875/* In latest windows version this is exported but it takes different arguments! */
876HRESULT CRegFolder_CreateInstance(const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName, REFIID riid, void **ppv)
877{
878 return ShellObjectCreatorInit<CRegFolder>(pGuid, pidlRoot, lpszPath, lpszEnumKeyName, riid, ppv);
879}
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:876
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:137
REGFOLDERCOLUMNINDEX
Definition: CRegFolder.cpp:302
@ REGFOLDERCOLUMNCOUNT
Definition: CRegFolder.cpp:306
@ COL_INFOTIP
Definition: CRegFolder.cpp:305
@ COL_NAME
Definition: CRegFolder.cpp:303
@ COL_TYPE
Definition: CRegFolder.cpp:304
HRESULT FormatGUIDKey(LPWSTR KeyName, SIZE_T KeySize, LPCWSTR RegPath, const GUID *riid)
Definition: CRegFolder.cpp:127
HRESULT CGuidItemContextMenu_CreateInstance(PCIDLIST_ABSOLUTE pidlFolder, HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IShellFolder *psf, IContextMenu **ppcm)
Definition: CRegFolder.cpp:97
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 STDMETHOD(m)
Definition: basetyps.h:62
#define FIXME(fmt,...)
Definition: debug.h:114
#define WARN(fmt,...)
Definition: debug.h:115
#define ERR(fmt,...)
Definition: debug.h:113
#define RegCloseKey(hKey)
Definition: registry.h:49
BOOL AddToEnumList(LPITEMIDLIST pidl)
HRESULT Initialize(LPCWSTR lpszEnumKeyName, DWORD dwFlags)
Definition: CRegFolder.cpp:244
HRESULT AddItemsFromKey(HKEY hkey_root, LPCWSTR szRepPath)
Definition: CRegFolder.cpp:263
STDMETHOD() EnumSearches(IEnumExtraSearch **ppenum) override
Definition: CRegFolder.cpp:798
STDMETHOD() MapColumnToSCID(UINT column, SHCOLUMNID *pscid) override
Definition: CRegFolder.cpp:870
STDMETHOD() GetDefaultSearchGUID(GUID *pguid) override
Definition: CRegFolder.cpp:793
BOOL _IsInNameSpace(_In_ LPCITEMIDLIST pidl)
Definition: CRegFolder.cpp:410
STDMETHOD() CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
Definition: CRegFolder.cpp:516
STDMETHOD() GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override
Definition: CRegFolder.cpp:821
CAtlStringW m_enumKeyName
Definition: CRegFolder.cpp:316
STDMETHOD() CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override
Definition: CRegFolder.cpp:552
CAtlStringW m_rootPath
Definition: CRegFolder.cpp:315
STDMETHOD() SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
Definition: CRegFolder.cpp:758
STDMETHOD() GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override
Definition: CRegFolder.cpp:803
CComHeapPtr< ITEMIDLIST > m_pidlRoot
Definition: CRegFolder.cpp:317
STDMETHOD() ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes) override
Definition: CRegFolder.cpp:421
STDMETHOD() GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags) override
Definition: CRegFolder.cpp:813
STDMETHOD() BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: CRegFolder.cpp:487
STDMETHOD() EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override
Definition: CRegFolder.cpp:482
STDMETHOD() GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
Definition: CRegFolder.cpp:620
STDMETHOD() GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override
Definition: CRegFolder.cpp:826
HRESULT GetGuidItemAttributes(LPCITEMIDLIST pidl, LPDWORD pdwAttributes)
Definition: CRegFolder.cpp:385
STDMETHOD() GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
Definition: CRegFolder.cpp:557
STDMETHOD() GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override
Definition: CRegFolder.cpp:581
HRESULT WINAPI Initialize(const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName)
Definition: CRegFolder.cpp:366
STDMETHOD() BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: CRegFolder.cpp:511
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#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:1931
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3268
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)
Definition: reg.c:5268
LONG WINAPI RegEnumKeyW(HKEY hKey, DWORD dwIndex, LPWSTR lpName, DWORD cbName)
Definition: reg.c:2393
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
HRESULT WINAPI StringFromCLSID(REFCLSID id, LPOLESTR *idstr)
Definition: compobj.c:2412
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
Definition: compobj.c:2434
#define RRF_RT_REG_SZ
Definition: driver.c:575
DWORD BindCtx_GetMode(_In_ IBindCtx *pbc, _In_ DWORD dwDefault)
Definition: utils.cpp:114
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
#define PT_GUID
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 pch(ap)
Definition: match.c:418
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static IParseDisplayName ParseDisplayName
Definition: moniker.c:816
static LPOLESTR
Definition: stg_prop.c:27
#define _In_
Definition: ms_sal.h:308
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
#define STGM_CREATE
Definition: objbase.h:926
interface IBindCtx * LPBC
Definition: objfwd.h:18
const GUID IID_IDataObject
BOOL WINAPI GUIDFromStringW(_In_ PCWSTR psz, _Out_ LPGUID pguid)
long LONG
Definition: pedump.c:60
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:938
BOOL _ILIsBitBucket(LPCITEMIDLIST pidl)
Definition: pidl.c:1986
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
LPITEMIDLIST _ILCreateGuidFromStrW(LPCWSTR szGUID)
Definition: pidl.c:1769
IID * _ILGetGUIDPointer(LPCITEMIDLIST pidl)
Definition: pidl.c:2369
LPITEMIDLIST _ILCreateGuid(PIDLTYPE type, REFIID guid)
Definition: pidl.c:1731
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:399
BOOL HCR_GetFolderAttributes(LPCITEMIDLIST pidlFolder, LPDWORD pdwAttributes)
Definition: classes.c:567
BOOL HCR_GetIconW(LPCWSTR szClass, LPWSTR szDest, LPCWSTR szName, DWORD len, int *picon_idx)
Definition: classes.c:291
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:577
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:168
#define SHFSF_COL_COMMENT
Definition: shfldr.h:48
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:206
#define SHFSF_COL_NAME
Definition: shfldr.h:43
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:224
static __inline int SHELL32_GUIDToStringW(REFGUID guid, LPWSTR str)
Definition: shfldr.h:99
#define SHFSF_COL_TYPE
Definition: shfldr.h:45
LSTATUS AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:277
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:247
HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE *ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
Definition: shlfolder.cpp:361
BOOL HCR_RegOpenClassIDKey(REFIID riid, HKEY *hkey)
Definition: classes.c:230
HRESULT SHELL32_ParseNextElement(IShellFolder2 *psf, HWND hwndOwner, LPBC pbc, LPITEMIDLIST *pidlInOut, LPOLESTR szNext, DWORD *pEaten, DWORD *pdwAttributes)
Definition: shlfolder.cpp:79
HINSTANCE WINAPI ShellExecuteW(HWND hwnd, LPCWSTR lpVerb, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd)
Definition: shlexec.cpp:2402
HRESULT hr
Definition: shlfolder.c:183
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2597
#define IDS_SYSTEMFOLDER
Definition: shresdef.h:350
#define IDI_SHELL_DESKTOP
Definition: shresdef.h:585
#define IDI_SHELL_DOCUMENT
Definition: shresdef.h:551
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
#define _countof(array)
Definition: sndvol32.h:68
#define TRACE(s)
Definition: solgame.cpp:4
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
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
#define max(a, b)
Definition: svc.c:63
ULONG_PTR SIZE_T
Definition: typedefs.h:80
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
int ret
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
Definition: wdfdevice.h:2699
_In_ LPCSTR lpName
Definition: winbase.h:2789
_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 HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define CO_E_CLASSSTRING
Definition: winerror.h:2806
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define SW_SHOWNORMAL
Definition: winuser.h:770
#define SW_SHOWDEFAULT
Definition: winuser.h:780
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