ReactOS 0.4.16-dev-2206-gc56950d
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, 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 bPath = TRUE;
347 pidlParent.Attach(_ILCreateNetwork());
348 }
349
350 if (bPath)
351 {
352 if (!pidlParent)
353 return E_OUTOFMEMORY;
354
355 CComPtr<IShellFolder> pParentFolder;
356 SHBindToObject(NULL, pidlParent, IID_PPV_ARG(IShellFolder, &pParentFolder));
357
358 CComHeapPtr<ITEMIDLIST> pidlChild;
359 HRESULT hr = pParentFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName,
360 pchEaten, &pidlChild, pdwAttributes);
361 if (FAILED(hr))
362 return hr;
363
364 *ppidl = ILCombine(pidlParent, pidlChild);
365 return (*ppidl ? S_OK : E_OUTOFMEMORY);
366 }
367
368 if (!UrlIsW(lpszDisplayName, URLIS_URL) || SHSkipJunctionBinding(pbc, NULL))
369 return E_INVALIDARG;
370
371 // Now lpszDisplayName is a URL
372 PARSEDURLW ParsedURL = { sizeof(ParsedURL) };
373 ::ParseURLW(lpszDisplayName, &ParsedURL);
374
375 switch (ParsedURL.nScheme)
376 {
377 case URL_SCHEME_FILE: // "file:..."
378 {
379 // Convert "file://..." to a normal path
381 DWORD cchPath = _countof(szPath);
382 HRESULT hr = PathCreateFromUrlW(lpszDisplayName, szPath, &cchPath, 0);
384 return hr;
385
386 CComPtr<IShellFolder> psfDesktop;
387 hr = SHGetDesktopFolder(&psfDesktop);
389 return hr;
390
391 // Parse by desktop folder
392 return psfDesktop->ParseDisplayName(hwndOwner, pbc, szPath, pchEaten, ppidl,
393 pdwAttributes);
394 }
395 case URL_SCHEME_HTTP: // "http:..."
396 case URL_SCHEME_HTTPS: // "https:..."
397 {
398 if (!BindCtx_ContainsObject(pbc, STR_PARSE_PREFER_FOLDER_BROWSING))
399 return E_INVALIDARG;
400
401 return HttpUrlParseDisplayName(hwndOwner,
402 pbc,
403 lpszDisplayName,
404 pchEaten,
405 ppidl,
406 pdwAttributes);
407 }
408 case URL_SCHEME_SHELL: // "shell:..."
409 {
410 return ShellUrlParseDisplayName(hwndOwner,
411 pbc,
412 lpszDisplayName,
413 pchEaten,
414 ppidl,
415 pdwAttributes);
416 }
419 {
420 WARN("We don't support 'ms-shell-rooted:' and 'ms-shell-idlist:' schemes\n");
421 break;
422 }
423 default:
424 {
425 TRACE("Scheme: %u\n", ParsedURL.nScheme);
426 break;
427 }
428 }
429
430 return E_INVALIDARG;
431}
432
433/**************************************************************************
434 * CDesktopFolder::ParseDisplayName
435 *
436 * NOTES
437 * "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}" and "" binds
438 * to MyComputer
439 */
441 HWND hwndOwner,
442 LPBC pbc,
443 LPOLESTR lpszDisplayName,
444 DWORD *pchEaten,
445 PIDLIST_RELATIVE *ppidl,
446 DWORD *pdwAttributes)
447{
448 TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n",
449 this, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName),
450 pchEaten, ppidl, pdwAttributes);
451
452 if (!ppidl)
453 return E_INVALIDARG;
454
455 *ppidl = NULL;
456
457 if (!lpszDisplayName)
458 return E_INVALIDARG;
459
460 if (!*lpszDisplayName)
461 {
462 *ppidl = _ILCreateMyComputer();
463 return (*ppidl ? S_OK : E_OUTOFMEMORY);
464 }
465
466 if (lpszDisplayName[0] == ':' && lpszDisplayName[1] == ':')
467 {
468 return m_regFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl,
469 pdwAttributes);
470 }
471
472 HRESULT hr = _ParseDisplayNameByParent(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl,
473 pdwAttributes);
474 if (SUCCEEDED(hr))
475 {
476 if (BindCtx_ContainsObject(pbc, STR_PARSE_TRANSLATE_ALIASES))
477 {
478 // Use "alias" PIDL if possible
479 CComHeapPtr<ITEMIDLIST> pidlAlias;
480 if (SUCCEEDED(SHELL32_AliasTranslatePidl(*ppidl, &pidlAlias, ALIAS_ANY)))
481 {
482 ILFree(*ppidl);
483 *ppidl = pidlAlias.Detach();
484 }
485 }
486
487 TRACE ("(%p)->(-- ret=0x%08x)\n", this, hr);
488 return hr;
489 }
490
492 return hr;
493
494 if (BindCtx_ContainsObject(pbc, STR_DONT_PARSE_RELATIVE))
495 return E_INVALIDARG;
496
497 if (SHIsFileSysBindCtx(pbc, NULL) == S_OK)
498 return hr;
499
500 BIND_OPTS BindOps = { sizeof(BindOps) };
502 if (pbc && SUCCEEDED(pbc->GetBindOptions(&BindOps)) && (BindOps.grfMode & STGM_CREATE))
503 {
504 BindOps.grfMode &= ~STGM_CREATE;
505 bCreate = TRUE;
506 pbc->SetBindOptions(&BindOps);
507 }
508
510 {
511 hr = m_DesktopFSFolder->ParseDisplayName(hwndOwner,
512 pbc,
513 lpszDisplayName,
514 pchEaten,
515 ppidl,
516 pdwAttributes);
517 }
518
520 {
521 hr = m_SharedDesktopFSFolder->ParseDisplayName(hwndOwner,
522 pbc,
523 lpszDisplayName,
524 pchEaten,
525 ppidl,
526 pdwAttributes);
527 if (SUCCEEDED(hr))
528 MarkAsCommonItem(*ppidl);
529 }
530
532 {
533 BindOps.grfMode |= STGM_CREATE;
534 pbc->SetBindOptions(&BindOps);
535 hr = m_DesktopFSFolder->ParseDisplayName(hwndOwner,
536 pbc,
537 lpszDisplayName,
538 pchEaten,
539 ppidl,
540 pdwAttributes);
541 }
542
543 TRACE ("(%p)->(-- ret=0x%08x)\n", this, hr);
544
545 return hr;
546}
547
548/**************************************************************************
549 * CDesktopFolder::EnumObjects
550 */
551HRESULT WINAPI CDesktopFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
552{
553 CComPtr<IEnumIDList> pRegEnumerator;
554 CComPtr<IEnumIDList> pDesktopEnumerator;
555 CComPtr<IEnumIDList> pCommonDesktopEnumerator;
556 HRESULT hr;
557
558 hr = m_regFolder->EnumObjects(hwndOwner, dwFlags, &pRegEnumerator);
559 if (FAILED(hr))
560 ERR("EnumObjects for reg folder failed\n");
561
562 hr = m_DesktopFSFolder->EnumObjects(hwndOwner, dwFlags, &pDesktopEnumerator);
563 if (FAILED(hr))
564 ERR("EnumObjects for desktop fs folder failed\n");
565
566 hr = m_SharedDesktopFSFolder->EnumObjects(hwndOwner, dwFlags, &pCommonDesktopEnumerator);
567 if (FAILED(hr))
568 ERR("EnumObjects for shared desktop fs folder failed\n");
569
570 return ShellObjectCreatorInit<CDesktopFolderEnum>(m_regFolder, dwFlags, pRegEnumerator, pDesktopEnumerator,
571 pCommonDesktopEnumerator, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
572}
573
574/**************************************************************************
575 * CDesktopFolder::BindToObject
576 */
579 LPBC pbcReserved,
580 REFIID riid,
581 LPVOID *ppvOut)
582{
583 if (!pidl)
584 return E_INVALIDARG;
585
586 CComPtr<IShellFolder2> psf;
587 HRESULT hr = _GetSFFromPidl(pidl, &psf);
589 return hr;
590
591 return psf->BindToObject(pidl, pbcReserved, riid, ppvOut);
592}
593
594/**************************************************************************
595 * CDesktopFolder::BindToStorage
596 */
599 LPBC pbcReserved,
600 REFIID riid,
601 LPVOID *ppvOut)
602{
603 FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n",
604 this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut);
605
606 *ppvOut = NULL;
607 return E_NOTIMPL;
608}
609
610/**************************************************************************
611 * CDesktopFolder::CompareIDs
612 */
614{
615 bool bIsDesktopFolder1, bIsDesktopFolder2;
616
617 if (!pidl1 || !pidl2)
618 {
619 ERR("Got null pidl pointer (%Ix %p %p)!\n", lParam, pidl1, pidl2);
620 return E_INVALIDARG;
621 }
622
623 bIsDesktopFolder1 = _ILIsDesktop(pidl1);
624 bIsDesktopFolder2 = _ILIsDesktop(pidl2);
625 if (bIsDesktopFolder1 || bIsDesktopFolder2)
626 return MAKE_COMPARE_HRESULT(bIsDesktopFolder1 - bIsDesktopFolder2);
627
628 if (_ILIsSpecialFolder(pidl1) || _ILIsSpecialFolder(pidl2))
629 return m_regFolder->CompareIDs(lParam, pidl1, pidl2);
630
631 HRESULT ret = m_DesktopFSFolder->CompareIDs(lParam, pidl1, pidl2);
632 if (ret == 0 && ((lParam & SHCIDS_COLUMNMASK) == SHFSF_COL_NAME || (lParam & (SHCIDS_ALLFIELDS | SHCIDS_CANONICALONLY))))
634 return ret;
635}
636
637/**************************************************************************
638 * CDesktopFolder::CreateViewObject
639 */
641 HWND hwndOwner,
642 REFIID riid,
643 LPVOID *ppvOut)
644{
646
647 TRACE ("(%p)->(hwnd=%p,%s,%p)\n",
648 this, hwndOwner, shdebugstr_guid (&riid), ppvOut);
649
650 if (!ppvOut)
651 return hr;
652
653 *ppvOut = NULL;
654
655 if (IsEqualIID (riid, IID_IDropTarget))
656 {
657 hr = m_DesktopFSFolder->CreateViewObject(hwndOwner, riid, ppvOut);
658 }
659 else if (IsEqualIID (riid, IID_IContextMenu))
660 {
662 AddClassKeyToArray(L"Directory\\Background", keys, keys);
663 DEFCONTEXTMENU dcm = { hwndOwner, this, pidlRoot, this, 0, NULL, NULL, keys, keys };
664 hr = SHCreateDefaultContextMenu(&dcm, riid, ppvOut);
665 }
666 else if (IsEqualIID (riid, IID_IShellView))
667 {
668 CComPtr<CDesktopFolderViewCB> sfviewcb;
669 if (SUCCEEDED(hr = ShellObjectCreator(sfviewcb)))
670 {
671 SFV_CREATE create = { sizeof(create), this, NULL, sfviewcb };
673 if (SUCCEEDED(hr))
674 sfviewcb->Initialize((IShellView*)*ppvOut);
675 }
676 }
677 TRACE ("-- (%p)->(interface=%p)\n", this, ppvOut);
678 return hr;
679}
680
681/**************************************************************************
682 * CDesktopFolder::GetAttributesOf
683 */
685 UINT cidl,
687 DWORD *rgfInOut)
688{
689 HRESULT hr = S_OK;
690
691 TRACE("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n",
692 this, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0);
693
694 if (cidl && !apidl)
695 return E_INVALIDARG;
696
697 if (*rgfInOut == 0)
698 *rgfInOut = ~0;
699
700 if(cidl == 0)
701 *rgfInOut &= dwDesktopAttributes;
702 else
703 {
704 /* TODO: always add SFGAO_CANLINK */
705 for (UINT i = 0; i < cidl; ++i)
706 {
707 pdump(apidl[i]);
708 if (_ILIsDesktop(apidl[i]))
709 *rgfInOut &= dwDesktopAttributes;
710 else if (_ILIsMyComputer(apidl[i]))
711 *rgfInOut &= dwMyComputerAttributes;
712 else if (IsRegItem(apidl[i], CLSID_NetworkPlaces))
713 *rgfInOut &= dwMyNetPlacesAttributes;
714 else if (_ILIsFolderOrFile(apidl[i]) || _ILIsSpecialFolder(apidl[i]))
715 {
716 CComPtr<IShellFolder2> psf;
717 HRESULT hr = _GetSFFromPidl(apidl[i], &psf);
719 continue;
720
721 psf->GetAttributesOf(1, &apidl[i], rgfInOut);
722 }
723 else
724 ERR("Got an unknown pidl type!!!\n");
725 }
726 }
727 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
728 *rgfInOut &= ~SFGAO_VALIDATE;
729
730 TRACE("-- result=0x%08x\n", *rgfInOut);
731
732 return hr;
733}
734
735/**************************************************************************
736 * CDesktopFolder::GetUIObjectOf
737 *
738 * PARAMETERS
739 * HWND hwndOwner, //[in ] Parent window for any output
740 * UINT cidl, //[in ] array size
741 * LPCITEMIDLIST* apidl, //[in ] simple pidl array
742 * REFIID riid, //[in ] Requested Interface
743 * UINT* prgfInOut, //[ ] reserved
744 * LPVOID* ppvObject) //[out] Resulting Interface
745 *
746 */
748 HWND hwndOwner,
749 UINT cidl,
751 REFIID riid,
752 UINT *prgfInOut,
753 LPVOID *ppvOut)
754{
755 LPVOID pObj = NULL;
757
758 TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
759 this, hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
760
761 if (!ppvOut)
762 return hr;
763 *ppvOut = NULL;
764
765 BOOL self = IsSelf(cidl, apidl);
766 if (cidl == 1 && !_ILIsSpecialFolder(apidl[0]) && !self)
767 {
768 CComPtr<IShellFolder2> psf;
769 HRESULT hr = _GetSFFromPidl(apidl[0], &psf);
771 return hr;
772
773 return psf->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, ppvOut);
774 }
775
776 if (IsEqualIID (riid, IID_IContextMenu))
777 {
778 // FIXME: m_regFolder vs AddFSClassKeysToArray is incorrect when the selection includes both regitems and FS items
779 if (!self && cidl > 0 && _ILIsSpecialFolder(apidl[0]))
780 {
781 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
782 }
783 else
784 {
785 /* Do not use the context menu of the CFSFolder here. */
786 /* We need to pass a pointer of the CDesktopFolder so as the data object that the context menu gets is rooted to the desktop */
787 /* Otherwise operations like that involve items from both user and shared desktop will not work */
789 if (self)
790 {
791 AddClsidKeyToArray(CLSID_ShellDesktop, keys, keys);
792 AddClassKeyToArray(L"Folder", keys, keys);
793 }
794 else if (cidl > 0)
795 {
796 AddFSClassKeysToArray(cidl, apidl, keys, keys);
797 }
798
799 DEFCONTEXTMENU dcm = { hwndOwner, this, pidlRoot, this, cidl, apidl, NULL, keys, keys };
800 hr = SHCreateDefaultContextMenu(&dcm, riid, &pObj);
801 }
802 }
803 else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
804 {
805 hr = IDataObject_Constructor( hwndOwner, pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
806 }
807 else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
808 {
809 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
810 }
811 else if (IsEqualIID (riid, IID_IDropTarget) && (cidl == 1))
812 {
813 CComPtr<IShellFolder> psfChild;
814 hr = this->BindToObject(apidl[0], NULL, IID_PPV_ARG(IShellFolder, &psfChild));
816 return hr;
817
818 return psfChild->CreateViewObject(NULL, riid, ppvOut);
819 }
820 else
822
823 if (SUCCEEDED(hr) && !pObj)
825
826 *ppvOut = pObj;
827 TRACE ("(%p)->hr=0x%08x\n", this, hr);
828 return hr;
829}
830
831/**************************************************************************
832 * CDesktopFolder::GetDisplayNameOf
833 *
834 * NOTES
835 * special case: pidl = null gives desktop-name back
836 */
838{
839 TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
840 pdump (pidl);
841
842 if (!strRet)
843 return E_INVALIDARG;
844
845 if (!_ILIsPidlSimple (pidl))
846 {
847 return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
848 }
849 else if (_ILIsDesktop(pidl))
850 {
852 return SHSetStrRet(strRet, sPathTarget);
853 else
854 return m_regFolder->GetDisplayNameOf(pidl, dwFlags, strRet);
855 }
856
857 /* file system folder or file rooted at the desktop */
858 CComPtr<IShellFolder2> psf;
859 HRESULT hr = _GetSFFromPidl(pidl, &psf);
861 return hr;
862
863 return psf->GetDisplayNameOf(pidl, dwFlags, strRet);
864}
865
866/**************************************************************************
867 * CDesktopFolder::SetNameOf
868 * Changes the name of a file object or subfolder, possibly changing its item
869 * identifier in the process.
870 *
871 * PARAMETERS
872 * HWND hwndOwner, //[in ] Owner window for output
873 * LPCITEMIDLIST pidl, //[in ] simple pidl of item to change
874 * LPCOLESTR lpszName, //[in ] the items new display name
875 * DWORD dwFlags, //[in ] SHGNO formatting flags
876 * LPITEMIDLIST* ppidlOut) //[out] simple pidl returned
877 */
879 HWND hwndOwner,
880 PCUITEMID_CHILD pidl, /* simple pidl */
881 LPCOLESTR lpName,
883 PITEMID_CHILD *pPidlOut)
884{
885 CComPtr<IShellFolder2> psf;
886 HRESULT hr = _GetSFFromPidl(pidl, &psf);
888 return hr;
889
890 return psf->SetNameOf(hwndOwner, pidl, lpName, dwFlags, pPidlOut);
891}
892
894{
895 FIXME ("(%p)\n", this);
896 return E_NOTIMPL;
897}
898
900{
901 FIXME ("(%p)\n", this);
902 return E_NOTIMPL;
903}
904
906{
907 TRACE ("(%p)\n", this);
908
909 if (pSort)
910 *pSort = 0;
911 if (pDisplay)
912 *pDisplay = 0;
913
914 return S_OK;
915}
916
918{
919 HRESULT hr;
920 TRACE ("(%p)\n", this);
921
922 if (!pcsFlags)
923 return E_INVALIDARG;
924
925 hr = CFSFolder::GetDefaultFSColumnState(iColumn, *pcsFlags);
926 /*
927 // CDesktopFolder may override the flags if desired (future)
928 switch(iColumn)
929 {
930 case SHFSF_COL_FATTS:
931 *pcsFlags &= ~SHCOLSTATE_ONBYDEFAULT;
932 break;
933 }
934 */
935 return hr;
936}
937
939 const SHCOLUMNID *pscid, VARIANT *pv)
940{
941 HRESULT hr;
942 CComPtr<IShellFolder2> psf;
943 if (FAILED_UNEXPECTEDLY(hr = _GetSFFromPidl(pidl, &psf)))
944 return hr;
945 return psf->GetDetailsEx(pidl, pscid, pv);
946}
947
948/*************************************************************************
949 * Column info functions.
950 * CFSFolder.h provides defaults for us.
951 */
953{
954 /* CDesktopFolder may override the flags and/or name if desired */
955 return CFSFolder::GetFSColumnDetails(iColumn, sd);
956}
957
959 PCUITEMID_CHILD pidl,
960 UINT iColumn,
961 SHELLDETAILS *psd)
962{
963 if (!psd)
964 return E_INVALIDARG;
965
966 if (!pidl)
967 {
968 return GetColumnDetails(iColumn, *psd);
969 }
970
971 CComPtr<IShellFolder2> psf;
972 HRESULT hr = _GetSFFromPidl(pidl, &psf);
974 return hr;
975
976 hr = psf->GetDetailsOf(pidl, iColumn, psd);
978 return hr;
979
980 return hr;
981}
982
984{
985 // Note: All these folders use the same SHFSF_COL mapping (m_regFolder only handles a subset).
987 return m_DesktopFSFolder->MapColumnToSCID(column, pscid);
989 return m_SharedDesktopFSFolder->MapColumnToSCID(column, pscid);
990 if (m_regFolder)
991 return m_regFolder->MapColumnToSCID(column, pscid);
992 return E_FAIL;
993}
994
996{
997 TRACE ("(%p)\n", this);
998
999 if (!lpClassId)
1000 return E_POINTER;
1001
1002 *lpClassId = CLSID_ShellDesktop;
1003
1004 return S_OK;
1005}
1006
1008{
1009 TRACE ("(%p)->(%p)\n", this, pidl);
1010
1011 if (!pidl)
1012 return S_OK;
1013
1014 return E_INVALIDARG;
1015}
1016
1018{
1019 TRACE ("(%p)->(%p)\n", this, pidl);
1020
1021 if (!pidl)
1022 return E_INVALIDARG; /* xp doesn't have this check and crashes on NULL */
1023 *pidl = ILClone (pidlRoot);
1024 return S_OK;
1025}
1026
1028{
1029 enum { IDC_PROPERTIES };
1030 if (uMsg == DFM_INVOKECOMMAND && wParam == (pdtobj ? DFM_CMD_PROPERTIES : IDC_PROPERTIES))
1031 {
1032 if (pdtobj)
1033 {
1035 BOOL bIsSelf = _ILIsDesktop(pidl); // Context menu on Desktop item in the shell tree?
1036 ILFree(pidl);
1037 if (!bIsSelf)
1038 return SHELL32_ShowPropertiesDialog(pdtobj); // File selection
1039 }
1040 return SHELL_ExecuteControlPanelCPL(hwndOwner, L"desk.cpl") ? S_OK : E_FAIL; // Background
1041 }
1042 else if (uMsg == DFM_MERGECONTEXTMENU && !pdtobj) // Add Properties item when called for directory background
1043 {
1044 QCMINFO *pqcminfo = (QCMINFO *)lParam;
1045 HMENU hpopup = CreatePopupMenu();
1047 pqcminfo->idCmdFirst = Shell_MergeMenus(pqcminfo->hmenu, hpopup, pqcminfo->indexMenu, pqcminfo->idCmdFirst, pqcminfo->idCmdLast, MM_ADDSEPARATOR);
1048 DestroyMenu(hpopup);
1049 return S_OK;
1050 }
1051 return SHELL32_DefaultContextMenuCallBack(psf, pdtobj, uMsg);
1052}
1053
1054/*************************************************************************
1055 * CDesktopFolderViewCB
1056 */
1057
1059{
1061 return SUCCEEDED(psv->GetCurrentInfo(&settings)) && (settings.fFlags & FWF_DESKTOP);
1062}
1063
1065{
1066 enum { Uninitialized = 0, NotHosted, IsHosted };
1067 C_ASSERT(Uninitialized == 0);
1068 if (m_IsProgmanHosted == Uninitialized)
1070 return m_IsProgmanHosted == IsHosted;
1071}
1072
1074{
1075 const CLSID* pClsid;
1076 if (IsProgmanHostedBrowser() && (pClsid = IsRegItem(pidlItem)) != NULL)
1077 {
1078 const BOOL NewStart = SHELL_GetSetting(SSF_STARTPANELON, fStartPanelOn);
1079 LPCWSTR SubKey = NewStart ? L"HideDesktopIcons\\NewStartPanel" : L"HideDesktopIcons\\ClassicStartMenu";
1080 return SHELL32_IsShellFolderNamespaceItemHidden(SubKey, *pClsid) ? S_FALSE : S_OK;
1081 }
1082 return S_OK;
1083}
1084
1086{
1087 switch (uMsg)
1088 {
1089 #if ROSPOLICY_DESKTOPFOLDER_DEFLARGEICONS
1090 case SFVM_DEFVIEWMODE: // CDesktopBrowser always forces FVM_ICON.
1091 *((FOLDERVIEWMODE*)lParam) = FVM_ICON; // This sets the default for generic browsers.
1092 return S_OK;
1093 #endif
1094 case SFVM_VIEWRELEASE:
1096 return S_OK;
1097 case SFVM_GETCOMMANDDIR:
1098 {
1102 break;
1103 }
1104 }
1105 return E_NOTIMPL;
1106}
1107
1108/*************************************************************************
1109 * SHGetDesktopFolder [SHELL32.@]
1110 */
1112{
1113 HRESULT hres = S_OK;
1114 TRACE("\n");
1115
1116 if(!psf) return E_INVALIDARG;
1117 *psf = NULL;
1118 hres = CDesktopFolder::_CreatorClass::CreateInstance(NULL, IID_PPV_ARG(IShellFolder, psf));
1119
1120 TRACE("-- %p->(%p)\n",psf, *psf);
1121 return hres;
1122}
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:4823
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)
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 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
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define IDC_PROPERTIES
Definition: resource.h:32
#define SHCIDS_CANONICALONLY
Definition: shobjidl.idl:226
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
#define MAX_PATH
Definition: compat.h:34
const UINT * keys
Definition: locale.c:416
HRESULT WINAPI ParseURLW(const WCHAR *url, PARSEDURLW *result)
Definition: path.c:2831
BOOL WINAPI PathIsUNCW(const WCHAR *path)
Definition: path.c:1013
HRESULT WINAPI PathCreateFromUrlW(const WCHAR *url, WCHAR *path, DWORD *pcchPath, DWORD dwReserved)
Definition: path.c:3073
BOOL WINAPI UrlIsW(const WCHAR *url, URLIS Urlis)
Definition: path.c:4812
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2983
#define SHELL_ExecuteControlPanelCPL(hwnd, cpl)
Definition: precomp.h:218
EXTERN_C INT Shell_ParseSpecialFolder(_In_ LPCWSTR pszStart, _Out_ LPWSTR *ppch, _Out_ INT *pcch)
Definition: shellpath.c:1986
HRESULT SHGetNameAndFlagsW(_In_ LPCITEMIDLIST pidl, _In_ DWORD dwFlags, _Out_opt_ LPWSTR pszText, _In_ UINT cchBuf, _Inout_opt_ DWORD *pdwAttributes)
Definition: utils.cpp:493
BOOL BindCtx_ContainsObject(_In_ IBindCtx *pBindCtx, _In_ LPCWSTR pszName)
Definition: utils.cpp:260
HRESULT SHIsFileSysBindCtx(_In_ IBindCtx *pBindCtx, _Out_opt_ WIN32_FIND_DATAW *pFindData)
Definition: utils.cpp:293
BOOL Shell_FailForceReturn(_In_ HRESULT hr)
Definition: utils.cpp:310
EXTERN_C HRESULT SHBindToObject(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:360
HRESULT SHELL32_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdo, UINT msg)
Definition: shlfolder.cpp:624
PIDLIST_ABSOLUTE SHELL_DataObject_ILCloneFullItem(_In_ IDataObject *pDO, _In_ UINT Index)
BOOL SHSkipJunctionBinding(_In_ IBindCtx *pbc, _In_ CLSID *pclsid)
Definition: utils.cpp:281
HRESULT SHELL32_ShowPropertiesDialog(IDataObject *pdtobj)
Definition: shlfolder.cpp:616
EXTERN_C HRESULT SHELL32_AliasTranslatePidl(_In_ LPCITEMIDLIST pidl, _Out_ LPITEMIDLIST *ppidlNew, _In_ DWORD dwFlags)
Translate a PIDL to an "alias" PIDL.
Definition: utils.cpp:2185
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:3277
BOOL WINAPI SHGetSpecialFolderPathW(HWND hwndOwner, LPWSTR szPath, int nFolder, BOOL bCreate)
Definition: shellpath.c:3219
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:30
return ret
Definition: mutex.c:146
#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
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:465
static const struct access_res create[16]
Definition: package.c:7505
static const WCHAR sd[]
Definition: suminfo.c:286
static LPOLESTR
Definition: stg_prop.c:27
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
unsigned int UINT
Definition: ndis.h:50
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define STGM_CREATE
Definition: objbase.h:926
interface IBindCtx * LPBC
Definition: objfwd.h:18
HRESULT WINAPI CreateBindCtx(DWORD reserved, LPBC *ppbc)
Definition: bindctx.c:556
const GUID IID_IDataObject
LPITEMIDLIST _ILCreateMyComputer(void)
Definition: pidl.c:1805
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:1794
BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2126
LPITEMIDLIST _ILCreateNetwork(void)
Definition: pidl.c:1868
BOOL _ILIsMyComputer(LPCITEMIDLIST pidl)
Definition: pidl.c:2104
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
wcscpy
#define ALIAS_ANY
Definition: shell32_main.h:121
_In_ UINT _In_ UINT cch
Definition: shellapi.h:432
#define CSIDL_FLAG_CREATE
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:678
#define SHELL_GetSetting(pss, ssf, field)
Definition: shellutils.h:902
#define IS_SHGDN_DESKTOPABSOLUTEPARSING(flags)
Definition: shfldr.h:79
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:331
#define SHFSF_COL_NAME
Definition: shfldr.h:44
void AddFSClassKeysToArray(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:430
LSTATUS AddClsidKeyToArray(REFCLSID clsid, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:423
void WINAPI _InsertMenuItemW(HMENU hmenu, UINT indexMenu, BOOL fByPosition, UINT wID, UINT fType, LPCWSTR dwTypeData, UINT fState)
HRESULT hr
Definition: shlfolder.c:183
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:2203
_In_ int _In_ BOOL bCreate
Definition: shlobj.h:1525
#define CSIDL_DESKTOPDIRECTORY
Definition: shlobj.h:2194
#define SFVM_DEFVIEWMODE
Definition: shlobj.h:1323
#define SSF_STARTPANELON
Definition: shlobj.h:1630
#define MM_ADDSEPARATOR
Definition: shlobj.h:2534
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2618
@ FWF_DESKTOP
Definition: shobjidl.idl:647
FOLDERVIEWMODE
Definition: shobjidl.idl:677
@ FVM_ICON
Definition: shobjidl.idl:679
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:1395
UINT idCmdLast
Definition: shlobj.h:1398
UINT idCmdFirst
Definition: shlobj.h:1397
UINT indexMenu
Definition: shlobj.h:1396
LPCWSTR pszSuffix
Definition: shlwapi.h:619
UINT nScheme
Definition: shlwapi.h:621
uint16_t * PWSTR
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:2543
#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
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
#define IID_PPV_ARG(Itype, ppType)
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184