ReactOS 0.4.17-dev-1196-gb6224c3
CDesktopFolder.cpp
Go to the documentation of this file.
1/*
2 * Virtual Desktop Folder
3 *
4 * Copyright 1997 Marcus Meissner
5 * Copyright 1998, 1999, 2002 Juergen Schmied
6 * Copyright 2009 Andrew Hill
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 */
22
23#include <precomp.h>
24#include "CFSFolder.h" // Only for CFSFolder::*FSColumn* helpers!
25
27
29
31{
32 { CLSID_MyComputer, "sysdm.cpl", REGITEMORDER_MYCOMPUTER },
33 { CLSID_NetworkPlaces, "ncpa.cpl", REGITEMORDER_NETHOOD },
34 { CLSID_Internet, "inetcpl.cpl", REGITEMORDER_INTERNET },
35};
37{
40 CLSID_ShellDesktop,
41 L"",
42 L"Desktop",
43};
44
46{
47 return cidl == 0 || (cidl == 1 && apidl && _ILIsEmpty(apidl[0]));
48}
49
50static const CLSID* IsRegItem(PCUITEMID_CHILD pidl)
51{
52 if (pidl && pidl->mkid.cb == 2 + 2 + sizeof(CLSID) && pidl->mkid.abID[0] == PT_DESKTOP_REGITEM)
53 return (const CLSID*)(&pidl->mkid.abID[2]);
54 return NULL;
55}
56
58{
59 const CLSID *pClass = IsRegItem(pidl);
60 return pClass && *pClass == clsid;
61}
62
63static inline void MarkAsCommonItem(LPITEMIDLIST pidl)
64{
65 ASSERT(_ILGetFSType(pidl) & PT_FS);
66 ((PIDLDATA*)pidl->mkid.abID)->type |= PT_FS_COMMON_FLAG;
67}
68
71 HWND hwndOwner,
72 LPBC pbc,
73 LPOLESTR lpszDisplayName,
74 DWORD *pchEaten,
75 PIDLIST_RELATIVE *ppidl,
76 DWORD *pdwAttributes)
77{
78 LPWSTR pch;
79 INT cch, csidl;
81 PARSEDURLW ParsedURL = { sizeof(ParsedURL) };
82
83 ::ParseURLW(lpszDisplayName, &ParsedURL);
84
85 DWORD attrs = (pdwAttributes ? *pdwAttributes : 0) | SFGAO_STREAM;
86 if (ParsedURL.pszSuffix[0] == L':' && ParsedURL.pszSuffix[1] == L':') // It begins from "::"
87 {
88 CComPtr<IShellFolder> psfDesktop;
89 hr = SHGetDesktopFolder(&psfDesktop);
90 if (SUCCEEDED(hr))
91 {
92 CComPtr<IBindCtx> pBindCtx;
93 hr = ::CreateBindCtx(0, &pBindCtx);
94 if (SUCCEEDED(hr))
95 {
96 BIND_OPTS BindOps = { sizeof(BindOps) };
97 BindOps.grfMode = STGM_CREATE;
98 pBindCtx->SetBindOptions(&BindOps);
99 hr = psfDesktop->ParseDisplayName(hwndOwner, pBindCtx,
100 (LPWSTR)ParsedURL.pszSuffix,
101 pchEaten, ppidl, &attrs);
102 }
103 }
104 }
105 else
106 {
107 csidl = Shell_ParseSpecialFolder(ParsedURL.pszSuffix, &pch, &cch);
108 if (csidl == -1)
109 {
110 ERR("\n");
111 return hr;
112 }
113
114 CComHeapPtr<ITEMIDLIST> pidlLocation;
115 hr = SHGetFolderLocation(hwndOwner, (csidl | CSIDL_FLAG_CREATE), NULL, 0, &pidlLocation);
117 return hr;
118
119 if (pch && *pch)
120 {
121 CComPtr<IShellFolder> psfFolder;
122 hr = SHBindToObject(NULL, pidlLocation, NULL, IID_PPV_ARG(IShellFolder, &psfFolder));
123 if (SUCCEEDED(hr))
124 {
125 CComHeapPtr<ITEMIDLIST> pidlNew;
126 hr = psfFolder->ParseDisplayName(hwndOwner, pbc, pch, pchEaten, &pidlNew, &attrs);
127 if (SUCCEEDED(hr))
128 {
129 hr = SHILCombine(pidlLocation, pidlNew, ppidl);
130 if (pchEaten)
131 *pchEaten += cch;
132 }
133 }
134 }
135 else
136 {
137 if (attrs)
138 hr = SHGetNameAndFlagsW(pidlLocation, 0, NULL, 0, &attrs);
139
140 if (SUCCEEDED(hr))
141 {
142 if (pchEaten)
143 *pchEaten = cch;
144 *ppidl = pidlLocation.Detach();
145 }
146 }
147 }
148
149 // FIXME: SHWindowsPolicy
150 if (SUCCEEDED(hr) && (attrs & SFGAO_STREAM) &&
151 !BindCtx_ContainsObject(pbc, STR_PARSE_SHELL_PROTOCOL_TO_FILE_OBJECTS))
152 {
153 ILFree(*ppidl);
154 *ppidl = NULL;
156 }
157
158 if (pdwAttributes)
159 *pdwAttributes = attrs;
160
161 // FIXME: SHWindowsPolicy
164
165 return hr;
166}
167
170 HWND hwndOwner,
171 LPBC pbc,
172 LPOLESTR lpszDisplayName,
173 DWORD *pchEaten,
174 PIDLIST_RELATIVE *ppidl,
175 DWORD *pdwAttributes)
176{
177 FIXME("\n");
178 return E_NOTIMPL; // FIXME
179}
180
181/*
182CDesktopFolder should create two file system folders internally, one representing the
183user's desktop folder, and the other representing the common desktop folder. It should
184also create a CRegFolder to represent the virtual items that exist only in the registry.
185The CRegFolder is aggregated by the CDesktopFolder, and queries for the CLSID_IShellFolder,
186CLSID_IShellFolder2, or CLSID_IShellIconOverlay interfaces prefer the CRegFolder
187implementation.
188The CDesktopFolderEnum class should create two enumerators, one for each of the file
189system folders, and enumerate the contents of each folder. Since the CRegFolder
190implementation of IShellFolder::EnumObjects enumerates the virtual items, the
191CDesktopFolderEnum is only responsible for returning the physical items.
192CDesktopFolderViewCB is responsible for filtering hidden regitems.
193The enumerator always shows My Computer.
194*/
195
196/* Undocumented functions from shdocvw */
197extern "C" HRESULT WINAPI IEParseDisplayNameWithBCW(DWORD codepage, LPCWSTR lpszDisplayName, LPBC pbc, LPITEMIDLIST *ppidl);
198
200 public CEnumIDListBase
201{
202 private:
203// CComPtr fDesktopEnumerator;
204// CComPtr fCommonDesktopEnumerator;
205 public:
206
208 IEnumIDList *pDesktopEnumerator, IEnumIDList *pCommonDesktopEnumerator)
209 {
210 TRACE("(%p)->(flags=0x%08x)\n", this, dwFlags);
211
212 AppendItemsFromEnumerator(pRegEnumerator);
213
214 /* Enumerate the items in the two fs folders */
215 AppendItemsFromEnumerator(pDesktopEnumerator);
216 ENUMLIST *pCommon = this->mpLast;
217 AppendItemsFromEnumerator(pCommonDesktopEnumerator);
218 if (pCommon != this->mpLast) // Any common items added?
219 {
220 ENUMLIST fake;
221 if (!pCommon) // In the unlikely case that there are no RegItems nor user items
222 {
223 fake.pNext = this->mpFirst;
224 pCommon = &fake;
225 }
226 while ((pCommon = pCommon->pNext) != NULL)
227 MarkAsCommonItem(pCommon->pidl);
228 }
229 return S_OK;
230 }
231
233 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
235};
236
237int SHELL_ConfirmMsgBox(HWND hWnd, LPWSTR lpszText, LPWSTR lpszCaption, HICON hIcon, BOOL bYesToAll);
238
240 SFGAO_HASSUBFOLDER | SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR |
241 SFGAO_STORAGEANCESTOR | SFGAO_HASPROPSHEET | SFGAO_STORAGE;
243 SFGAO_CANRENAME | SFGAO_CANDELETE | SFGAO_HASPROPSHEET | SFGAO_DROPTARGET |
244 SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_CANLINK;
246 SFGAO_CANRENAME | SFGAO_CANDELETE | SFGAO_HASPROPSHEET | SFGAO_DROPTARGET |
247 SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_CANLINK;
248
250 sPathTarget(NULL),
251 pidlRoot(NULL)
252{
253}
254
256{
257}
258
260{
261 WCHAR szMyPath[MAX_PATH];
262 HRESULT hr;
263
264 /* Create the root pidl */
266 if (!pidlRoot)
267 return E_OUTOFMEMORY;
268
269 /* Create the inner fs folder */
271 &CLSID_ShellFSFolder,
275 return hr;
276
277 /* Create the inner shared fs folder. Dont fail on failure. */
279 &CLSID_ShellFSFolder,
283 return hr;
284
285 /* Create the inner reg folder */
286 REGFOLDERINITDATA RegInit = { static_cast<IShellFolder*>(this), &g_RegFolderInfo };
287 hr = CRegFolder_CreateInstance(&RegInit,
288 pidlRoot,
291 return hr;
292
293 /* Cache the path to the user desktop directory */
295 return E_UNEXPECTED;
296
297 sPathTarget = (LPWSTR)SHAlloc((wcslen(szMyPath) + 1) * sizeof(WCHAR));
298 if (!sPathTarget)
299 return E_OUTOFMEMORY;
300
301 wcscpy(sPathTarget, szMyPath);
302 return S_OK;
303}
304
306{
307 if (IsRegItem(pidl))
308 return m_regFolder->QueryInterface(IID_PPV_ARG(IShellFolder2, psf));
309#if DBG
310 if (_ILIsDesktop(pidl))
311 {
312 FIXME("Desktop is unexpected here!\n");
313 }
314 else if (_ILIsSpecialFolder(pidl))
315 {
316 FIXME("Unexpected PIDL type %#x\n", pidl->mkid.abID[0]);
317 }
318#endif
320 return pSF->QueryInterface(IID_PPV_ARG(IShellFolder2, psf));
321}
322
324 HWND hwndOwner,
325 LPBC pbc,
326 LPOLESTR lpszDisplayName,
327 DWORD *pchEaten,
328 PIDLIST_RELATIVE *ppidl,
329 DWORD *pdwAttributes)
330{
331 if (pchEaten)
332 *pchEaten = 0;
333
334 CComHeapPtr<ITEMIDLIST> pidlParent;
335 BOOL bPath = FALSE;
336 WCHAR wch = *lpszDisplayName;
337 if (((L'A' <= wch && wch <= L'Z') || (L'a' <= wch && wch <= L'z')) &&
338 (lpszDisplayName[1] == L':'))
339 {
340 // "C:..."
341 bPath = TRUE;
342 pidlParent.Attach(_ILCreateMyComputer());
343 }
344 else if (PathIsUNCW(lpszDisplayName)) // "\\\\..."
345 {
346 if (lpszDisplayName[2] == L'?' && (lpszDisplayName[3] == L'\\' || !lpszDisplayName[3]))
347 return E_INVALIDARG; // We don't support "\\?\..." paths
348
349 bPath = TRUE;
350 pidlParent.Attach(_ILCreateNetwork());
351 }
352
353 if (bPath)
354 {
355 if (!pidlParent)
356 return E_OUTOFMEMORY;
357
358 CComPtr<IShellFolder> pParentFolder;
359 SHBindToObject(NULL, pidlParent, NULL, IID_PPV_ARG(IShellFolder, &pParentFolder));
360
361 CComHeapPtr<ITEMIDLIST> pidlChild;
362 HRESULT hr = pParentFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName,
363 pchEaten, &pidlChild, pdwAttributes);
364 if (FAILED(hr))
365 return hr;
366
367 *ppidl = ILCombine(pidlParent, pidlChild);
368 return (*ppidl ? S_OK : E_OUTOFMEMORY);
369 }
370
371 if (!UrlIsW(lpszDisplayName, URLIS_URL) || SHSkipJunctionBinding(pbc, NULL))
372 return E_INVALIDARG;
373
374 // Now lpszDisplayName is a URL
375 PARSEDURLW ParsedURL = { sizeof(ParsedURL) };
376 ::ParseURLW(lpszDisplayName, &ParsedURL);
377
378 switch (ParsedURL.nScheme)
379 {
380 case URL_SCHEME_FILE: // "file:..."
381 {
382 // Convert "file://..." to a normal path
384 DWORD cchPath = _countof(szPath);
385 HRESULT hr = PathCreateFromUrlW(lpszDisplayName, szPath, &cchPath, 0);
387 return hr;
388
389 CComPtr<IShellFolder> psfDesktop;
390 hr = SHGetDesktopFolder(&psfDesktop);
392 return hr;
393
394 // Parse by desktop folder
395 return psfDesktop->ParseDisplayName(hwndOwner, pbc, szPath, pchEaten, ppidl,
396 pdwAttributes);
397 }
398 case URL_SCHEME_HTTP: // "http:..."
399 case URL_SCHEME_HTTPS: // "https:..."
400 {
401 if (!BindCtx_ContainsObject(pbc, STR_PARSE_PREFER_FOLDER_BROWSING))
402 return E_INVALIDARG;
403
404 return HttpUrlParseDisplayName(hwndOwner,
405 pbc,
406 lpszDisplayName,
407 pchEaten,
408 ppidl,
409 pdwAttributes);
410 }
411 case URL_SCHEME_SHELL: // "shell:..."
412 {
413 return ShellUrlParseDisplayName(hwndOwner,
414 pbc,
415 lpszDisplayName,
416 pchEaten,
417 ppidl,
418 pdwAttributes);
419 }
422 {
423 WARN("We don't support 'ms-shell-rooted:' and 'ms-shell-idlist:' schemes\n");
424 break;
425 }
426 default:
427 {
428 TRACE("Scheme: %u\n", ParsedURL.nScheme);
429 break;
430 }
431 }
432
433 return E_INVALIDARG;
434}
435
436/**************************************************************************
437 * CDesktopFolder::ParseDisplayName
438 *
439 * NOTES
440 * "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" and "" binds
441 * to MyComputer
442 */
444 HWND hwndOwner,
445 LPBC pbc,
446 LPOLESTR lpszDisplayName,
447 DWORD *pchEaten,
448 PIDLIST_RELATIVE *ppidl,
449 DWORD *pdwAttributes)
450{
451 TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n",
452 this, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName),
453 pchEaten, ppidl, pdwAttributes);
454
455 if (!ppidl)
456 return E_INVALIDARG;
457
458 *ppidl = NULL;
459
460 if (!lpszDisplayName)
461 return E_INVALIDARG;
462
463 if (!*lpszDisplayName)
464 {
465 *ppidl = _ILCreateMyComputer();
466 return (*ppidl ? S_OK : E_OUTOFMEMORY);
467 }
468
469 if (lpszDisplayName[0] == ':' && lpszDisplayName[1] == ':')
470 {
471 return m_regFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl,
472 pdwAttributes);
473 }
474
475 HRESULT hr = _ParseDisplayNameByParent(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl,
476 pdwAttributes);
477 if (SUCCEEDED(hr))
478 {
479 if (BindCtx_ContainsObject(pbc, STR_PARSE_TRANSLATE_ALIASES))
480 {
481 // Use "alias" PIDL if possible
482 CComHeapPtr<ITEMIDLIST> pidlAlias;
483 if (SUCCEEDED(SHELL32_AliasTranslatePidl(*ppidl, &pidlAlias, ALIAS_ANY)))
484 {
485 ILFree(*ppidl);
486 *ppidl = pidlAlias.Detach();
487 }
488 }
489
490 TRACE ("(%p)->(-- ret=0x%08x)\n", this, hr);
491 return hr;
492 }
493
495 return hr;
496
497 if (BindCtx_ContainsObject(pbc, STR_DONT_PARSE_RELATIVE))
498 return E_INVALIDARG;
499
500 if (SHIsFileSysBindCtx(pbc, NULL) == S_OK)
501 return hr;
502
503 BIND_OPTS BindOps = { sizeof(BindOps) };
505 if (pbc && SUCCEEDED(pbc->GetBindOptions(&BindOps)) && (BindOps.grfMode & STGM_CREATE))
506 {
507 BindOps.grfMode &= ~STGM_CREATE;
508 bCreate = TRUE;
509 pbc->SetBindOptions(&BindOps);
510 }
511
513 {
514 hr = m_DesktopFSFolder->ParseDisplayName(hwndOwner,
515 pbc,
516 lpszDisplayName,
517 pchEaten,
518 ppidl,
519 pdwAttributes);
520 }
521
523 {
524 hr = m_SharedDesktopFSFolder->ParseDisplayName(hwndOwner,
525 pbc,
526 lpszDisplayName,
527 pchEaten,
528 ppidl,
529 pdwAttributes);
530 if (SUCCEEDED(hr))
531 MarkAsCommonItem(*ppidl);
532 }
533
535 {
536 BindOps.grfMode |= STGM_CREATE;
537 pbc->SetBindOptions(&BindOps);
538 hr = m_DesktopFSFolder->ParseDisplayName(hwndOwner,
539 pbc,
540 lpszDisplayName,
541 pchEaten,
542 ppidl,
543 pdwAttributes);
544 }
545
546 TRACE ("(%p)->(-- ret=0x%08x)\n", this, hr);
547
548 return hr;
549}
550
551/**************************************************************************
552 * CDesktopFolder::EnumObjects
553 */
554HRESULT WINAPI CDesktopFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
555{
556 CComPtr<IEnumIDList> pRegEnumerator;
557 CComPtr<IEnumIDList> pDesktopEnumerator;
558 CComPtr<IEnumIDList> pCommonDesktopEnumerator;
559 HRESULT hr;
560
561 hr = m_regFolder->EnumObjects(hwndOwner, dwFlags, &pRegEnumerator);
562 if (FAILED(hr))
563 ERR("EnumObjects for reg folder failed\n");
564
565 hr = m_DesktopFSFolder->EnumObjects(hwndOwner, dwFlags, &pDesktopEnumerator);
566 if (FAILED(hr))
567 ERR("EnumObjects for desktop fs folder failed\n");
568
569 hr = m_SharedDesktopFSFolder->EnumObjects(hwndOwner, dwFlags, &pCommonDesktopEnumerator);
570 if (FAILED(hr))
571 ERR("EnumObjects for shared desktop fs folder failed\n");
572
573 return ShellObjectCreatorInit<CDesktopFolderEnum>(m_regFolder, dwFlags, pRegEnumerator, pDesktopEnumerator,
574 pCommonDesktopEnumerator, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
575}
576
577/**************************************************************************
578 * CDesktopFolder::BindToObject
579 */
582 LPBC pbcReserved,
583 REFIID riid,
584 LPVOID *ppvOut)
585{
586 if (!pidl)
587 return E_INVALIDARG;
588
589 CComPtr<IShellFolder2> psf;
590 HRESULT hr = _GetSFFromPidl(pidl, &psf);
592 return hr;
593
594 return psf->BindToObject(pidl, pbcReserved, riid, ppvOut);
595}
596
597/**************************************************************************
598 * CDesktopFolder::BindToStorage
599 */
602 LPBC pbcReserved,
603 REFIID riid,
604 LPVOID *ppvOut)
605{
606 FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n",
607 this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut);
608
609 *ppvOut = NULL;
610 return E_NOTIMPL;
611}
612
613/**************************************************************************
614 * CDesktopFolder::CompareIDs
615 */
617{
618 bool bIsDesktopFolder1, bIsDesktopFolder2;
619
620 if (!pidl1 || !pidl2)
621 {
622 ERR("Got null pidl pointer (%Ix %p %p)!\n", lParam, pidl1, pidl2);
623 return E_INVALIDARG;
624 }
625
626 bIsDesktopFolder1 = _ILIsDesktop(pidl1);
627 bIsDesktopFolder2 = _ILIsDesktop(pidl2);
628 if (bIsDesktopFolder1 || bIsDesktopFolder2)
629 return MAKE_COMPARE_HRESULT(bIsDesktopFolder1 - bIsDesktopFolder2);
630
631 if (_ILIsSpecialFolder(pidl1) || _ILIsSpecialFolder(pidl2))
632 return m_regFolder->CompareIDs(lParam, pidl1, pidl2);
633
634 HRESULT ret = m_DesktopFSFolder->CompareIDs(lParam, pidl1, pidl2);
635 if (ret == 0 && ((lParam & SHCIDS_COLUMNMASK) == SHFSF_COL_NAME || (lParam & (SHCIDS_ALLFIELDS | SHCIDS_CANONICALONLY))))
637 return ret;
638}
639
640/**************************************************************************
641 * CDesktopFolder::CreateViewObject
642 */
644 HWND hwndOwner,
645 REFIID riid,
646 LPVOID *ppvOut)
647{
649
650 TRACE ("(%p)->(hwnd=%p,%s,%p)\n",
651 this, hwndOwner, shdebugstr_guid (&riid), ppvOut);
652
653 if (!ppvOut)
654 return hr;
655
656 *ppvOut = NULL;
657
658 if (IsEqualIID (riid, IID_IDropTarget))
659 {
660 hr = m_DesktopFSFolder->CreateViewObject(hwndOwner, riid, ppvOut);
661 }
662 else if (IsEqualIID (riid, IID_IContextMenu))
663 {
665 AddClassKeyToArray(L"Directory\\Background", keys, keys);
666 DEFCONTEXTMENU dcm = { hwndOwner, this, pidlRoot, this, 0, NULL, NULL, keys, keys };
667 hr = SHCreateDefaultContextMenu(&dcm, riid, ppvOut);
668 }
669 else if (IsEqualIID (riid, IID_IShellView))
670 {
671 CComPtr<CDesktopFolderViewCB> sfviewcb;
672 if (SUCCEEDED(hr = ShellObjectCreator(sfviewcb)))
673 {
674 SFV_CREATE create = { sizeof(create), this, NULL, sfviewcb };
676 if (SUCCEEDED(hr))
677 sfviewcb->Initialize((IShellView*)*ppvOut);
678 }
679 }
680 TRACE ("-- (%p)->(interface=%p)\n", this, ppvOut);
681 return hr;
682}
683
684/**************************************************************************
685 * CDesktopFolder::GetAttributesOf
686 */
688 UINT cidl,
690 DWORD *rgfInOut)
691{
692 HRESULT hr = S_OK;
693
694 TRACE("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n",
695 this, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0);
696
697 if (cidl && !apidl)
698 return E_INVALIDARG;
699
700 if (*rgfInOut == 0)
701 *rgfInOut = ~0;
702
703 if(cidl == 0)
704 *rgfInOut &= dwDesktopAttributes;
705 else
706 {
707 /* TODO: always add SFGAO_CANLINK */
708 for (UINT i = 0; i < cidl; ++i)
709 {
710 pdump(apidl[i]);
711 if (_ILIsDesktop(apidl[i]))
712 *rgfInOut &= dwDesktopAttributes;
713 else if (_ILIsMyComputer(apidl[i]))
714 *rgfInOut &= dwMyComputerAttributes;
715 else if (IsRegItem(apidl[i], CLSID_NetworkPlaces))
716 *rgfInOut &= dwMyNetPlacesAttributes;
717 else if (_ILIsFolderOrFile(apidl[i]) || _ILIsSpecialFolder(apidl[i]))
718 {
719 CComPtr<IShellFolder2> psf;
720 HRESULT hr = _GetSFFromPidl(apidl[i], &psf);
722 continue;
723
724 psf->GetAttributesOf(1, &apidl[i], rgfInOut);
725 }
726 else
727 ERR("Got an unknown pidl type!!!\n");
728 }
729 }
730 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
731 *rgfInOut &= ~SFGAO_VALIDATE;
732
733 TRACE("-- result=0x%08x\n", *rgfInOut);
734
735 return hr;
736}
737
738/**************************************************************************
739 * CDesktopFolder::GetUIObjectOf
740 *
741 * PARAMETERS
742 * HWND hwndOwner, //[in ] Parent window for any output
743 * UINT cidl, //[in ] array size
744 * LPCITEMIDLIST* apidl, //[in ] simple pidl array
745 * REFIID riid, //[in ] Requested Interface
746 * UINT* prgfInOut, //[ ] reserved
747 * LPVOID* ppvObject) //[out] Resulting Interface
748 *
749 */
751 HWND hwndOwner,
752 UINT cidl,
754 REFIID riid,
755 UINT *prgfInOut,
756 LPVOID *ppvOut)
757{
758 LPVOID pObj = NULL;
760
761 TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
762 this, hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
763
764 if (!ppvOut)
765 return hr;
766 *ppvOut = NULL;
767
768 BOOL self = IsSelf(cidl, apidl);
769 if (cidl == 1 && !_ILIsSpecialFolder(apidl[0]) && !self)
770 {
771 CComPtr<IShellFolder2> psf;
772 HRESULT hr = _GetSFFromPidl(apidl[0], &psf);
774 return hr;
775
776 return psf->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, ppvOut);
777 }
778
779 if (IsEqualIID (riid, IID_IContextMenu))
780 {
781 // FIXME: m_regFolder vs AddFSClassKeysToArray is incorrect when the selection includes both regitems and FS items
782 if (!self && cidl > 0 && _ILIsSpecialFolder(apidl[0]))
783 {
784 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
785 }
786 else
787 {
788 /* Do not use the context menu of the CFSFolder here. */
789 /* We need to pass a pointer of the CDesktopFolder so as the data object that the context menu gets is rooted to the desktop */
790 /* Otherwise operations like that involve items from both user and shared desktop will not work */
792 if (self)
793 {
794 AddClsidKeyToArray(CLSID_ShellDesktop, keys, keys);
795 AddClassKeyToArray(L"Folder", keys, keys);
796 }
797 else if (cidl > 0)
798 {
799 AddFSClassKeysToArray(cidl, apidl, keys, keys);
800 }
801
802 DEFCONTEXTMENU dcm = { hwndOwner, this, pidlRoot, this, cidl, apidl, NULL, keys, keys };
803 hr = SHCreateDefaultContextMenu(&dcm, riid, &pObj);
804 }
805 }
806 else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
807 {
808 hr = IDataObject_Constructor( hwndOwner, pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
809 }
810 else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
811 {
812 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
813 }
814 else if (IsEqualIID (riid, IID_IDropTarget) && (cidl == 1))
815 {
816 CComPtr<IShellFolder> psfChild;
817 hr = this->BindToObject(apidl[0], NULL, IID_PPV_ARG(IShellFolder, &psfChild));
819 return hr;
820
821 return psfChild->CreateViewObject(NULL, riid, ppvOut);
822 }
823 else
825
826 if (SUCCEEDED(hr) && !pObj)
828
829 *ppvOut = pObj;
830 TRACE ("(%p)->hr=0x%08x\n", this, hr);
831 return hr;
832}
833
834/**************************************************************************
835 * CDesktopFolder::GetDisplayNameOf
836 *
837 * NOTES
838 * special case: pidl = null gives desktop-name back
839 */
841{
842 TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
843 pdump (pidl);
844
845 if (!strRet)
846 return E_INVALIDARG;
847
848 if (!_ILIsPidlSimple (pidl))
849 {
850 return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
851 }
852 else if (_ILIsDesktop(pidl))
853 {
855 return SHSetStrRet(strRet, sPathTarget);
856 else
857 return m_regFolder->GetDisplayNameOf(pidl, dwFlags, strRet);
858 }
859
860 /* file system folder or file rooted at the desktop */
861 CComPtr<IShellFolder2> psf;
862 HRESULT hr = _GetSFFromPidl(pidl, &psf);
864 return hr;
865
866 return psf->GetDisplayNameOf(pidl, dwFlags, strRet);
867}
868
869/**************************************************************************
870 * CDesktopFolder::SetNameOf
871 * Changes the name of a file object or subfolder, possibly changing its item
872 * identifier in the process.
873 *
874 * PARAMETERS
875 * HWND hwndOwner, //[in ] Owner window for output
876 * LPCITEMIDLIST pidl, //[in ] simple pidl of item to change
877 * LPCOLESTR lpszName, //[in ] the items new display name
878 * DWORD dwFlags, //[in ] SHGNO formatting flags
879 * LPITEMIDLIST* ppidlOut) //[out] simple pidl returned
880 */
882 HWND hwndOwner,
883 PCUITEMID_CHILD pidl, /* simple pidl */
884 LPCOLESTR lpName,
886 PITEMID_CHILD *pPidlOut)
887{
888 CComPtr<IShellFolder2> psf;
889 HRESULT hr = _GetSFFromPidl(pidl, &psf);
891 return hr;
892
893 return psf->SetNameOf(hwndOwner, pidl, lpName, dwFlags, pPidlOut);
894}
895
897{
898 return E_NOTIMPL;
899}
900
902{
903 *ppenum = NULL;
904 return E_NOTIMPL;
905}
906
908{
909 TRACE ("(%p)\n", this);
910 return E_NOTIMPL; // Not required when column 0 is our default.
911}
912
914{
915 HRESULT hr;
916 TRACE ("(%p)\n", this);
917
918 if (!pcsFlags)
919 return E_INVALIDARG;
920
921 hr = CFSFolder::GetDefaultFSColumnState(iColumn, *pcsFlags);
922 /*
923 // CDesktopFolder may override the flags if desired (future)
924 switch(iColumn)
925 {
926 case SHFSF_COL_FATTS:
927 *pcsFlags &= ~SHCOLSTATE_ONBYDEFAULT;
928 break;
929 }
930 */
931 return hr;
932}
933
935 const SHCOLUMNID *pscid, VARIANT *pv)
936{
937 HRESULT hr;
938 CComPtr<IShellFolder2> psf;
939 if (FAILED_UNEXPECTEDLY(hr = _GetSFFromPidl(pidl, &psf)))
940 return hr;
941 return psf->GetDetailsEx(pidl, pscid, pv);
942}
943
944/*************************************************************************
945 * Column info functions.
946 * CFSFolder.h provides defaults for us.
947 */
949{
950 /* CDesktopFolder may override the flags and/or name if desired */
951 return CFSFolder::GetFSColumnDetails(iColumn, sd);
952}
953
955 PCUITEMID_CHILD pidl,
956 UINT iColumn,
957 SHELLDETAILS *psd)
958{
959 if (!psd)
960 return E_INVALIDARG;
961
962 if (!pidl)
963 {
964 return GetColumnDetails(iColumn, *psd);
965 }
966
967 CComPtr<IShellFolder2> psf;
968 HRESULT hr = _GetSFFromPidl(pidl, &psf);
970 return hr;
971
972 hr = psf->GetDetailsOf(pidl, iColumn, psd);
974 return hr;
975
976 return hr;
977}
978
980{
981 // Note: All these folders use the same SHFSF_COL mapping (m_regFolder only handles a subset).
983 return m_DesktopFSFolder->MapColumnToSCID(column, pscid);
985 return m_SharedDesktopFSFolder->MapColumnToSCID(column, pscid);
986 if (m_regFolder)
987 return m_regFolder->MapColumnToSCID(column, pscid);
988 return E_FAIL;
989}
990
992{
993 TRACE ("(%p)\n", this);
994
995 if (!lpClassId)
996 return E_POINTER;
997
998 *lpClassId = CLSID_ShellDesktop;
999
1000 return S_OK;
1001}
1002
1004{
1005 TRACE ("(%p)->(%p)\n", this, pidl);
1006
1007 if (!pidl)
1008 return S_OK;
1009
1010 return E_INVALIDARG;
1011}
1012
1014{
1015 TRACE ("(%p)->(%p)\n", this, pidl);
1016
1017 if (!pidl)
1018 return E_INVALIDARG; /* xp doesn't have this check and crashes on NULL */
1019 *pidl = ILClone (pidlRoot);
1020 return S_OK;
1021}
1022
1024{
1025 enum { IDC_PROPERTIES };
1026 if (uMsg == DFM_INVOKECOMMAND && wParam == (pdtobj ? DFM_CMD_PROPERTIES : IDC_PROPERTIES))
1027 {
1028 if (pdtobj)
1029 {
1031 BOOL bIsSelf = _ILIsDesktop(pidl); // Context menu on Desktop item in the shell tree?
1032 ILFree(pidl);
1033 if (!bIsSelf)
1034 return SHELL32_ShowPropertiesDialog(pdtobj); // File selection
1035 }
1036 return SHELL_ExecuteControlPanelCPL(hwndOwner, L"desk.cpl") ? S_OK : E_FAIL; // Background
1037 }
1038 else if (uMsg == DFM_MERGECONTEXTMENU && !pdtobj) // Add Properties item when called for directory background
1039 {
1040 QCMINFO *pqcminfo = (QCMINFO *)lParam;
1041 HMENU hpopup = CreatePopupMenu();
1043 pqcminfo->idCmdFirst = Shell_MergeMenus(pqcminfo->hmenu, hpopup, pqcminfo->indexMenu, pqcminfo->idCmdFirst, pqcminfo->idCmdLast, MM_ADDSEPARATOR);
1044 DestroyMenu(hpopup);
1045 return S_OK;
1046 }
1047 return SHELL32_DefaultContextMenuCallBack(psf, pdtobj, uMsg);
1048}
1049
1050/*************************************************************************
1051 * CDesktopFolderViewCB
1052 */
1053
1055{
1057 return SUCCEEDED(psv->GetCurrentInfo(&settings)) && (settings.fFlags & FWF_DESKTOP);
1058}
1059
1061{
1062 enum { Uninitialized = 0, NotHosted, IsHosted };
1063 C_ASSERT(Uninitialized == 0);
1064 if (m_IsProgmanHosted == Uninitialized)
1066 return m_IsProgmanHosted == IsHosted;
1067}
1068
1070{
1071 const CLSID* pClsid;
1072 if (IsProgmanHostedBrowser() && (pClsid = IsRegItem(pidlItem)) != NULL)
1073 {
1074 const BOOL NewStart = SHELL_GetSetting(SSF_STARTPANELON, fStartPanelOn);
1075 LPCWSTR SubKey = NewStart ? L"HideDesktopIcons\\NewStartPanel" : L"HideDesktopIcons\\ClassicStartMenu";
1076 return SHELL32_IsShellFolderNamespaceItemHidden(SubKey, *pClsid) ? S_FALSE : S_OK;
1077 }
1078 return S_OK;
1079}
1080
1082{
1083 switch (uMsg)
1084 {
1085 #if ROSPOLICY_DESKTOPFOLDER_DEFLARGEICONS
1086 case SFVM_DEFVIEWMODE: // CDesktopBrowser always forces FVM_ICON.
1087 *((FOLDERVIEWMODE*)lParam) = FVM_ICON; // This sets the default for generic browsers.
1088 return S_OK;
1089 #endif
1090 case SFVM_VIEWRELEASE:
1092 return S_OK;
1093 case SFVM_GETCOMMANDDIR:
1094 {
1098 break;
1099 }
1100 }
1101 return E_NOTIMPL;
1102}
1103
1104/*************************************************************************
1105 * SHGetDesktopFolder [SHELL32.@]
1106 */
1108{
1109 HRESULT hres = S_OK;
1110 TRACE("\n");
1111
1112 if(!psf) return E_INVALIDARG;
1113 *psf = NULL;
1114 hres = CDesktopFolder::_CreatorClass::CreateInstance(NULL, IID_PPV_ARG(IShellFolder, psf));
1115
1116 TRACE("-- %p->(%p)\n",psf, *psf);
1117 return hres;
1118}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
static const REGFOLDERINFO g_RegFolderInfo
static const CLSID * IsRegItem(LPCITEMIDLIST pidl)
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:4806
HRESULT WINAPI SHCreateDefaultContextMenu(const DEFCONTEXTMENU *pdcm, REFIID riid, void **ppv)
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
HRESULT WINAPI IEParseDisplayNameWithBCW(DWORD codepage, LPCWSTR lpszDisplayName, LPBC pbc, LPITEMIDLIST *ppidl)
Definition: shdocvw_main.c:505
static const DWORD dwMyComputerAttributes
static const CLSID * IsRegItem(PCUITEMID_CHILD pidl)
BOOL SHELL32_IsShellFolderNamespaceItemHidden(LPCWSTR SubKey, REFCLSID Clsid)
Returns true if the item should be hidden in DefView but not in the Explorer folder tree.
static const REGFOLDERINFO g_RegFolderInfo
static BOOL IsSelf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl)
static const DWORD dwDesktopAttributes
static DWORD dwMyNetPlacesAttributes
static void MarkAsCommonItem(LPITEMIDLIST pidl)
int SHELL_ConfirmMsgBox(HWND hWnd, LPWSTR lpszText, LPWSTR lpszCaption, HICON hIcon, BOOL bYesToAll)
Definition: shlfileop.cpp:247
static const REQUIREDREGITEM g_RequiredItems[]
static HRESULT SHELL32_CoCreateInitSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidlChild, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: CFindFolder.cpp:39
#define SHCIDS_ALLFIELDS
Definition: CFontExt.cpp:14
HRESULT IDataObject_Constructor(HWND hwndOwner, PCIDLIST_ABSOLUTE pMyPidl, PCUIDLIST_RELATIVE_ARRAY apidl, UINT cidl, BOOL bExtendedObject, IDataObject **dataObject)
HRESULT CRegFolder_CreateInstance(PREGFOLDERINITDATA pInit, LPCITEMIDLIST pidlRoot, REFIID riid, void **ppv)
Definition: CRegFolder.cpp:995
#define IID_PPV_ARG(Itype, ppType)
#define SFVM_GETCOMMANDDIR
#define SFVM_VIEWRELEASE
struct mke2fs_defaults settings[]
HWND hWnd
Definition: settings.c:17
#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 IDS_PROPERTIES
Definition: resource.h:108
#define STDMETHODIMP
Definition: basetyps.h:43
HRESULT WINAPI Initialize(IShellFolder *pRegFolder, SHCONTF dwFlags, IEnumIDList *pRegEnumerator, IEnumIDList *pDesktopEnumerator, IEnumIDList *pCommonDesktopEnumerator)
STDMETHOD() MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam) override
IShellView * m_pShellView
STDMETHOD() ShouldShow(IShellFolder *psf, PCIDLIST_ABSOLUTE pidlFolder, PCUITEMID_CHILD pidlItem) override
STDMETHOD() GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
CComPtr< IShellFolder2 > m_SharedDesktopFSFolder
STDMETHOD() BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
HRESULT WINAPI FinalConstruct()
STDMETHOD() Initialize(PCIDLIST_ABSOLUTE pidl) override
STDMETHOD() GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
STDMETHOD() CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
static BOOL IsCommonItem(LPCITEMIDLIST pidl)
STDMETHOD() GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags) override
STDMETHOD() SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
STDMETHOD() GetDefaultSearchGUID(GUID *pguid) override
STDMETHOD() CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override
STDMETHOD() MapColumnToSCID(UINT column, SHCOLUMNID *pscid) override
STDMETHOD() GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override
STDMETHOD() BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
STDMETHOD() CallBack(IShellFolder *psf, HWND hwndOwner, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam) override
HRESULT _GetSFFromPidl(LPCITEMIDLIST pidl, IShellFolder2 **psf)
CComPtr< IShellFolder2 > m_DesktopFSFolder
STDMETHODIMP HttpUrlParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
STDMETHOD() ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes) override
STDMETHOD() GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override
STDMETHOD() GetCurFolder(PIDLIST_ABSOLUTE *pidl) override
STDMETHOD() GetClassID(CLSID *lpClassId) override
STDMETHOD() EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override
STDMETHOD() EnumSearches(IEnumExtraSearch **ppenum) override
LPITEMIDLIST pidlRoot
STDMETHOD() GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override
CComPtr< IShellFolder2 > m_regFolder
STDMETHODIMP ShellUrlParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
STDMETHOD() GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override
HRESULT _ParseDisplayNameByParent(HWND hwndOwner, LPBC pbc, LPOLESTR pszPath, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
static HRESULT GetColumnDetails(UINT iColumn, SHELLDETAILS &sd)
ENUMLIST * mpLast
ENUMLIST * mpFirst
HRESULT AppendItemsFromEnumerator(IEnumIDList *pEnum)
static HRESULT GetDefaultFSColumnState(UINT iColumn, SHCOLSTATEF &csFlags)
Definition: CFSFolder.cpp:615
static HRESULT GetFSColumnDetails(UINT iColumn, SHELLDETAILS &sd)
Definition: CFSFolder.cpp:605
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
void pdump(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:322
const char * shdebugstr_guid(const struct _GUID *id)
Definition: debughlp.cpp:438
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define IDC_PROPERTIES
Definition: resource.h:35
#define SHCIDS_CANONICALONLY
Definition: shobjidl.idl:226
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
#define MAX_PATH
Definition: compat.h:34
const UINT * keys
Definition: locale.c:418
HRESULT WINAPI ParseURLW(const WCHAR *url, PARSEDURLW *result)
Definition: path.c:2807
BOOL WINAPI PathIsUNCW(const WCHAR *path)
Definition: path.c:989
HRESULT WINAPI PathCreateFromUrlW(const WCHAR *url, WCHAR *path, DWORD *pcchPath, DWORD dwReserved)
Definition: path.c:3049
BOOL WINAPI UrlIsW(const WCHAR *url, URLIS Urlis)
Definition: path.c:4788
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
SHSTDAPI SHBindToObject(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_opt_ IBindCtx *pBindCtx, _In_ REFIID riid, _Out_ void **ppvObj)
#define SHELL_ExecuteControlPanelCPL(hwnd, cpl)
Definition: precomp.h:223
EXTERN_C INT Shell_ParseSpecialFolder(_In_ LPCWSTR pszStart, _Out_ LPWSTR *ppch, _Out_ INT *pcch)
BOOL BindCtx_ContainsObject(_In_ IBindCtx *pBindCtx, _In_ LPCWSTR pszName)
Definition: utils.cpp:328
EXTERN_C HRESULT SHGetNameAndFlagsW(_In_ LPCITEMIDLIST pidl, _In_ DWORD dwFlags, _Out_opt_ LPWSTR pszText, _In_ UINT cchBuf, _Inout_opt_ DWORD *pdwAttributes)
Definition: utils.cpp:551
HRESULT SHIsFileSysBindCtx(_In_ IBindCtx *pBindCtx, _Out_opt_ WIN32_FIND_DATAW *pFindData)
Definition: utils.cpp:361
BOOL Shell_FailForceReturn(_In_ HRESULT hr)
Definition: utils.cpp:378
HRESULT SHELL32_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdo, UINT msg)
Definition: shlfolder.cpp:656
PIDLIST_ABSOLUTE SHELL_DataObject_ILCloneFullItem(_In_ IDataObject *pDO, _In_ UINT Index)
BOOL SHSkipJunctionBinding(_In_ IBindCtx *pbc, _In_ CLSID *pclsid)
Definition: utils.cpp:349
HRESULT SHELL32_ShowPropertiesDialog(IDataObject *pdtobj)
Definition: shlfolder.cpp:648
EXTERN_C HRESULT SHELL32_AliasTranslatePidl(_In_ LPCITEMIDLIST pidl, _Out_ LPITEMIDLIST *ppidlNew, _In_ DWORD dwFlags)
Translate a PIDL to an "alias" PIDL.
Definition: utils.cpp:2379
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:348
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
Definition: shellpath.c:4467
BOOL WINAPI SHGetSpecialFolderPathW(HWND hwndOwner, LPWSTR szPath, int nFolder, BOOL bCreate)
Definition: shellpath.c:4394
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:33
return ret
Definition: mutex.c:147
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
LSTATUS AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: fontext.cpp:109
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
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
unsigned int UINT
Definition: sysinfo.c:13
REFIID riid
Definition: atlbase.h:39
HRESULT GetCurrentInfo([out] LPFOLDERSETTINGS lpfs)
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 C_ASSERT(e)
Definition: intsafe.h:73
#define debugstr_w
Definition: kernel32.h:32
#define BEGIN_COM_MAP(x)
Definition: atlcom.h:581
#define COM_INTERFACE_ENTRY_IID(iid, x)
Definition: atlcom.h:601
#define END_COM_MAP()
Definition: atlcom.h:592
#define PT_FS
Definition: lnktool.cpp:40
#define PT_DESKTOP_REGITEM
Definition: lnktool.cpp:38
LONG_PTR LPARAM
Definition: minwindef.h:175
UINT_PTR WPARAM
Definition: minwindef.h:174
#define pch(ap)
Definition: match.c:418
#define ASSERT(a)
Definition: mode.c:44
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
LPCWSTR szPath
Definition: env.c:37
static HICON
Definition: imagelist.c:80
HRESULT hres
Definition: protocol.c:432
static const struct access_res create[16]
Definition: package.c:7546
static const WCHAR sd[]
Definition: suminfo.c:432
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
static SHCONTF
Definition: ordinal.c:61
HICON hIcon
Definition: msconfig.c:44
const CLSID * clsid
Definition: msctf.cpp:50
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define STGM_CREATE
Definition: objbase.h:945
interface IBindCtx * LPBC
Definition: objfwd.h:18
HRESULT WINAPI CreateBindCtx(DWORD reserved, IBindCtx **bind_context)
Definition: bindctx.c:491
const GUID IID_IDataObject
short WCHAR
Definition: pedump.c:58
LPITEMIDLIST _ILCreateMyComputer(void)
Definition: pidl.c:1807
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:238
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1051
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:817
LPITEMIDLIST _ILCreateDesktop(void)
Definition: pidl.c:1796
BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2128
LPITEMIDLIST _ILCreateNetwork(void)
Definition: pidl.c:1870
BOOL _ILIsMyComputer(LPCITEMIDLIST pidl)
Definition: pidl.c:2106
static BYTE _ILGetFSType(LPCITEMIDLIST pidl)
Definition: pidl.h:149
static BOOL _ILIsEmpty(LPCITEMIDLIST pidl)
Definition: pidl.h:282
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
@ URLIS_URL
Definition: shlwapi.h:597
@ URL_SCHEME_MSSHELLROOTED
Definition: shlwapi.h:564
@ URL_SCHEME_HTTPS
Definition: shlwapi.h:555
@ URL_SCHEME_MSSHELLIDLIST
Definition: shlwapi.h:565
@ URL_SCHEME_HTTP
Definition: shlwapi.h:546
@ URL_SCHEME_FILE
Definition: shlwapi.h:553
@ URL_SCHEME_SHELL
Definition: shlwapi.h:556
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
#define MFS_ENABLED
Definition: winuser.h:761
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define MFT_STRING
Definition: winuser.h:757
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
wcscpy
#define ALIAS_ANY
Definition: shell32_main.h:121
_In_ UINT _In_ UINT cch
Definition: shellapi.h:428
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:740
#define SHELL_GetSetting(pss, ssf, field)
Definition: shellutils.h:1021
#define IS_SHGDN_DESKTOPABSOLUTEPARSING(flags)
Definition: shfldr.h:79
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:363
#define SHFSF_COL_NAME
Definition: shfldr.h:44
void AddFSClassKeysToArray(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:462
LSTATUS AddClsidKeyToArray(REFCLSID clsid, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:455
void WINAPI _InsertMenuItemW(HMENU hmenu, UINT indexMenu, BOOL fByPosition, UINT wID, UINT fType, LPCWSTR dwTypeData, UINT fState)
UINT WINAPI Shell_MergeMenus(HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uIDAdjust, UINT uIDAdjustMax, ULONG uFlags)
Definition: shlmenu.c:856
#define CSIDL_COMMON_DESKTOPDIRECTORY
Definition: shlobj.h:2244
_In_ int _In_ BOOL bCreate
Definition: shlobj.h:1565
#define CSIDL_DESKTOPDIRECTORY
Definition: shlobj.h:2235
#define SFVM_DEFVIEWMODE
Definition: shlobj.h:1363
#define CSIDL_FLAG_CREATE
Definition: shlobj.h:2282
#define SSF_STARTPANELON
Definition: shlobj.h:1671
#define MM_ADDSEPARATOR
Definition: shlobj.h:2575
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2659
@ FWF_DESKTOP
Definition: shobjidl.idl:692
FOLDERVIEWMODE
Definition: shobjidl.idl:722
@ FVM_ICON
Definition: shobjidl.idl:724
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
const ITEMIDLIST_RELATIVE UNALIGNED * PCUIDLIST_RELATIVE
Definition: shtypes.idl:57
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
DWORD SHCOLSTATEF
Definition: shtypes.idl:142
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
ENUMLIST * pNext
LPITEMIDLIST pidl
HMENU hmenu
Definition: shlobj.h:1435
UINT idCmdLast
Definition: shlobj.h:1438
UINT idCmdFirst
Definition: shlobj.h:1437
UINT indexMenu
Definition: shlobj.h:1436
LPCWSTR pszSuffix
Definition: shlwapi.h:619
UINT nScheme
Definition: shlwapi.h:621
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
int codepage
Definition: win_iconv.c:156
_In_ LPCSTR lpName
Definition: winbase.h:2519
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define E_NOINTERFACE
Definition: winerror.h:3479
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:228
#define E_UNEXPECTED
Definition: winerror.h:3528
#define E_POINTER
Definition: winerror.h:3480