ReactOS 0.4.17-dev-470-gf9e3448
shlfolder.cpp
Go to the documentation of this file.
1/*
2 * Shell Folder stuff
3 *
4 * Copyright 1997 Marcus Meissner
5 * Copyright 1998, 1999, 2002 Juergen Schmied
6 * Copyright 2018 Katayama Hirofumi MZ
7 *
8 * IShellFolder2 and related interfaces
9 *
10 * This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
19 *
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with this library; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#include "precomp.h"
26
28
30{
31 SHCONTF Flags = SHCONTF_FOLDERS | SHCONTF_NONFOLDERS;
34 if (ss.fShowAllObjects)
35 Flags |= SHCONTF_INCLUDEHIDDEN;
36 if (ss.fShowSuperHidden)
37 Flags |= SHCONTF_INCLUDESUPERHIDDEN;
38 return Flags;
39}
40
42{
43 if (SUCCEEDED(pSF->GetAttributesOf(1, &pidl, &Query)))
44 {
45 if (Query & SFGAO_NONENUMERATED)
46 return FALSE;
47 if ((Query & SFGAO_HIDDEN) && !(Flags & SHCONTF_INCLUDEHIDDEN))
48 return FALSE;
49 if ((Query & (SFGAO_HIDDEN | SFGAO_SYSTEM)) == (SFGAO_HIDDEN | SFGAO_SYSTEM) && !(Flags & SHCONTF_INCLUDESUPERHIDDEN))
50 return FALSE;
51 if ((Flags & (SHCONTF_FOLDERS | SHCONTF_NONFOLDERS)) != (SHCONTF_FOLDERS | SHCONTF_NONFOLDERS))
52 return (Flags & SHCONTF_FOLDERS) ? (Query & SFGAO_FOLDER) : !(Query & SFGAO_FOLDER);
53 }
54 return TRUE;
55}
56
57static HRESULT
58MapSCIDToShell32FsColumn(const SHCOLUMNID *pscid, VARTYPE &vt)
59{
60 if (pscid->fmtid == FMTID_Storage)
61 {
62 switch (pscid->pid)
63 {
64 case PID_STG_NAME: vt = VT_BSTR; return SHFSF_COL_NAME;
65 case PID_STG_SIZE: vt = VT_UI8; return SHFSF_COL_SIZE;
69 }
70 }
71 if (pscid->fmtid == FMTID_SummaryInformation && pscid->pid == PIDSI_COMMENTS)
72 {
73 vt = VT_BSTR;
74 return SHFSF_COL_COMMENT;
75 }
76 return E_INVALIDARG;
77}
78
80SHELL_MapSCIDToColumn(IShellFolder2 *pSF, const SHCOLUMNID *pscid)
81{
82 for (UINT i = 0; i <= SHCIDS_COLUMNMASK; ++i)
83 {
84 SHCOLUMNID scid;
85 HRESULT hr = pSF->MapColumnToSCID(i, &scid);
86 if (FAILED(hr))
87 break;
88 if (IsEqualPropertyKey(scid, *pscid))
89 return i;
90 }
91 return E_FAIL;
92}
93
94template<class T> static inline HRESULT
96{
97 V_VT(pVar) = VT_EMPTY;
99 sd.str.uType = STRRET_CSTR;
100 HRESULT hr = pSF->GetDetailsOf(pidl, Column, &sd);
101 if (FAILED(hr))
102 return hr;
103 if (FAILED(hr = StrRetToBSTR(&sd.str, pidl, &V_BSTR(pVar))))
104 return hr;
105 V_VT(pVar) = VT_BSTR;
106 return hr;
107}
108
111{
112 return GetDetailsOfAsStringVariant(pSF, pidl, Column, pVar);
113}
114
117{
118 HRESULT hr;
121 return SHELL_GetDetailsOfAsStringVariant(pSF2, pidl, Column, pVar);
123 if (SUCCEEDED(hr = pSF->CreateViewObject(NULL, IID_PPV_ARG(IShellDetails, &pSD))))
124 return GetDetailsOfAsStringVariant(pSD, pidl, Column, pVar);
125 return hr;
126}
127
130{
131 HRESULT hr = SHELL_GetDetailsOfAsStringVariant(pSF, pidl, Column, pVar);
132 if (FAILED(hr))
133 return hr;
134 if (vt == VT_EMPTY)
135 {
137 if (FAILED(pSF->GetDefaultColumnState(Column, &state)))
140 vt = VT_I8;
142 vt = VT_DATE;
143 else
144 vt = VT_BSTR;
145 }
146 if (vt != VT_BSTR)
147 VariantChangeType(pVar, pVar, 0, vt);
148 return hr;
149}
150
152SH32_GetDetailsOfPKeyAsVariant(IShellFolder2 *pSF, PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pVar, BOOL UseFsColMap)
153{
154 // CFSFolder and CRegFolder uses the SHFSF_COL columns and can use the faster and better version,
155 // everyone else must ask the folder to map the SCID to a column.
157 HRESULT hr = UseFsColMap ? MapSCIDToShell32FsColumn(pscid, vt) : SHELL_MapSCIDToColumn(pSF, pscid);
158 return SUCCEEDED(hr) ? SHELL_GetDetailsOfColumnAsVariant(pSF, pidl, hr, vt, pVar) : hr;
159}
160
163{
164 if (!pidl)
165 return E_INVALIDARG;
167 HRESULT hr = pSF->GetUIObjectOf(NULL, 1, &pidl, IID_NULL_PPV_ARG(IQueryInfo, &pQI));
168 if (FAILED(hr))
169 return hr;
170 hr = pQI->GetInfoTip(dwFlags, ppTip); // Note: *ppTip can be NULL if there is no tip
171 return SUCCEEDED(hr) && !*ppTip ? S_FALSE : hr;
172}
173
175{
176 PIDLIST_ABSOLUTE pidlFolder;
177 HRESULT hr = SHGetIDListFromObject(pSF, &pidlFolder);
178 if (SUCCEEDED(hr))
179 {
180 hr = SHILCombine(pidlFolder, pidlChild, ppPidl);
181 ILFree(pidlFolder);
182 }
183 return hr;
184}
185
188 _Inout_ LPWSTR *ppch,
189 _Out_ LPWSTR pszOut,
190 _In_ INT cchOut,
191 _In_ BOOL bValidate)
192{
193 *pszOut = UNICODE_NULL;
194
195 if (!*ppch)
196 return S_FALSE;
197
198 HRESULT hr;
199 LPWSTR pchNext = wcschr(*ppch, L'\\');
200 if (pchNext)
201 {
202 if (*ppch < pchNext)
203 {
204 /* Get an element */
205 StringCchCopyNW(pszOut, cchOut, *ppch, pchNext - *ppch);
206 ++pchNext;
207
208 if (!*pchNext)
209 pchNext = NULL; /* No next */
210
211 hr = S_OK;
212 }
213 else /* Double backslashes found? */
214 {
215 pchNext = NULL;
217 }
218 }
219 else /* No more next */
220 {
221 StringCchCopyW(pszOut, cchOut, *ppch);
222 hr = S_OK;
223 }
224
225 *ppch = pchNext; /* Go next */
226
227 if (hr == S_OK && bValidate && !PathIsValidElement(pszOut))
228 {
229 *pszOut = UNICODE_NULL;
231 }
232
233 return hr;
234}
235
237 LPITEMIDLIST * pidlInOut, LPOLESTR szNext, DWORD * pEaten, DWORD * pdwAttributes)
238{
240 LPITEMIDLIST pidlIn = pidlInOut ? *pidlInOut : NULL;
241 LPITEMIDLIST pidlOut = NULL;
242 LPITEMIDLIST pidlTemp = NULL;
243 CComPtr<IShellFolder> psfChild;
244
245 TRACE ("(%p, %p, %p, %s)\n", psf, pbc, pidlIn, debugstr_w (szNext));
246
247 /* get the shellfolder for the child pidl and let it analyse further */
248 hr = psf->BindToObject(pidlIn, pbc, IID_PPV_ARG(IShellFolder, &psfChild));
249 if (FAILED(hr))
250 return hr;
251
252 hr = psfChild->ParseDisplayName(hwndOwner, pbc, szNext, pEaten, &pidlOut, pdwAttributes);
253 if (FAILED(hr))
254 return hr;
255
256 pidlTemp = ILCombine (pidlIn, pidlOut);
257 if (!pidlTemp)
258 {
260 if (pidlOut)
261 ILFree(pidlOut);
262 return hr;
263 }
264
265 if (pidlOut)
266 ILFree (pidlOut);
267
268 if (pidlIn)
269 ILFree (pidlIn);
270
271 *pidlInOut = pidlTemp;
272
273 TRACE ("-- pidl=%p ret=0x%08x\n", pidlInOut ? *pidlInOut : NULL, hr);
274 return S_OK;
275}
276
277/***********************************************************************
278 * SHELL32_CoCreateInitSF
279 *
280 * Creates a shell folder and initializes it with a pidl and a root folder
281 * via IPersistFolder3 or IPersistFolder.
282 *
283 * NOTES
284 * pathRoot can be NULL for Folders being a drive.
285 * In this case the absolute path is built from pidlChild (eg. C:)
286 */
287HRESULT SHELL32_CoCreateInitSF (LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO* ppfti,
288 LPCITEMIDLIST pidlChild, const GUID* clsid, REFIID riid, LPVOID *ppvOut)
289{
290 HRESULT hr;
291 CComPtr<IShellFolder> pShellFolder;
292
294 if (FAILED(hr))
295 return hr;
296
297 LPITEMIDLIST pidlAbsolute = ILCombine (pidlRoot, pidlChild);
300
301 if (ppfti && SUCCEEDED(pShellFolder->QueryInterface(IID_PPV_ARG(IPersistFolder3, &ppf3))))
302 {
303 ppf3->InitializeEx(NULL, pidlAbsolute, ppfti);
304 }
305 else if (SUCCEEDED(pShellFolder->QueryInterface(IID_PPV_ARG(IPersistFolder, &ppf))))
306 {
307 ppf->Initialize(pidlAbsolute);
308 }
309 ILFree (pidlAbsolute);
310
311 return pShellFolder->QueryInterface(riid, ppvOut);
312}
313
315 int csidl, REFIID riid, LPVOID *ppvOut)
316{
317 /* fill the PERSIST_FOLDER_TARGET_INFO */
318 PERSIST_FOLDER_TARGET_INFO pfti = {0};
319 pfti.dwAttributes = -1;
320 pfti.csidl = csidl;
321
322 return SHELL32_CoCreateInitSF(pidlRoot, &pfti, NULL, clsid, riid, ppvOut);
323}
324
325HRESULT SHELL32_BindToSF (LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO* ppfti,
326 LPCITEMIDLIST pidl, const GUID* clsid, REFIID riid, LPVOID *ppvOut)
327{
328 PITEMID_CHILD pidlChild = ILCloneFirst (pidl);
329 if (!pidlChild)
330 return E_FAIL;
331
334 ppfti,
335 pidlChild,
336 clsid,
338 ILFree(pidlChild);
339
341 return hr;
342
343 if (_ILIsPidlSimple (pidl))
344 return psf->QueryInterface(riid, ppvOut);
345 else
346 return psf->BindToObject(ILGetNext (pidl), NULL, riid, ppvOut);
347}
348
349/***********************************************************************
350 * SHELL32_GetDisplayNameOfChild
351 *
352 * Retrieves the display name of a child object of a shellfolder.
353 *
354 * For a pidl eg. [subpidl1][subpidl2][subpidl3]:
355 * - it binds to the child shellfolder [subpidl1]
356 * - asks it for the displayname of [subpidl2][subpidl3]
357 *
358 * Is possible the pidl is a simple pidl. In this case it asks the
359 * subfolder for the displayname of an empty pidl. The subfolder
360 * returns the own displayname eg. "::{guid}". This is used for
361 * virtual folders with the registry key WantsFORPARSING set.
362 */
364 LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
365{
366 LPITEMIDLIST pidlFirst = ILCloneFirst(pidl);
367 if (!pidlFirst)
368 return E_OUTOFMEMORY;
369
370 CComPtr<IShellFolder> psfChild;
371 HRESULT hr = psf->BindToObject(pidlFirst, NULL, IID_PPV_ARG(IShellFolder, &psfChild));
372 if (SUCCEEDED (hr))
373 {
374 hr = psfChild->GetDisplayNameOf(ILGetNext (pidl), dwFlags, strRet);
375 }
376 ILFree (pidlFirst);
377
378 return hr;
379}
380
382{
383 PUIDLIST_RELATIVE nextpidl1 = ILGetNext (pidl1);
384 PUIDLIST_RELATIVE nextpidl2 = ILGetNext (pidl2);
385
386 bool isEmpty1 = _ILIsDesktop(nextpidl1);
387 bool isEmpty2 = _ILIsDesktop(nextpidl2);
388 if (isEmpty1 || isEmpty2)
389 return MAKE_COMPARE_HRESULT(isEmpty2 - isEmpty1);
390
391 PITEMID_CHILD firstpidl = ILCloneFirst (pidl1);
392 if (!firstpidl)
393 return E_OUTOFMEMORY;
394
396 HRESULT hr = psf->BindToObject(firstpidl, 0, IID_PPV_ARG(IShellFolder, &psf2));
397 ILFree(firstpidl);
398 if (FAILED(hr))
399 return MAKE_COMPARE_HRESULT(0);
400
401 return psf2->CompareIDs(lParam, nextpidl1, nextpidl2);
402}
403
405{
407 WCHAR wszItem1[MAX_PATH], wszItem2[MAX_PATH];
409 UINT col = LOWORD(lParam); // Column index without SHCIDS_* flags
410
411 hres = isf->GetDetailsOf(pidl1, col, &sd);
412 if (FAILED(hres))
413 return MAKE_COMPARE_HRESULT(1);
414
415 hres = StrRetToBufW(&sd.str, pidl1, wszItem1, MAX_PATH);
416 if (FAILED(hres))
417 return MAKE_COMPARE_HRESULT(1);
418
419 hres = isf->GetDetailsOf(pidl2, col, &sd);
420 if (FAILED(hres))
421 return MAKE_COMPARE_HRESULT(1);
422
423 hres = StrRetToBufW(&sd.str, pidl2, wszItem2, MAX_PATH);
424 if (FAILED(hres))
425 return MAKE_COMPARE_HRESULT(1);
426
427 int ret = CFSFolder::CompareUiStrings(wszItem1, wszItem2, lParam);
428 if (ret == 0)
429 return SHELL32_CompareChildren(isf, lParam, pidl1, pidl2);
430
432}
433
435{
436 for (UINT i = 0; i < cKeys; ++i)
438}
439
441{
442 if (*cKeys >= 16)
443 return ERROR_MORE_DATA;
444
445 HKEY hkey;
447 if (result == ERROR_SUCCESS)
448 {
449 array[*cKeys] = hkey;
450 *cKeys += 1;
451 }
452 return result;
453}
454
456{
457 WCHAR path[6 + 38 + 1] = L"CLSID\\";
458 StringFromGUID2(clsid, path + 6, 38 + 1);
459 return AddClassKeyToArray(path, array, cKeys);
460}
461
463{
464 // This function opens the association array keys in canonical order for filesystem items.
465 // The order is documented: learn.microsoft.com/en-us/windows/win32/shell/fa-associationarray
466
467 ASSERT(cidl >= 1 && apidl);
468 PCUITEMID_CHILD pidl = apidl[0];
469 if (_ILIsValue(pidl))
470 {
472 PWSTR name;
473 FileStructW* pFileData = _ILGetFileStructW(pidl);
474 if (pFileData)
475 {
476 name = pFileData->wszName;
477 }
478 else
479 {
481 name = buf;
482 }
483 LPCWSTR extension = PathFindExtension(name);
484
485 if (extension)
486 {
487 WCHAR wszClass[MAX_PATH], wszSFA[23 + _countof(wszClass)];
488 DWORD dwSize = sizeof(wszClass);
489 if (RegGetValueW(HKEY_CLASSES_ROOT, extension, NULL, RRF_RT_REG_SZ, NULL, wszClass, &dwSize) != ERROR_SUCCESS ||
490 !*wszClass || AddClassKeyToArray(wszClass, array, cKeys) != ERROR_SUCCESS)
491 {
492 // Only add the extension key if the ProgId is not valid
493 AddClassKeyToArray(extension, array, cKeys);
494
495 // "Open With" becomes the default when there are no verbs in the above keys
496 if (cidl == 1)
497 AddClassKeyToArray(L"Unknown", array, cKeys);
498 }
499
500 _swprintf(wszSFA, L"SystemFileAssociations\\%s", extension);
501 AddClassKeyToArray(wszSFA, array, cKeys);
502
503 dwSize = sizeof(wszClass);
504 if (RegGetValueW(HKEY_CLASSES_ROOT, extension, L"PerceivedType", RRF_RT_REG_SZ, NULL, wszClass, &dwSize) == ERROR_SUCCESS)
505 {
506 _swprintf(wszSFA, L"SystemFileAssociations\\%s", wszClass);
507 AddClassKeyToArray(wszSFA, array, cKeys);
508 }
509 }
510
511 AddClassKeyToArray(L"*", array, cKeys);
512 AddClassKeyToArray(L"AllFilesystemObjects", array, cKeys);
513 }
514 else if (_ILIsFolder(pidl))
515 {
516 // FIXME: Directory > Folder > AFO is the correct order and it's
517 // the order Windows reports in its undocumented association array
518 // but it is somehow not the order Windows adds the items to its menu!
519 // Until the correct algorithm in CDefaultContextMenu can be determined,
520 // we add the folder keys in "menu order".
521 AddClassKeyToArray(L"Folder", array, cKeys);
522 AddClassKeyToArray(L"AllFilesystemObjects", array, cKeys);
523 AddClassKeyToArray(L"Directory", array, cKeys);
524 }
525 else if (_ILIsDrive(pidl))
526 {
527 AddClassKeyToArray(L"Drive", array, cKeys);
528 AddClassKeyToArray(L"Folder", array, cKeys);
529 }
530 else
531 {
532 ERR("Got non FS pidl\n");
533 }
534}
535
537{
538 if ((pidl = ILFindLastID(pidl)) != NULL)
539 AddFSClassKeysToArray(1, &pidl, array, cKeys);
540}
541
542HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE* ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
543{
544 CDataObjectHIDA cida(pDataObject);
545
546 if (FAILED_UNEXPECTEDLY(cida.hr()))
547 return cida.hr();
548
549 /* convert the data into pidl */
550 LPITEMIDLIST pidl;
551 LPITEMIDLIST *apidl = _ILCopyCidaToaPidl(&pidl, cida);
552 if (!apidl)
553 {
554 return E_OUTOFMEMORY;
555 }
556
557 *ppidlfolder = pidl;
558 *apidlItems = apidl;
559 *pcidl = cida->cidl;
560
561 return S_OK;
562}
563
564/***********************************************************************
565 * SHCreateLinks
566 *
567 * Undocumented.
568 */
570 UINT uFlags, LPITEMIDLIST *lppidlLinks)
571{
572 FIXME("%p %s %p %08x %p\n", hWnd, lpszDir, lpDataObject, uFlags, lppidlLinks);
573 return E_NOTIMPL;
574}
575
576/***********************************************************************
577 * SHOpenFolderAndSelectItems
578 *
579 * Unimplemented.
580 */
582WINAPI
584 UINT cidl,
587{
588 ERR("SHOpenFolderAndSelectItems() is hackplemented\n");
590 PCIDLIST_ABSOLUTE pidlItem;
591 if (cidl)
592 {
593 /* Firefox sends a full pidl here dispite the fact it is a PCUITEMID_CHILD_ARRAY -_- */
594 if (!ILIsSingle(apidl[0]))
595 {
596 pidlItem = apidl[0];
597 }
598 else
599 {
600 HRESULT hr = SHILCombine(pidlFolder, apidl[0], &pidlItem);
602 return hr;
603 freeItem.Attach(const_cast<PIDLIST_ABSOLUTE>(pidlItem));
604 }
605 }
606 else
607 {
608 pidlItem = pidlFolder;
609 }
610
611 CComPtr<IShellFolder> psfDesktop;
612
613 HRESULT hr = SHGetDesktopFolder(&psfDesktop);
615 return hr;
616
617 STRRET strret;
618 hr = psfDesktop->GetDisplayNameOf(pidlItem, SHGDN_FORPARSING, &strret);
620 return hr;
621
622 WCHAR wszBuf[MAX_PATH];
623 hr = StrRetToBufW(&strret, pidlItem, wszBuf, _countof(wszBuf));
625 return hr;
626
627 WCHAR wszParams[MAX_PATH];
628 wcscpy(wszParams, L"/select,");
629 wcscat(wszParams, wszBuf);
630
632 memset(&sei, 0, sizeof sei);
633 sei.cbSize = sizeof sei;
635 sei.lpFile = L"explorer.exe";
636 sei.lpParameters = wszParams;
637
638 if (ShellExecuteExW(&sei))
639 return S_OK;
640 else
641 return E_FAIL;
642}
643
644/*
645 * for internal use
646 */
649{
650 if (!pdtobj)
651 return E_INVALIDARG;
653}
654
657{
658 switch (msg)
659 {
661 return S_OK; // Yes, I want verbs
663 return S_FALSE; // Do it for me please
665 return S_FALSE; // Supposedly "required for Windows 7 to pick a default"
666 }
667 return E_NOTIMPL;
668}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
static int state
Definition: maze.c:121
#define msg(x)
Definition: auth_time.c:54
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
BOOL Query(LPCTSTR *ServiceArgs, DWORD ArgCount, BOOL bExtended)
Definition: query.c:292
#define FIXME(fmt,...)
Definition: precomp.h:53
#define ERR(fmt,...)
Definition: precomp.h:57
#define EXTERN_C
Definition: basetyps.h:12
#define RegCloseKey(hKey)
Definition: registry.h:49
static int CompareUiStrings(LPCWSTR a, LPCWSTR b, LPARAM lParam=0)
Definition: CFSFolder.h:132
void Attach(T *lp)
Definition: atlalloc.h:162
LPARAM lParam
Definition: combotst.c:139
#define ERROR_MORE_DATA
Definition: dderror.h:13
#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
HRESULT hr
Definition: delayimp.cpp:582
#define ERROR_SUCCESS
Definition: deptool.c:10
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define SFGAO_SYSTEM
Definition: shobjidl.idl:198
#define DFM_GETDEFSTATICID
Definition: precomp.h:47
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
Definition: reg.c:1931
UINT uFlags
Definition: api.c:59
INT WINAPI StringFromGUID2(REFGUID guid, LPOLESTR str, INT cmax)
Definition: combase.c:1525
#define wcschr
Definition: compat.h:17
#define MAX_PATH
Definition: compat.h:34
unsigned short VARTYPE
Definition: compat.h:2254
@ VT_UI8
Definition: compat.h:2315
@ VT_BSTR
Definition: compat.h:2303
@ VT_I8
Definition: compat.h:2314
@ VT_DATE
Definition: compat.h:2302
@ VT_EMPTY
Definition: compat.h:2295
static REFPROPVARIANT PROPVAR_CHANGE_FLAGS VARTYPE vt
Definition: suminfo.c:91
BOOL PathIsValidElement(_In_ LPCWSTR pszPath)
Definition: utils.cpp:240
HRESULT WINAPI SHCoCreateInstance(LPCWSTR aclsid, const CLSID *clsid, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppv)
Definition: shellole.c:197
HRESULT WINAPI StrRetToBSTR(STRRET *lpStrRet, LPCITEMIDLIST pidl, BSTR *pBstrOut)
Definition: string.c:418
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
Definition: string.c:248
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:33
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
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
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint64EXT * result
Definition: glext.h:11304
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
#define ss
Definition: i386-dis.c:441
REFIID riid
Definition: atlbase.h:39
HRESULT GetDetailsOf([in] PCUITEMID_CHILD pidl, [in] UINT iColumn, [out] SHELLDETAILS *psd)
HRESULT MapColumnToSCID([in] UINT iColumn, [in] SHCOLUMNID *pscid)
HRESULT GetDefaultColumnState([in] UINT iColumn, [out] SHCOLSTATEF *pcsFlags)
HRESULT CreateViewObject([in] HWND hwndOwner, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut)
HRESULT BindToObject([in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut)
HRESULT GetAttributesOf([in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in, out] SFGAOF *rgfInOut)
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_ShowFilesystemItemsPropertiesDialogAsync(HWND hOwner, IDataObject *pDO)
Definition: item_prop.cpp:183
#define debugstr_w
Definition: kernel32.h:32
LONG_PTR LPARAM
Definition: minwindef.h:175
#define ASSERT(a)
Definition: mode.c:44
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
#define _swprintf(buf, format,...)
Definition: sprintf.c:56
HRESULT hres
Definition: protocol.c:465
static const WCHAR sd[]
Definition: suminfo.c:286
static SHCONTF
Definition: ordinal.c:61
const CLSID * clsid
Definition: msctf.cpp:50
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define _Inout_
Definition: no_sal2.h:162
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define KEY_READ
Definition: nt_native.h:1026
#define KEY_QUERY_VALUE
Definition: nt_native.h:1019
#define UNICODE_NULL
#define PID_STG_STORAGETYPE
Definition: ntquery.h:50
#define PID_STG_WRITETIME
Definition: ntquery.h:60
#define PID_STG_SIZE
Definition: ntquery.h:58
#define PID_STG_ATTRIBUTES
Definition: ntquery.h:59
#define PID_STG_NAME
Definition: ntquery.h:56
interface IBindCtx * LPBC
Definition: objfwd.h:18
const FMTID FMTID_SummaryInformation
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
#define LOWORD(l)
Definition: pedump.c:82
short WCHAR
Definition: pedump.c:58
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1051
LPITEMIDLIST * _ILCopyCidaToaPidl(LPITEMIDLIST *pidl, const CIDA *cida)
Definition: pidl.c:2654
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:199
HRESULT WINAPI SHGetIDListFromObject(IUnknown *punk, PIDLIST_ABSOLUTE *ppidl)
Definition: pidl.c:1680
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:817
LPITEMIDLIST WINAPI ILCloneFirst(LPCITEMIDLIST pidl)
Definition: pidl.c:263
FileStructW * _ILGetFileStructW(LPCITEMIDLIST pidl)
Definition: pidl.c:2450
BOOL _ILIsFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2144
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
Definition: pidl.c:977
BOOL _ILIsValue(LPCITEMIDLIST pidl)
Definition: pidl.c:2151
BOOL _ILIsDrive(LPCITEMIDLIST pidl)
Definition: pidl.c:2137
DWORD _ILSimpleGetTextW(LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
Definition: pidl.c:2198
#define IsEqualPropertyKey(a, b)
Definition: propkeydef.h:52
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
#define PathFindExtension
Definition: shlwapi.h:468
wcscat
wcscpy
#define memset(x, y, z)
Definition: compat.h:39
#define SEE_MASK_WAITFORINPUTIDLE
Definition: shellapi.h:52
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
VOID WINAPI SHGetSetSettings(LPSHELLSTATE lpss, DWORD dwMask, BOOL bSet)
Definition: shellord.c:225
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:686
static BOOL ILIsSingle(LPCITEMIDLIST pidl)
Definition: shellutils.h:711
#define SHFSF_COL_COMMENT
Definition: shfldr.h:49
#define SHFSF_COL_SIZE
Definition: shfldr.h:45
#define SHFSF_COL_NAME
Definition: shfldr.h:44
#define SHFSF_COL_TYPE
Definition: shfldr.h:46
#define SHFSF_COL_FATTS
Definition: shfldr.h:48
#define SHFSF_COL_MDATE
Definition: shfldr.h:47
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2723
HRESULT SH32_GetDetailsOfPKeyAsVariant(IShellFolder2 *pSF, PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pVar, BOOL UseFsColMap)
Definition: shlfolder.cpp:152
HRESULT SHELL32_CoCreateInitSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidlChild, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:287
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:325
HRESULT SHELL_CreateAbsolutePidl(IShellFolder *pSF, PCUIDLIST_RELATIVE pidlChild, PIDLIST_ABSOLUTE *ppPidl)
Definition: shlfolder.cpp:174
HRESULT SHELL_QueryInfoTipAlloc(_In_ IShellFolder *pSF, _In_ DWORD dwFlags, _In_ LPCITEMIDLIST pidl, _Out_ PWSTR *ppTip)
Definition: shlfolder.cpp:162
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:363
SHCONTF SHELL_GetDefaultFolderEnumSHCONTF()
Definition: shlfolder.cpp:29
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:381
void AddFSClassKeysToArray(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:462
HRESULT SHELL_GetDetailsOfAsStringVariant(IShellFolder2 *pSF, PCUITEMID_CHILD pidl, UINT Column, VARIANT *pVar)
Definition: shlfolder.cpp:110
static HRESULT GetDetailsOfAsStringVariant(T &pSF, PCUITEMID_CHILD pidl, UINT Column, VARIANT *pVar)
Definition: shlfolder.cpp:95
LSTATUS AddClsidKeyToArray(REFCLSID clsid, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:455
LSTATUS AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:440
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:404
HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE *ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
Definition: shlfolder.cpp:542
void CloseRegKeyArray(HKEY *array, UINT cKeys)
Definition: shlfolder.cpp:434
static HRESULT MapSCIDToShell32FsColumn(const SHCOLUMNID *pscid, VARTYPE &vt)
Definition: shlfolder.cpp:58
BOOL SHELL_IncludeItemInFolderEnum(IShellFolder *pSF, PCUITEMID_CHILD pidl, SFGAOF Query, SHCONTF Flags)
Definition: shlfolder.cpp:41
void AddPidlClassKeysToArray(LPCITEMIDLIST pidl, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:536
HRESULT Shell_NextElement(_Inout_ LPWSTR *ppch, _Out_ LPWSTR pszOut, _In_ INT cchOut, _In_ BOOL bValidate)
Definition: shlfolder.cpp:187
EXTERN_C HRESULT WINAPI SHOpenFolderAndSelectItems(PCIDLIST_ABSOLUTE pidlFolder, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD dwFlags)
Definition: shlfolder.cpp:583
HRESULT SHELL32_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdo, UINT msg)
Definition: shlfolder.cpp:656
HRESULT SHELL32_ParseNextElement(IShellFolder2 *psf, HWND hwndOwner, LPBC pbc, LPITEMIDLIST *pidlInOut, LPOLESTR szNext, DWORD *pEaten, DWORD *pdwAttributes)
Definition: shlfolder.cpp:236
HRESULT SHELL_MapSCIDToColumn(IShellFolder2 *pSF, const SHCOLUMNID *pscid)
Definition: shlfolder.cpp:80
HRESULT SHELL_GetDetailsOfColumnAsVariant(IShellFolder2 *pSF, PCUITEMID_CHILD pidl, UINT Column, VARTYPE vt, VARIANT *pVar)
Definition: shlfolder.cpp:129
HRESULT SHELL32_ShowPropertiesDialog(IDataObject *pdtobj)
Definition: shlfolder.cpp:648
HRESULT WINAPI SHCreateLinks(HWND hWnd, LPCSTR lpszDir, IDataObject *lpDataObject, UINT uFlags, LPITEMIDLIST *lppidlLinks)
Definition: shlfolder.cpp:569
#define SSF_SHOWSUPERHIDDEN
Definition: shlobj.h:1637
#define SSF_SHOWALLOBJECTS
Definition: shlobj.h:1621
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
ITEMID_CHILD UNALIGNED * PUITEMID_CHILD
Definition: shtypes.idl:68
@ STRRET_CSTR
Definition: shtypes.idl:87
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
@ SHCOLSTATE_TYPE_INT
Definition: shtypes.idl:122
@ SHCOLSTATE_TYPEMASK
Definition: shtypes.idl:124
@ SHCOLSTATE_TYPE_DATE
Definition: shtypes.idl:123
@ SHCOLSTATE_TYPE_STR
Definition: shtypes.idl:121
const ITEMIDLIST_RELATIVE UNALIGNED * PCUIDLIST_RELATIVE
Definition: shtypes.idl:57
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
DWORD SHCOLSTATEF
Definition: shtypes.idl:142
ITEMIDLIST_RELATIVE UNALIGNED * PUIDLIST_RELATIVE
Definition: shtypes.idl:55
#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
STRSAFEAPI StringCchCopyNW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc, size_t cchToCopy)
Definition: strsafe.h:236
WCHAR wszName[1]
Definition: shlfolder.c:1557
LPCWSTR lpParameters
Definition: shellapi.h:339
Definition: undname.c:54
Definition: name.c:39
uint16_t * PWSTR
Definition: typedefs.h:56
const char * LPCSTR
Definition: typedefs.h:52
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
int32_t INT
Definition: typedefs.h:58
HRESULT WINAPI DECLSPEC_HOTPATCH VariantChangeType(VARIANTARG *pvargDest, VARIANTARG *pvargSrc, USHORT wFlags, VARTYPE vt)
Definition: variant.c:962
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
#define RRF_RT_REG_SZ
Definition: winreg.h:58
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define IID_PPV_ARG(Itype, ppType)
#define IID_NULL_PPV_ARG(Itype, ppType)