ReactOS 0.4.15-dev-7918-g2a2556c
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{
242};
243
245{
246}
247
249{
250}
251
253{
255
256 if (!(dwFlags & SHCONTF_FOLDERS))
257 return S_OK;
258
260 L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\%s\\Namespace",
261 lpszEnumKeyName);
263 return hr;
264
267
268 return S_OK;
269}
270
272{
274 HKEY hkey;
275
276 if (RegOpenKeyW(hkey_root, szRepPath, &hkey) != ERROR_SUCCESS)
277 return S_FALSE;
278
279 for (int idx = 0; ; idx++)
280 {
281 if (RegEnumKeyW(hkey, idx, name, MAX_PATH) != ERROR_SUCCESS)
282 break;
283
284 /* If the name of the key is not a guid try to get the default value of the key */
285 if (name[0] != L'{')
286 {
287 DWORD dwSize = sizeof(name);
289 }
290
291 if (*name == '{')
292 {
294
295 if (pidl)
296 AddToEnumList(pidl);
297 }
298 }
299
300 RegCloseKey(hkey);
301
302 return S_OK;
303}
304
306 public CComObjectRootEx<CComMultiThreadModelNoCS>,
307 public IShellFolder2
308{
309 private:
311 CAtlStringW m_rootPath;
312 CAtlStringW m_enumKeyName;
313 CComHeapPtr<ITEMIDLIST> m_pidlRoot;
314
317
318 public:
319 CRegFolder();
320 ~CRegFolder();
321 HRESULT WINAPI Initialize(const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName);
322
323 // IShellFolder
324 STDMETHOD(ParseDisplayName)(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes) override;
325 STDMETHOD(EnumObjects)(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override;
326 STDMETHOD(BindToObject)(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override;
327 STDMETHOD(BindToStorage)(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override;
329 STDMETHOD(CreateViewObject)(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override;
330 STDMETHOD(GetAttributesOf)(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override;
331 STDMETHOD(GetUIObjectOf)(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) override;
333 STDMETHOD(SetNameOf)(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override;
334
335 /* ShellFolder2 */
336 STDMETHOD(GetDefaultSearchGUID)(GUID *pguid) override;
337 STDMETHOD(EnumSearches)(IEnumExtraSearch **ppenum) override;
338 STDMETHOD(GetDefaultColumn)(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override;
339 STDMETHOD(GetDefaultColumnState)(UINT iColumn, DWORD *pcsFlags) override;
340 STDMETHOD(GetDetailsEx)(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override;
341 STDMETHOD(GetDetailsOf)(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override;
343
345
347
349 COM_INTERFACE_ENTRY_IID(IID_IShellFolder2, IShellFolder2)
350 COM_INTERFACE_ENTRY_IID(IID_IShellFolder, IShellFolder)
352};
353
355{
356}
357
359{
360}
361
362HRESULT WINAPI CRegFolder::Initialize(const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName)
363{
364 memcpy(&m_guid, pGuid, sizeof(m_guid));
365
366 m_rootPath = lpszPath;
367 if (!m_rootPath)
368 return E_OUTOFMEMORY;
369
370 m_enumKeyName = lpszEnumKeyName;
371 if (!m_enumKeyName)
372 return E_OUTOFMEMORY;
373
374 m_pidlRoot.Attach(ILClone(pidlRoot));
375 if (!m_pidlRoot)
376 return E_OUTOFMEMORY;
377
378 return S_OK;
379}
380
382{
383 DWORD dwAttributes = *pdwAttributes;
384
385 /* First try to get them from the registry */
386 if (!HCR_GetFolderAttributes(pidl, pdwAttributes))
387 {
388 /* We couldn't get anything */
389 *pdwAttributes = 0;
390 }
391
392 /* Items have more attributes when on desktop */
394 {
395 *pdwAttributes |= (dwAttributes & (SFGAO_CANLINK|SFGAO_CANDELETE|SFGAO_CANRENAME|SFGAO_HASPROPSHEET));
396 }
397
398 /* In any case, links can be created */
399 if (*pdwAttributes == NULL)
400 {
401 *pdwAttributes |= (dwAttributes & SFGAO_CANLINK);
402 }
403 return S_OK;
404}
405
407{
409 if (IsEqualGUID(clsid, CLSID_Printers))
410 return TRUE;
411 if (IsEqualGUID(clsid, CLSID_ConnectionFolder))
412 return TRUE;
413 FIXME("Check registry\n");
414 return TRUE;
415}
416
418 ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes)
419{
420 if (!ppidl)
421 return E_INVALIDARG;
422
423 *ppidl = NULL;
424
425 if (!lpszDisplayName)
426 return E_INVALIDARG;
427
428 if (lpszDisplayName[0] != L':' || lpszDisplayName[1] != L':')
429 {
430 FIXME("What should we do here?\n");
431 return E_FAIL;
432 }
433
434 LPWSTR pch, pchNextOfComma = NULL;
435 for (pch = &lpszDisplayName[2]; *pch && *pch != L'\\'; ++pch)
436 {
437 if (*pch == L',' && !pchNextOfComma)
438 pchNextOfComma = pch + 1;
439 }
440
441 CLSID clsid;
442 if (!GUIDFromStringW(&lpszDisplayName[2], &clsid))
443 return CO_E_CLASSSTRING;
444
445 if (pchNextOfComma)
446 {
447 FIXME("Delegate folder\n");
448 return E_FAIL;
449 }
450
451 CComHeapPtr<ITEMIDLIST> pidlTemp(_ILCreateGuid(PT_GUID, clsid));
452 if (!pidlTemp)
453 return E_OUTOFMEMORY;
454
455 if (!_IsInNameSpace(pidlTemp) && !(BindCtx_GetMode(pbc, 0) & STGM_CREATE))
456 return E_INVALIDARG;
457
458 *ppidl = pidlTemp.Detach();
459
460 if (!*pch)
461 {
462 if (pdwAttributes && *pdwAttributes)
463 GetGuidItemAttributes(*ppidl, pdwAttributes);
464
465 return S_OK;
466 }
467
468 HRESULT hr = SHELL32_ParseNextElement(this, hwndOwner, pbc, ppidl, pch + 1, pchEaten,
469 pdwAttributes);
470 if (FAILED(hr))
471 {
472 ILFree(*ppidl);
473 *ppidl = NULL;
474 }
475 return hr;
476}
477
478HRESULT WINAPI CRegFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
479{
480 return ShellObjectCreatorInit<CRegFolderEnum>(m_enumKeyName, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
481}
482
484{
485 CComPtr<IPersistFolder> pFolder;
486 HRESULT hr;
487
488 if (!ppvOut || !pidl || !pidl->mkid.cb)
489 return E_INVALIDARG;
490
491 *ppvOut = NULL;
492
493 GUID *pGUID = _ILGetGUIDPointer(pidl);
494 if (!pGUID)
495 {
496 ERR("CRegFolder::BindToObject called for non guid item!\n");
497 return E_INVALIDARG;
498 }
499
500 hr = SHELL32_BindToSF(m_pidlRoot, NULL, pidl, pGUID, riid, ppvOut);
502 return hr;
503
504 return S_OK;
505}
506
508{
509 return E_NOTIMPL;
510}
511
513{
514 if (!pidl1 || !pidl2 || pidl1->mkid.cb == 0 || pidl2->mkid.cb == 0)
515 {
516 ERR("Got an empty pidl!\n");
517 return E_INVALIDARG;
518 }
519
520 GUID const *clsid1 = _ILGetGUIDPointer (pidl1);
521 GUID const *clsid2 = _ILGetGUIDPointer (pidl2);
522
523 if (!clsid1 && !clsid2)
524 {
525 ERR("Got no guid pidl!\n");
526 return E_INVALIDARG;
527 }
528 else if (clsid1 && clsid2)
529 {
530 if (memcmp(clsid1, clsid2, sizeof(GUID)) == 0)
531 return SHELL32_CompareChildren(this, lParam, pidl1, pidl2);
532
533 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
534 }
535
536 /* Guid folders come first compared to everything else */
537 /* And Drives come before folders in My Computer */
539 {
540 return MAKE_COMPARE_HRESULT(clsid1 ? 1 : -1);
541 }
542 else
543 {
544 return MAKE_COMPARE_HRESULT(clsid1 ? -1 : 1);
545 }
546}
547
549{
550 return E_NOTIMPL;
551}
552
554{
555 if (!rgfInOut || !cidl || !apidl)
556 return E_INVALIDARG;
557
558 if (*rgfInOut == 0)
559 *rgfInOut = ~0;
560
561 while(cidl > 0 && *apidl)
562 {
563 if (_ILIsSpecialFolder(*apidl))
564 GetGuidItemAttributes(*apidl, rgfInOut);
565 else
566 ERR("Got unknown pidl\n");
567 apidl++;
568 cidl--;
569 }
570
571 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
572 *rgfInOut &= ~SFGAO_VALIDATE;
573
574 return S_OK;
575}
576
578 REFIID riid, UINT * prgfInOut, LPVOID * ppvOut)
579{
580 LPVOID pObj = NULL;
582
583 if (!ppvOut)
584 return hr;
585
586 *ppvOut = NULL;
587
588 if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
589 {
590 hr = CGuidItemExtractIcon_CreateInstance(apidl[0], riid, &pObj);
591 }
592 else if (IsEqualIID (riid, IID_IContextMenu) && (cidl >= 1))
593 {
594 if (!_ILGetGUIDPointer (apidl[0]))
595 {
596 ERR("Got non guid item!\n");
597 return E_FAIL;
598 }
599
600 hr = CGuidItemContextMenu_CreateInstance(m_pidlRoot, hwndOwner, cidl, apidl, static_cast<IShellFolder*>(this), (IContextMenu**)&pObj);
601 }
602 else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
603 {
604 hr = IDataObject_Constructor (hwndOwner, m_pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
605 }
606 else
607 {
609 }
610
611 *ppvOut = pObj;
612 return hr;
613
614}
615
617{
618 if (!strRet || (!_ILIsSpecialFolder(pidl) && pidl != NULL))
619 return E_INVALIDARG;
620
621 if (!pidl || !pidl->mkid.cb)
622 {
624 {
625 LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
626 if (!pszPath)
627 return E_OUTOFMEMORY;
628
629 /* parsing name like ::{...} */
630 pszPath[0] = ':';
631 pszPath[1] = ':';
632 SHELL32_GUIDToStringW(m_guid, &pszPath[2]);
633
634 strRet->uType = STRRET_WSTR;
635 strRet->pOleStr = pszPath;
636
637 return S_OK;
638 }
639 else
640 {
641 BOOL bRet;
642 WCHAR wstrName[MAX_PATH+1];
643 bRet = HCR_GetClassNameW(m_guid, wstrName, MAX_PATH);
644 if (!bRet)
645 return E_FAIL;
646
647 return SHSetStrRet(strRet, wstrName);
648
649 }
650 }
651
652 HRESULT hr;
653 GUID const *clsid = _ILGetGUIDPointer (pidl);
654
655 /* First of all check if we need to query the name from the child item */
658 {
659 int bWantsForParsing = FALSE;
660
661 /*
662 * We can only get a filesystem path from a shellfolder if the
663 * value WantsFORPARSING in CLSID\\{...}\\shellfolder exists.
664 *
665 * Exception: The MyComputer folder doesn't have this key,
666 * but any other filesystem backed folder it needs it.
667 */
668 if (IsEqualIID (*clsid, CLSID_MyComputer))
669 {
670 bWantsForParsing = TRUE;
671 }
672 else
673 {
674 HKEY hkeyClass;
675 if (HCR_RegOpenClassIDKey(*clsid, &hkeyClass))
676 {
677 LONG res = SHGetValueW(hkeyClass, L"Shellfolder", L"WantsForParsing", NULL, NULL, NULL);
678 bWantsForParsing = (res == ERROR_SUCCESS);
679 RegCloseKey(hkeyClass);
680 }
681 }
682
683 if (bWantsForParsing)
684 {
685 /*
686 * we need the filesystem path to the destination folder.
687 * Only the folder itself can know it
688 */
689 return SHELL32_GetDisplayNameOfChild (this, pidl, dwFlags, strRet);
690 }
691 }
692
693 /* Allocate the buffer for the result */
694 SIZE_T cchPath = MAX_PATH + 1;
695 LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc(cchPath * sizeof(WCHAR));
696 if (!pszPath)
697 return E_OUTOFMEMORY;
698
699 hr = S_OK;
700
702 {
703 SIZE_T pathlen = 0;
704 PWCHAR pItemName = pszPath; // GET_SHGDN_RELATION(dwFlags) == SHGDN_INFOLDER
706 {
707 hr = StringCchCopyW(pszPath, cchPath, m_rootPath);
708 if (SUCCEEDED(hr))
709 {
710 pathlen = wcslen(pszPath);
711 pItemName = &pszPath[pathlen];
712 if (pathlen)
713 {
714 if (++pathlen < cchPath)
715 *pItemName++ = L'\\';
716 else
718 }
719 }
720 }
721
722 if (SUCCEEDED(hr) && pathlen + 2 + 38 + 1 < cchPath)
723 {
724 /* parsing name like ::{...} */
725 pItemName[0] = L':';
726 pItemName[1] = L':';
727 SHELL32_GUIDToStringW(*clsid, &pItemName[2]);
728 }
729 else
730 {
732 }
733 }
734 else
735 {
736 /* user friendly name */
737 if (!HCR_GetClassNameW(*clsid, pszPath, cchPath))
738 hr = E_FAIL;
739 }
740
741 if (SUCCEEDED(hr))
742 {
743 strRet->uType = STRRET_WSTR;
744 strRet->pOleStr = pszPath;
745 }
746 else
747 {
748 CoTaskMemFree(pszPath);
749 }
750
751 return hr;
752}
753
754HRESULT WINAPI CRegFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, /* simple pidl */
755 LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut)
756{
757 GUID const *clsid = _ILGetGUIDPointer (pidl);
758 LPOLESTR pStr;
759 HRESULT hr;
760 WCHAR szName[100];
761
762 if (!clsid)
763 {
764 ERR("Pidl is not reg item!\n");
765 return E_FAIL;
766 }
767
768 hr = StringFromCLSID(*clsid, &pStr);
770 return hr;
771
772 swprintf(szName, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\%s", pStr);
773
774 DWORD cbData = (wcslen(lpName) + 1) * sizeof(WCHAR);
776
777 CoTaskMemFree(pStr);
778
779 if (res == ERROR_SUCCESS)
780 {
781 *pPidlOut = ILClone(pidl);
782 return S_OK;
783 }
784
785 return E_FAIL;
786}
787
788
790{
791 return E_NOTIMPL;
792}
793
795{
796 return E_NOTIMPL;
797}
798
800{
801 if (pSort)
802 *pSort = 0;
803 if (pDisplay)
804 *pDisplay = 0;
805
806 return S_OK;
807}
808
810{
811 if (iColumn >= REGISTRY_COL_COUNT)
812 return E_INVALIDARG;
814 return S_OK;
815}
816
818{
819 return E_NOTIMPL;
820}
821
823{
824 if (!psd)
825 return E_INVALIDARG;
826
827 GUID const *clsid = _ILGetGUIDPointer (pidl);
828
829 if (!clsid)
830 {
831 ERR("Pidl is not reg item!\n");
832 return E_INVALIDARG;
833 }
834
835 switch(iColumn)
836 {
838 return GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
840 return SHSetStrRet(&psd->str, IDS_SYSTEMFOLDER);
842 HKEY hKey;
844 return SHSetStrRet(&psd->str, "");
845
846 psd->str.cStr[0] = 0x00;
847 psd->str.uType = STRRET_CSTR;
848 RegLoadMUIStringA(hKey, "InfoTip", psd->str.cStr, MAX_PATH, NULL, 0, NULL);
850 return S_OK;
851 default:
852 /* Return an empty string when we area asked for a column we don't support.
853 Only the regfolder is supposed to do this as it supports less columns compared to other folder
854 and its contents are supposed to be presented alongside items that support more columns. */
855 return SHSetStrRet(&psd->str, "");
856 }
857 return E_FAIL;
858}
859
861{
862 return E_NOTIMPL;
863}
864
865/* In latest windows version this is exported but it takes different arguments! */
866HRESULT CRegFolder_CreateInstance(const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName, REFIID riid, void **ppv)
867{
868 return ShellObjectCreatorInit<CRegFolder>(pGuid, pidlRoot, lpszPath, lpszEnumKeyName, riid, ppv);
869}
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:866
registry_columns
Definition: CRegFolder.cpp:237
@ 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
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
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:111
#define WARN(fmt,...)
Definition: debug.h:112
#define ERR(fmt,...)
Definition: debug.h:110
#define RegCloseKey(hKey)
Definition: registry.h:49
BOOL AddToEnumList(LPITEMIDLIST pidl)
HRESULT Initialize(LPCWSTR lpszEnumKeyName, DWORD dwFlags)
Definition: CRegFolder.cpp:252
HRESULT AddItemsFromKey(HKEY hkey_root, LPCWSTR szRepPath)
Definition: CRegFolder.cpp:271
STDMETHOD() EnumSearches(IEnumExtraSearch **ppenum) override
Definition: CRegFolder.cpp:794
STDMETHOD() MapColumnToSCID(UINT column, SHCOLUMNID *pscid) override
Definition: CRegFolder.cpp:860
STDMETHOD() GetDefaultSearchGUID(GUID *pguid) override
Definition: CRegFolder.cpp:789
BOOL _IsInNameSpace(_In_ LPCITEMIDLIST pidl)
Definition: CRegFolder.cpp:406
STDMETHOD() CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
Definition: CRegFolder.cpp:512
STDMETHOD() GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override
Definition: CRegFolder.cpp:817
CAtlStringW m_enumKeyName
Definition: CRegFolder.cpp:312
STDMETHOD() CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override
Definition: CRegFolder.cpp:548
CAtlStringW m_rootPath
Definition: CRegFolder.cpp:311
STDMETHOD() SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
Definition: CRegFolder.cpp:754
STDMETHOD() GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override
Definition: CRegFolder.cpp:799
CComHeapPtr< ITEMIDLIST > m_pidlRoot
Definition: CRegFolder.cpp:313
STDMETHOD() ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes) override
Definition: CRegFolder.cpp:417
STDMETHOD() GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags) override
Definition: CRegFolder.cpp:809
STDMETHOD() BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: CRegFolder.cpp:483
STDMETHOD() EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override
Definition: CRegFolder.cpp:478
STDMETHOD() GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
Definition: CRegFolder.cpp:616
STDMETHOD() GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override
Definition: CRegFolder.cpp:822
HRESULT GetGuidItemAttributes(LPCITEMIDLIST pidl, LPDWORD pdwAttributes)
Definition: CRegFolder.cpp:381
STDMETHOD() GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
Definition: CRegFolder.cpp:553
STDMETHOD() GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override
Definition: CRegFolder.cpp:577
HRESULT WINAPI Initialize(const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName)
Definition: CRegFolder.cpp:362
STDMETHOD() BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: CRegFolder.cpp:507
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:579
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:168
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:206
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:85
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
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
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