ReactOS 0.4.16-dev-1163-gec5b142
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 * The required-regitem design is based on the research by Geoff Chappell
21 * https://www.geoffchappell.com/studies/windows/shell/shell32/classes/regfolder.htm
22 */
23
24#include <precomp.h>
25
27
30
32{
33 WCHAR xriid[CHARS_IN_GUID];
34 StringFromGUID2(*riid, xriid, _countof(xriid));
35 return StringCchPrintfW(KeyName, KeySize, RegPath, xriid);
36}
37
39{
40 const UINT cchGuid = CHARS_IN_GUID - 1, cchClsidSlash = sizeof("CLSID\\") - 1;
41 WCHAR Path[200];
42 wcscpy(Path, L"CLSID\\");
44 if (SubKey)
45 {
46 *(Path + cchClsidSlash + cchGuid) = L'\\';
47 wcscpy(Path + cchClsidSlash + cchGuid + 1, SubKey);
48 }
50}
51
53{
54 return SHELL_QueryCLSIDValue(clsid, L"ShellFolder", Value, NULL, NULL) == ERROR_SUCCESS;
55}
56
58{
59 return type == PT_CONTROLS_NEWREGITEM ? 14 : 4;
60}
61
63{
64 DWORD dwOrder, cb = sizeof(dwOrder);
65 if (SHELL_QueryCLSIDValue(clsid, NULL, L"SortOrderIndex", &dwOrder, &cb) || cb != sizeof(dwOrder))
66 dwOrder = REGITEMORDER_DEFAULT;
67 return (BYTE)dwOrder;
68}
69
71{
72#if 1 // FIXME: CControlPanelFolder is not ready for this yet
73 if (type == PT_CONTROLS_NEWREGITEM)
74 type = PT_CONTROLS_OLDREGITEM;
75#endif
77 const UINT cb = offset + sizeof(CLSID), cbTotal = cb + sizeof(WORD);
78 LPITEMIDLIST pidl = (LPITEMIDLIST)SHAlloc(cbTotal);
79 if (pidl)
80 {
81 ZeroMemory(pidl, cbTotal); // Note: This also initializes the terminator WORD
82 pidl->mkid.cb = cb;
83 pidl->mkid.abID[0] = type;
84 pidl->mkid.abID[1] = order >= 0 ? (BYTE)order : GetRegItemOrder(clsid);
85 *(CLSID*)(SIZE_T(pidl) + offset) = clsid;
86 }
87 return pidl;
88}
89
91{
93 return SUCCEEDED(CLSIDFromString(clsidstr, &clsid)) ? CreateRegItem(type, clsid) : NULL;
94}
95
97{
99
101 {
102 m_pInfo = pInfo;
103 }
104
105 const CLSID* IsRegItem(LPCITEMIDLIST pidl) const
106 {
107 if (pidl && pidl->mkid.cb >= sizeof(WORD) + 1 + 1 + sizeof(GUID))
108 {
109 if (pidl->mkid.abID[0] == m_pInfo->PidlType)
110 return (CLSID*)(SIZE_T(pidl) + GetCLSIDOffset());
111 if (pidl->mkid.abID[0] == PT_CONTROLS_OLDREGITEM)
112 return (CLSID*)(SIZE_T(pidl) + GetRegItemCLSIDOffset(PT_CONTROLS_OLDREGITEM));
113 }
114 if (const IID* pIID = _ILGetGUIDPointer(pidl))
115 {
116 FIXME("Unexpected GUID PIDL type %#x\n", pidl->mkid.abID[0]);
117 return pIID; // FIXME: Remove this when all folders have been fixed
118 }
119 return NULL;
120 }
121
123 {
124 const REQUIREDREGITEM &item = GetAt(i);
125 return CreateRegItem(GetPidlType(), item.clsid, item.Order);
126 }
127
129 {
130 const CLSID *pCLSID = IsRegItem(pidl);
131 return pCLSID ? ::GetRegItemOrder(*pCLSID) : 0xffff;
132 }
133
138 const REQUIREDREGITEM& GetAt(size_t i) const { return m_pInfo->Items[i]; }
139};
140
142{
143 CComPtr<IDefaultExtractIconInit> initIcon;
144 HRESULT hr;
145 GUID const * riid;
146 int icon_idx;
147 WCHAR wTemp[MAX_PATH];
148
150 if (FAILED(hr))
151 return hr;
152
153 if (_ILIsDesktop(pidl))
154 {
155 initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_DESKTOP);
156 return initIcon->QueryInterface(iid, ppvOut);
157 }
158
159 riid = _ILGetGUIDPointer(pidl);
160 if (!riid)
161 return E_FAIL;
162
163 /* Choose a correct icon for Recycle Bin (full or empty) */
164 const WCHAR* iconname = NULL;
165 if (_ILIsBitBucket(pidl))
166 {
167 CComPtr<IEnumIDList> EnumIDList;
169
170 CComPtr<IShellFolder2> psfRecycleBin;
171 CComPtr<IShellFolder> psfDesktop;
172 hr = SHGetDesktopFolder(&psfDesktop);
173
174 if (SUCCEEDED(hr))
175 hr = psfDesktop->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder2, &psfRecycleBin));
176 if (SUCCEEDED(hr))
177 hr = psfRecycleBin->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &EnumIDList);
178
179 ULONG itemcount;
180 LPITEMIDLIST pidl = NULL;
181 if (SUCCEEDED(hr) && (hr = EnumIDList->Next(1, &pidl, &itemcount)) == S_OK)
182 {
183 CoTaskMemFree(pidl);
184 iconname = L"Full";
185 } else {
186 iconname = L"Empty";
187 }
188 }
189
190 /* Prepare registry path for loading icons of My Computer and other shell extensions */
192
194 L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\%s",
195 riid);
197 return hr;
198
199 /* Load icon for the current user */
200 BOOL ret = HCU_GetIconW(KeyName, wTemp, iconname, _countof(wTemp), &icon_idx);
201 if (!ret)
202 {
203 /* Failed, load default system-wide icon */
204 hr = FormatGUIDKey(KeyName, _countof(KeyName), L"CLSID\\%s", riid);
206 return hr;
207
208 ret = HCR_GetIconW(KeyName, wTemp, iconname, _countof(wTemp), &icon_idx);
209 }
210
211 if (ret)
212 {
213 /* Success, set loaded icon */
214 initIcon->SetNormalIcon(wTemp, icon_idx);
215 }
216 else
217 {
218 /* Everything has failed, set blank paper icon */
219 WARN("Failed to load an icon for the item, setting blank icon\n");
220 initIcon->SetNormalIcon(swShell32Name, IDI_SHELL_DOCUMENT - 1);
221 }
222
223 return initIcon->QueryInterface(iid, ppvOut);
224}
225
227 public CEnumIDListBase,
228 public CRegFolderInfo
229{
231 public:
233 HRESULT AddItemsFromKey(IShellFolder *pSF, HKEY hkey_root, LPCWSTR szRepPath);
234
235 const CLSID* GetPidlClsid(PCUITEMID_CHILD pidl) { return IsRegItem(pidl); }
236 BOOL HasItemWithCLSID(LPCITEMIDLIST pidl) { return HasItemWithCLSIDImpl<CRegFolderEnum>(pidl); }
237
239 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
241};
242
244{
247 if (!(dwFlags & SHCONTF_FOLDERS))
248 return S_OK;
249
252 L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\%s\\Namespace",
253 pInfo->pszEnumKeyName);
255 return hr;
256
257 // First add the required items and then the items from the registry
259 for (size_t i = 0; i < GetRequiredItemsCount(); ++i)
260 {
261 LPITEMIDLIST pidl = CreateItem(i);
262 if (pidl && SHELL_IncludeItemInFolderEnum(pSF, pidl, query, m_SHCTF))
263 AddToEnumList(pidl);
264 else
265 ILFree(pidl);
266 }
269 return S_OK;
270}
271
273{
275 HKEY hkey;
276
277 if (RegOpenKeyW(hkey_root, szRepPath, &hkey) != ERROR_SUCCESS)
278 return S_FALSE;
279
280 for (int idx = 0; ; idx++)
281 {
282 if (RegEnumKeyW(hkey, idx, name, MAX_PATH) != ERROR_SUCCESS)
283 break;
284
285 /* If the name of the key is not a guid try to get the default value of the key */
286 if (name[0] != L'{')
287 {
288 DWORD dwSize = sizeof(name);
290 }
291
292 if (*name == '{')
293 {
295 {
298 AddToEnumList(pidl);
299 else
300 ILFree(pidl);
301 }
302 }
303 }
304 RegCloseKey(hkey);
305
306 return S_OK;
307}
308
309/*
310 * These columns try to map to CFSFolder's columns because the CDesktopFolder
311 * displays CFSFolder and CRegFolder items in the same view.
312 */
314{
320
322 public CComObjectRootEx<CComMultiThreadModelNoCS>,
323 public IShellFolder2,
324 public CRegFolderInfo
325{
326 private:
327 IShellFolder *m_pOuterFolder; // Not ref-counted
328 CComHeapPtr<ITEMIDLIST> m_pidlRoot;
329
333
334 public:
335 CRegFolder();
336 ~CRegFolder();
338
340 {
341 const CLSID* const pCLSID = IsRegItem(pidl);
342 for (size_t i = 0; pCLSID && i < GetRequiredItemsCount(); ++i)
343 {
344 const REQUIREDREGITEM &item = GetAt(i);
345 if (item.clsid == *pCLSID)
346 return &item;
347 }
348 return NULL;
349 }
350
351 // IShellFolder
352 STDMETHOD(ParseDisplayName)(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes) override;
353 STDMETHOD(EnumObjects)(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override;
354 STDMETHOD(BindToObject)(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override;
355 STDMETHOD(BindToStorage)(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override;
357 STDMETHOD(CreateViewObject)(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override;
358 STDMETHOD(GetAttributesOf)(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override;
359 STDMETHOD(GetUIObjectOf)(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) override;
361 STDMETHOD(SetNameOf)(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override;
362
363 /* ShellFolder2 */
364 STDMETHOD(GetDefaultSearchGUID)(GUID *pguid) override;
365 STDMETHOD(EnumSearches)(IEnumExtraSearch **ppenum) override;
366 STDMETHOD(GetDefaultColumn)(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override;
367 STDMETHOD(GetDefaultColumnState)(UINT iColumn, DWORD *pcsFlags) override;
368 STDMETHOD(GetDetailsEx)(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override;
369 STDMETHOD(GetDetailsOf)(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override;
370 STDMETHOD(MapColumnToSCID)(UINT column, SHCOLUMNID *pscid) override;
371
373
375
377 COM_INTERFACE_ENTRY_IID(IID_IShellFolder2, IShellFolder2)
378 COM_INTERFACE_ENTRY_IID(IID_IShellFolder, IShellFolder)
380};
381
383{
384}
385
387{
388}
389
391{
393 m_pOuterFolder = pInit->psfOuter;
394
395 m_pidlRoot.Attach(ILClone(pidlRoot));
396 if (!m_pidlRoot)
397 return E_OUTOFMEMORY;
398
399 return S_OK;
400}
401
403{
404 DWORD dwAttributes = *pdwAttributes;
405
406 /* First try to get them from the registry */
407 if (!HCR_GetFolderAttributes(pidl, pdwAttributes))
408 {
409 /* We couldn't get anything */
410 *pdwAttributes = 0;
411 }
412
413 /* Items have more attributes when on desktop */
415 {
416 *pdwAttributes |= (dwAttributes & (SFGAO_CANLINK|SFGAO_CANDELETE|SFGAO_CANRENAME|SFGAO_HASPROPSHEET));
417 }
418
419 /* In any case, links can be created */
420 *pdwAttributes |= (dwAttributes & SFGAO_CANLINK);
421 return S_OK;
422}
423
425{
427 if (IsEqualGUID(clsid, CLSID_Printers))
428 return TRUE;
429 if (IsEqualGUID(clsid, CLSID_NetworkConnections))
430 return TRUE;
431 FIXME("Check registry\n");
432 return TRUE;
433}
434
436 ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes)
437{
438 if (!ppidl)
439 return E_INVALIDARG;
440
441 *ppidl = NULL;
442
443 if (!lpszDisplayName)
444 return E_INVALIDARG;
445
446 if (lpszDisplayName[0] != L':' || lpszDisplayName[1] != L':')
447 {
448 FIXME("What should we do here?\n");
449 return E_FAIL;
450 }
451
452 LPWSTR pch, pchNextOfComma = NULL;
453 for (pch = &lpszDisplayName[2]; *pch && *pch != L'\\'; ++pch)
454 {
455 if (*pch == L',' && !pchNextOfComma)
456 pchNextOfComma = pch + 1;
457 }
458
459 CLSID clsid;
460 if (!GUIDFromStringW(&lpszDisplayName[2], &clsid))
461 return CO_E_CLASSSTRING;
462
463 if (pchNextOfComma)
464 {
465 FIXME("Delegate folder\n");
466 return E_FAIL;
467 }
468
469 CComHeapPtr<ITEMIDLIST> pidlTemp(CreateRegItem(GetPidlType(), clsid));
470 if (!pidlTemp)
471 return E_OUTOFMEMORY;
472
473 if (!_IsInNameSpace(pidlTemp) && !(BindCtx_GetMode(pbc, 0) & STGM_CREATE))
474 return E_INVALIDARG;
475
476 *ppidl = pidlTemp.Detach();
477
478 if (!*pch)
479 {
480 if (pdwAttributes && *pdwAttributes)
481 GetGuidItemAttributes(*ppidl, pdwAttributes);
482
483 return S_OK;
484 }
485
486 HRESULT hr = SHELL32_ParseNextElement(this, hwndOwner, pbc, ppidl, pch + 1, pchEaten,
487 pdwAttributes);
488 if (FAILED(hr))
489 {
490 ILFree(*ppidl);
491 *ppidl = NULL;
492 }
493 return hr;
494}
495
496HRESULT WINAPI CRegFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
497{
498 return ShellObjectCreatorInit<CRegFolderEnum>(m_pInfo, m_pOuterFolder, dwFlags,
499 IID_PPV_ARG(IEnumIDList, ppEnumIDList));
500}
501
503{
504 CComPtr<IPersistFolder> pFolder;
505 HRESULT hr;
506
507 if (!ppvOut || !pidl || !pidl->mkid.cb)
508 return E_INVALIDARG;
509
510 *ppvOut = NULL;
511
512 GUID *pGUID = _ILGetGUIDPointer(pidl);
513 if (!pGUID)
514 {
515 ERR("CRegFolder::BindToObject called for non guid item!\n");
516 return E_INVALIDARG;
517 }
518
519 hr = SHELL32_BindToSF(m_pidlRoot, NULL, pidl, pGUID, riid, ppvOut);
521 return hr;
522
523 return S_OK;
524}
525
527{
528 return E_NOTIMPL;
529}
530
532{
533 LPPIDLDATA p1 = (LPPIDLDATA)pidl1->mkid.abID;
534 LPPIDLDATA p2 = (LPPIDLDATA)pidl2->mkid.abID;
535 int Order1 = p1->u.guid.uSortOrder > 0x40 ? p1->u.guid.uSortOrder : GetRegItemOrder(pidl1);
536 int Order2 = p2->u.guid.uSortOrder > 0x40 ? p2->u.guid.uSortOrder : GetRegItemOrder(pidl2);
537 int Cmp = Order1 - Order2;
538 if (Cmp != 0)
539 return MAKE_COMPARE_HRESULT(Cmp);
540 return SHELL32_CompareDetails(this, COL_NAME, pidl1, pidl2);
541}
542
544{
545 if (!pidl1 || !pidl2 || pidl1->mkid.cb == 0 || pidl2->mkid.cb == 0)
546 {
547 ERR("Got an empty pidl!\n");
548 return E_INVALIDARG;
549 }
550
551 GUID const *clsid1 = _ILGetGUIDPointer (pidl1);
552 GUID const *clsid2 = _ILGetGUIDPointer (pidl2);
553
554 if (!clsid1 && !clsid2)
555 {
556 ERR("Got no guid pidl!\n");
557 return E_INVALIDARG;
558 }
559 else if (clsid1 && clsid2)
560 {
561 if ((lParam & SHCIDS_COLUMNMASK) == COL_NAME && !(lParam & SHCIDS_CANONICALONLY))
562 {
563 HRESULT hrCmpOrder = CompareRegItemsSortOrder(pidl1, pidl2);
564 if (hrCmpOrder && SUCCEEDED(hrCmpOrder))
565 return hrCmpOrder;
566 }
567 if (memcmp(clsid1, clsid2, sizeof(GUID)) == 0)
568 return SHELL32_CompareChildren(this, lParam, pidl1, pidl2);
569
570 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
571 }
572
573 /* Guid folders come first compared to everything else */
574 /* And Drives come before folders in My Computer */
576 return MAKE_COMPARE_HRESULT(clsid1 ? 1 : -1);
577 else
578 return MAKE_COMPARE_HRESULT(clsid1 ? -1 : 1);
579}
580
582{
583 return E_NOTIMPL;
584}
585
587{
588 if (!rgfInOut || !cidl || !apidl)
589 return E_INVALIDARG;
590
591 if (*rgfInOut == 0)
592 *rgfInOut = ~0;
593
594 while(cidl > 0 && *apidl)
595 {
596 if (_ILIsSpecialFolder(*apidl))
597 GetGuidItemAttributes(*apidl, rgfInOut);
598 else
599 ERR("Got unknown pidl\n");
600 apidl++;
601 cidl--;
602 }
603
604 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
605 *rgfInOut &= ~SFGAO_VALIDATE;
606
607 return S_OK;
608}
609
611 REFIID riid, UINT * prgfInOut, LPVOID * ppvOut)
612{
613 LPVOID pObj = NULL;
615
616 if (!ppvOut)
617 return hr;
618
619 *ppvOut = NULL;
620
621 if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
622 {
623 hr = CGuidItemExtractIcon_CreateInstance(apidl[0], riid, &pObj);
624 }
625 else if (IsEqualIID (riid, IID_IContextMenu) && (cidl >= 1))
626 {
627 if (!_ILGetGUIDPointer (apidl[0]))
628 {
629 ERR("Got non guid item!\n");
630 return E_FAIL;
631 }
632
633 hr = CRegItemContextMenu_CreateInstance(m_pidlRoot, hwndOwner, cidl, apidl, static_cast<IShellFolder*>(this), (IContextMenu**)&pObj);
634 }
635 else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
636 {
637 hr = IDataObject_Constructor (hwndOwner, m_pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
638 }
639 else
640 {
642 }
643
644 *ppvOut = pObj;
645 return hr;
646
647}
648
650{
651 if (!strRet || (!_ILIsSpecialFolder(pidl) && pidl != NULL))
652 return E_INVALIDARG;
653
654 if (!pidl || !pidl->mkid.cb)
655 {
657 {
659 {
660 TRACE("GDNO returning INFOLDER instead of %#x\n", GET_SHGDN_RELATION(dwFlags));
661 }
662 LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc((2 + 38 + 1) * sizeof(WCHAR));
663 if (!pszPath)
664 return E_OUTOFMEMORY;
665 /* parsing name like ::{...} */
666 pszPath[0] = ':';
667 pszPath[1] = ':';
668 SHELL32_GUIDToStringW(m_pInfo->clsid, &pszPath[2]);
669 strRet->uType = STRRET_WSTR;
670 strRet->pOleStr = pszPath;
671 return S_OK;
672 }
673 else
674 {
675 BOOL bRet;
676 WCHAR wstrName[MAX_PATH+1];
677 bRet = HCR_GetClassNameW(m_pInfo->clsid, wstrName, MAX_PATH);
678 if (!bRet)
679 return E_FAIL;
680
681 return SHSetStrRet(strRet, wstrName);
682 }
683 }
684
685 HRESULT hr;
686 GUID const *clsid = _ILGetGUIDPointer (pidl);
687
688 /* First of all check if we need to query the name from the child item */
691 {
692 int bWantsForParsing = FALSE;
693
694 /*
695 * We can only get a filesystem path from a shellfolder if the
696 * value WantsFORPARSING in CLSID\\{...}\\shellfolder exists.
697 *
698 * Exception: The MyComputer folder doesn't have this key,
699 * but any other filesystem backed folder it needs it.
700 */
701 if (IsEqualIID (*clsid, CLSID_MyComputer))
702 {
703 bWantsForParsing = TRUE;
704 }
705 else
706 {
707 HKEY hkeyClass;
708 if (HCR_RegOpenClassIDKey(*clsid, &hkeyClass))
709 {
710 LONG res = SHGetValueW(hkeyClass, L"Shellfolder", L"WantsForParsing", NULL, NULL, NULL);
711 bWantsForParsing = (res == ERROR_SUCCESS);
712 RegCloseKey(hkeyClass);
713 }
714 }
715
716 if (bWantsForParsing)
717 {
718 /*
719 * we need the filesystem path to the destination folder.
720 * Only the folder itself can know it
721 */
722 return SHELL32_GetDisplayNameOfChild (this, pidl, dwFlags, strRet);
723 }
724 }
725
726 /* Allocate the buffer for the result */
727 SIZE_T cchPath = MAX_PATH + 1;
728 LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc(cchPath * sizeof(WCHAR));
729 if (!pszPath)
730 return E_OUTOFMEMORY;
731
732 hr = S_OK;
733
735 {
736 SIZE_T pathlen = 0;
737 PWCHAR pItemName = pszPath; // GET_SHGDN_RELATION(dwFlags) == SHGDN_INFOLDER
739 {
740 hr = StringCchCopyW(pszPath, cchPath, GetParsingPath());
741 if (SUCCEEDED(hr))
742 {
743 pathlen = wcslen(pszPath);
744 pItemName = &pszPath[pathlen];
745 if (pathlen)
746 {
747 if (++pathlen < cchPath)
748 *pItemName++ = L'\\';
749 else
751 }
752 }
753 }
754
755 if (SUCCEEDED(hr) && pathlen + 2 + 38 + 1 < cchPath)
756 {
757 /* parsing name like ::{...} */
758 pItemName[0] = L':';
759 pItemName[1] = L':';
760 SHELL32_GUIDToStringW(*clsid, &pItemName[2]);
761 }
762 else
763 {
765 }
766 }
767 else
768 {
769 /* user friendly name */
770 if (!HCR_GetClassNameW(*clsid, pszPath, cchPath))
771 hr = E_FAIL;
772 }
773
774 if (SUCCEEDED(hr))
775 {
776 strRet->uType = STRRET_WSTR;
777 strRet->pOleStr = pszPath;
778 }
779 else
780 {
781 CoTaskMemFree(pszPath);
782 }
783
784 return hr;
785}
786
787HRESULT WINAPI CRegFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, /* simple pidl */
788 LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut)
789{
790 GUID const *clsid = IsRegItem(pidl);
791 WCHAR szName[100];
792
793 if (!lpName || (*lpName && IsIllegalFsFileName(lpName))) // Note: Must allow empty name
794 return E_INVALIDARG;
795
796 if (!clsid)
797 {
798 ERR("Pidl is not reg item!\n");
799 return E_FAIL;
800 }
801 FormatGUIDKey(szName, _countof(szName), L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\%s", clsid);
802
803 BOOL bEmpty = StrIsNullOrEmpty(lpName); // Empty resets to the default name
804 DWORD cbData = (wcslen(lpName) + 1) * sizeof(WCHAR);
807
808 if (res == ERROR_SUCCESS)
809 {
810 HRESULT hr = pPidlOut ? SHILClone(pidl, pPidlOut) : S_OK; // Copy the PIDL before SHChangeNotify
811 PIDLIST_ABSOLUTE pidlAbs;
813 {
815 ILFree(pidlAbs);
816 }
817 return hr;
818 }
819 return E_FAIL;
820}
821
822
824{
825 return E_NOTIMPL;
826}
827
829{
830 return E_NOTIMPL;
831}
832
834{
835 if (pSort)
836 *pSort = 0;
837 if (pDisplay)
838 *pDisplay = 0;
839
840 return S_OK;
841}
842
844{
845 if (iColumn >= REGFOLDERCOLUMNCOUNT)
846 return E_INVALIDARG;
848 return S_OK;
849}
850
852{
853 const CLSID *pCLSID = IsRegItem(pidl);
854 if (!pCLSID)
855 return E_INVALIDARG;
856 if (pscid->fmtid == FMTID_ShellDetails)
857 {
858 switch (pscid->pid)
859 {
862 }
863 }
864 return SH32_GetDetailsOfPKeyAsVariant(this, pidl, pscid, pv, TRUE);
865}
866
868{
869 if (!psd)
870 return E_INVALIDARG;
871
872 if (!pidl)
873 {
874 TRACE("CRegFolder has no column info\n");
875 return E_INVALIDARG;
876 }
877
878 GUID const *clsid = _ILGetGUIDPointer (pidl);
879
880 if (!clsid)
881 {
882 ERR("Pidl is not reg item!\n");
883 return E_INVALIDARG;
884 }
885
886 switch(iColumn)
887 {
888 case COL_NAME:
889 return GetDisplayNameOf(pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
890 case COL_TYPE:
891 return SHSetStrRet(&psd->str, IDS_SYSTEMFOLDER);
892 case COL_INFOTIP:
893 HKEY hKey;
895 return SHSetStrRetEmpty(&psd->str);
896
897 psd->str.cStr[0] = 0x00;
898 psd->str.uType = STRRET_CSTR;
899 RegLoadMUIStringA(hKey, "InfoTip", psd->str.cStr, MAX_PATH, NULL, 0, NULL);
901 return S_OK;
902 default:
903 /* Return an empty string when we are asked for a column we don't support.
904 Only the regfolder is supposed to do this as it supports fewer columns compared to other folders
905 and its contents are supposed to be presented alongside items that support more columns. */
906 return SHSetStrRetEmpty(&psd->str);
907 }
908 return E_FAIL;
909}
910
912{
913 switch (column)
914 {
915 case COL_NAME: return MakeSCID(*pscid, FMTID_Storage, PID_STG_NAME);
916 case COL_TYPE: return MakeSCID(*pscid, FMTID_Storage, PID_STG_STORAGETYPE);
917 case COL_INFOTIP: return MakeSCID(*pscid, FMTID_SummaryInformation, PIDSI_COMMENTS);
918 }
919 return E_INVALIDARG;
920}
921
924{
926 return SHELL32_DefaultContextMenuCallBack(psf, pdtobj, uMsg);
927
928 PIDLIST_ABSOLUTE pidlFolder;
929 PUITEMID_CHILD *apidl;
930 UINT cidl;
931 HRESULT hr = SH_GetApidlFromDataObject(pdtobj, &pidlFolder, &apidl, &cidl);
933 return hr;
934
935 const CLSID* pCLSID;
936 CRegFolder *pRegFolder = static_cast<CRegFolder*>(psf);
937 const REQUIREDREGITEM* pRequired = pRegFolder->IsRequiredItem(apidl[0]);
938 if (pRequired && pRequired->pszCpl)
939 {
941 wsprintfW(buf, L"%hs", const_cast<LPCSTR>(pRequired->pszCpl));
943 }
944#if 0 // Should never happen, CDesktopFolder.cpp handles this
945 else if (_ILIsDesktop(pidlFolder) && _ILIsDesktop(apidl[0]))
946 {
948 }
949#endif
950 else if ((pCLSID = pRegFolder->IsRegItem(apidl[0])) != NULL)
951 {
952 if (CLSID_MyDocuments != *pCLSID)
953 {
955 }
956 else
957 {
958 FIXME("ROS MyDocs must implement IShellPropSheetExt\n");
959 hr = S_FALSE; // Just display the filesystem properties
960 }
961 }
962 else
963 {
964 hr = S_FALSE; // Tell the caller to run the default action
965 }
966
967 SHFree(pidlFolder);
968 _ILFreeaPidl(apidl, cidl);
969 return hr;
970}
971
974{
975 HKEY hKeys[3];
976 UINT cKeys = 0;
977
978 const GUID *pGuid = _ILGetGUIDPointer(apidl[0]);
979 if (pGuid)
980 {
981 WCHAR key[sizeof("CLSID\\") + 38];
982 wcscpy(key, L"CLSID\\");
983 StringFromGUID2(*pGuid, &key[6], 39);
984 AddClassKeyToArray(key, hKeys, &cKeys);
985 }
986
987 // FIXME: CRegFolder should be aggregated by its outer folder and should
988 // provide the attributes for all required non-registry folders.
989 // It currently does not so we have to ask the outer folder ourself so
990 // that we get the correct attributes for My Computer etc.
991 CComPtr<IShellFolder> pOuterSF;
992 SHBindToObject(NULL, pidlFolder, IID_PPV_ARG(IShellFolder, &pOuterSF));
993
994 SFGAOF att = (psf && cidl) ? SHGetAttributes(pOuterSF ? pOuterSF.p : psf, apidl[0], SFGAO_FOLDER) : 0;
995 if ((att & SFGAO_FOLDER) && (!pGuid || !HasCLSIDShellFolderValue(*pGuid, L"HideFolderVerbs")))
996 AddClassKeyToArray(L"Folder", hKeys, &cKeys);
997
998 return CDefFolderMenu_Create2(pidlFolder, hwnd, cidl, apidl, psf, RegFolderContextMenuCallback, cKeys, hKeys, ppcm);
999}
1000
1001/* In latest windows version this is exported but it takes different arguments! */
1003{
1004 return ShellObjectCreatorInit<CRegFolder>(pInit, pidlRoot, riid, ppv);
1005}
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)
static LPITEMIDLIST CreateRegItem(PIDLTYPE type, REFCLSID clsid, int order=-1)
Definition: CRegFolder.cpp:70
static HRESULT CALLBACK RegFolderContextMenuCallback(IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CRegFolder.cpp:922
static HRESULT CRegItemContextMenu_CreateInstance(PCIDLIST_ABSOLUTE pidlFolder, HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IShellFolder *psf, IContextMenu **ppcm)
Definition: CRegFolder.cpp:972
static UINT GetRegItemCLSIDOffset(PIDLTYPE type)
Definition: CRegFolder.cpp:57
HRESULT CGuidItemExtractIcon_CreateInstance(LPCITEMIDLIST pidl, REFIID iid, LPVOID *ppvOut)
Definition: CRegFolder.cpp:141
REGFOLDERCOLUMNINDEX
Definition: CRegFolder.cpp:314
@ REGFOLDERCOLUMNCOUNT
Definition: CRegFolder.cpp:318
@ COL_INFOTIP
Definition: CRegFolder.cpp:317
@ COL_NAME
Definition: CRegFolder.cpp:315
@ COL_TYPE
Definition: CRegFolder.cpp:316
static BYTE GetRegItemOrder(REFCLSID clsid)
Definition: CRegFolder.cpp:62
static DWORD SHELL_QueryCLSIDValue(_In_ REFCLSID clsid, _In_opt_ LPCWSTR SubKey, _In_opt_ LPCWSTR Value, _In_opt_ PVOID pData, _In_opt_ PDWORD pSize)
Definition: CRegFolder.cpp:38
HRESULT CRegFolder_CreateInstance(PREGFOLDERINITDATA pInit, LPCITEMIDLIST pidlRoot, REFIID riid, void **ppv)
HRESULT FormatGUIDKey(LPWSTR KeyName, SIZE_T KeySize, LPCWSTR RegPath, const GUID *riid)
Definition: CRegFolder.cpp:31
static bool HasCLSIDShellFolderValue(REFCLSID clsid, LPCWSTR Value)
Definition: CRegFolder.cpp:52
PRTL_UNICODE_STRING_BUFFER Path
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 FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
#define STDMETHOD(m)
Definition: basetyps.h:62
#define RegCloseKey(hKey)
Definition: registry.h:49
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
BOOL AddToEnumList(LPITEMIDLIST pidl)
const CLSID * GetPidlClsid(PCUITEMID_CHILD pidl)
Definition: CRegFolder.cpp:235
HRESULT AddItemsFromKey(IShellFolder *pSF, HKEY hkey_root, LPCWSTR szRepPath)
Definition: CRegFolder.cpp:272
HRESULT Initialize(const REGFOLDERINFO *pInfo, IShellFolder *pSF, DWORD dwFlags)
Definition: CRegFolder.cpp:243
BOOL HasItemWithCLSID(LPCITEMIDLIST pidl)
Definition: CRegFolder.cpp:236
STDMETHOD() EnumSearches(IEnumExtraSearch **ppenum) override
Definition: CRegFolder.cpp:828
STDMETHOD() MapColumnToSCID(UINT column, SHCOLUMNID *pscid) override
Definition: CRegFolder.cpp:911
STDMETHOD() GetDefaultSearchGUID(GUID *pguid) override
Definition: CRegFolder.cpp:823
BOOL _IsInNameSpace(_In_ LPCITEMIDLIST pidl)
Definition: CRegFolder.cpp:424
STDMETHOD() CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
Definition: CRegFolder.cpp:543
STDMETHOD() GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override
Definition: CRegFolder.cpp:851
STDMETHOD() CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override
Definition: CRegFolder.cpp:581
const REQUIREDREGITEM * IsRequiredItem(LPCITEMIDLIST pidl) const
Definition: CRegFolder.cpp:339
STDMETHOD() SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
Definition: CRegFolder.cpp:787
STDMETHOD() GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override
Definition: CRegFolder.cpp:833
CComHeapPtr< ITEMIDLIST > m_pidlRoot
Definition: CRegFolder.cpp:328
STDMETHOD() ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes) override
Definition: CRegFolder.cpp:435
STDMETHOD() GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags) override
Definition: CRegFolder.cpp:843
STDMETHOD() BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: CRegFolder.cpp:502
STDMETHOD() EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override
Definition: CRegFolder.cpp:496
HRESULT WINAPI Initialize(PREGFOLDERINITDATA pInit, LPCITEMIDLIST pidlRoot)
Definition: CRegFolder.cpp:390
STDMETHOD() GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
Definition: CRegFolder.cpp:649
STDMETHOD() GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override
Definition: CRegFolder.cpp:867
IShellFolder * m_pOuterFolder
Definition: CRegFolder.cpp:327
HRESULT GetGuidItemAttributes(LPCITEMIDLIST pidl, LPDWORD pdwAttributes)
Definition: CRegFolder.cpp:402
STDMETHOD() GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
Definition: CRegFolder.cpp:586
STDMETHOD() GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override
Definition: CRegFolder.cpp:610
HRESULT CompareRegItemsSortOrder(PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2)
Definition: CRegFolder.cpp:531
STDMETHOD() BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: CRegFolder.cpp:526
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
wcscpy
#define CHARS_IN_GUID
#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 SHCIDS_CANONICALONLY
Definition: shobjidl.idl:226
#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:65
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
Definition: compobj.c:2338
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
Definition: compobj.c:2434
#define RRF_RT_REG_SZ
Definition: driver.c:575
#define SHELL_ExecuteControlPanelCPL(hwnd, cpl)
Definition: precomp.h:188
DWORD SHGetAttributes(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwAttributes)
Definition: utils.cpp:425
DWORD BindCtx_GetMode(_In_ IBindCtx *pbc, _In_ DWORD dwDefault)
Definition: utils.cpp:278
EXTERN_C HRESULT SHBindToObject(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:370
HRESULT SHELL32_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdo, UINT msg)
Definition: shlfolder.cpp:613
HRESULT SHILClone(_In_opt_ LPCITEMIDLIST pidl, _Outptr_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:133
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:304
DWORD WINAPI SHDeleteValueW(HKEY hKey, LPCWSTR lpszSubKey, LPCWSTR lpszValue)
Definition: reg.c:1762
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
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
Definition: ebrowser.c:83
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
WCHAR swShell32Name[MAX_PATH]
Definition: folders.cpp:22
PWDFDEVICE_INIT pInit
FxAutoRegKey hKey
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLuint res
Definition: glext.h:9613
GLintptr offset
Definition: glext.h:5920
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint GLdouble GLdouble GLint GLint order
Definition: glext.h:11194
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
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
ULONG SFGAOF
Definition: shobjidl.idl:222
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
HRESULT SHELL32_ShowShellExtensionProperties(const CLSID *pClsid, IDataObject *pDO)
Definition: item_prop.cpp:196
#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 PT_COMPUTER_REGITEM
Definition: lnktool.cpp:39
#define pch(ap)
Definition: match.c:418
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
static IParseDisplayName ParseDisplayName
Definition: moniker.c:816
static LPOLESTR
Definition: stg_prop.c:27
static SHCONTF
Definition: ordinal.c:64
static ATOM item
Definition: dde.c:856
REFCLSID clsid
Definition: msctf.c:82
IID CLSID
Definition: mstsclib_i.c:62
unsigned int UINT
Definition: ndis.h:50
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define PID_STG_STORAGETYPE
Definition: ntquery.h:50
#define PID_STG_NAME
Definition: ntquery.h:56
#define L(x)
Definition: ntvdm.h:50
#define STGM_CREATE
Definition: objbase.h:926
interface IBindCtx * LPBC
Definition: objfwd.h:18
const FMTID FMTID_SummaryInformation
const GUID IID_IDataObject
BOOL WINAPI GUIDFromStringW(_In_ PCWSTR psz, _Out_ LPGUID pguid)
DWORD * PDWORD
Definition: pedump.c:68
long LONG
Definition: pedump.c:60
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1044
BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2119
BOOL _ILIsBitBucket(LPCITEMIDLIST pidl)
Definition: pidl.c:2108
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
Definition: pidl.c:2607
IID * _ILGetGUIDPointer(LPCITEMIDLIST pidl)
Definition: pidl.c:2407
BYTE PIDLTYPE
Definition: pidl.h:156
struct tagPIDLDATA * LPPIDLDATA
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
#define REFCLSID
Definition: guiddef.h:117
BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len)
Definition: classes.c:422
BOOL HCR_GetFolderAttributes(LPCITEMIDLIST pidlFolder, LPDWORD pdwAttributes)
Definition: classes.c:590
BOOL HCR_GetIconW(LPCWSTR szClass, LPWSTR szDest, LPCWSTR szName, DWORD len, int *picon_idx)
Definition: classes.c:314
static HRESULT SHELL_CreateSHDESCRIPTIONID(VARIANT *pVar, DWORD Id, const CLSID *pCLSID)
Definition: shell32_main.h:274
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:663
HRESULT SH32_GetDetailsOfPKeyAsVariant(IShellFolder2 *pSF, PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pVar, BOOL UseFsColMap)
Definition: shlfolder.cpp:133
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:293
HRESULT SHELL_CreateAbsolutePidl(IShellFolder *pSF, PCUIDLIST_RELATIVE pidlChild, PIDLIST_ABSOLUTE *ppPidl)
Definition: shlfolder.cpp:142
#define SHFSF_COL_COMMENT
Definition: shfldr.h:49
static HRESULT MakeSCID(SHCOLUMNID &scid, REFCLSID fmtid, UINT pid)
Definition: shfldr.h:99
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:331
#define IS_SHGDN_FOR_PARSING(flags)
Definition: shfldr.h:78
#define SHFSF_COL_NAME
Definition: shfldr.h:44
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:349
static __inline int SHELL32_GUIDToStringW(REFGUID guid, LPWSTR str)
Definition: shfldr.h:162
static SFGAOF SHELL_CreateFolderEnumItemAttributeQuery(SHCONTF Flags, BOOL ForRegItem)
Definition: shfldr.h:82
static BOOL IsIllegalFsFileName(PCWSTR Name)
Definition: shfldr.h:178
#define SHFSF_COL_TYPE
Definition: shfldr.h:46
LSTATUS AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:408
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:372
HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE *ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
Definition: shlfolder.cpp:499
BOOL HCR_RegOpenClassIDKey(REFIID riid, HKEY *hkey)
Definition: classes.c:253
BOOL SHELL_IncludeItemInFolderEnum(IShellFolder *pSF, PCUITEMID_CHILD pidl, SFGAOF Query, SHCONTF Flags)
Definition: shlfolder.cpp:41
HRESULT SHELL32_ParseNextElement(IShellFolder2 *psf, HWND hwndOwner, LPBC pbc, LPITEMIDLIST *pidlInOut, LPOLESTR szNext, DWORD *pEaten, DWORD *pdwAttributes)
Definition: shlfolder.cpp:204
HRESULT hr
Definition: shlfolder.c:183
#define PID_DESCRIPTIONID
Definition: shlguid.h:171
#define SHCNE_UPDATEITEM
Definition: shlobj.h:1911
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2620
#define SHDID_ROOT_REGITEM
Definition: shlobj.h:1464
#define SHCNF_IDLIST
Definition: shlobj.h:1929
#define IDS_SYSTEMFOLDER
Definition: shresdef.h:376
#define IDI_SHELL_DESKTOP
Definition: shresdef.h:613
#define IDI_SHELL_DOCUMENT
Definition: shresdef.h:579
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:70
#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
void InitializeFolderInfo(const REGFOLDERINFO *pInfo)
Definition: CRegFolder.cpp:100
const CLSID * IsRegItem(LPCITEMIDLIST pidl) const
Definition: CRegFolder.cpp:105
const REQUIREDREGITEM & GetAt(size_t i) const
Definition: CRegFolder.cpp:138
UINT GetRequiredItemsCount() const
Definition: CRegFolder.cpp:137
LPITEMIDLIST CreateItem(size_t i) const
Definition: CRegFolder.cpp:122
const REGFOLDERINFO * m_pInfo
Definition: CRegFolder.cpp:98
PIDLTYPE GetPidlType() const
Definition: CRegFolder.cpp:136
LPCWSTR GetParsingPath() const
Definition: CRegFolder.cpp:134
UINT GetCLSIDOffset() const
Definition: CRegFolder.cpp:135
WORD GetRegItemOrder(LPCITEMIDLIST pidl) const
Definition: CRegFolder.cpp:128
STRRET str
Definition: shtypes.idl:108
const REQUIREDREGITEM * Items
Definition: shfldr.h:62
REFCLSID clsid
Definition: shfldr.h:63
LPCWSTR pszParsingPath
Definition: shfldr.h:64
LPCWSTR pszEnumKeyName
Definition: shfldr.h:65
BYTE Count
Definition: shfldr.h:61
PIDLTYPE PidlType
Definition: shfldr.h:60
LPCSTR pszCpl
Definition: shfldr.h:54
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
union tagPIDLDATA::@596 u
struct tagGUIDStruct guid
Definition: pidl.h:233
#define max(a, b)
Definition: svc.c:63
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
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
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
#define ZeroMemory
Definition: winbase.h:1744
_In_ LPCSTR lpName
Definition: winbase.h:2821
_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 RRF_RT_ANY
Definition: winreg.h:64
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
int WINAPIV wsprintfW(_Out_ LPWSTR, _In_ _Printf_format_string_ LPCWSTR,...)
static void Initialize()
Definition: xlate.c:212
#define IID_PPV_ARG(Itype, ppType)
const char * LPCSTR
Definition: xmlstorage.h:183
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
unsigned char BYTE
Definition: xxhash.c:193