ReactOS 0.4.16-dev-1146-gc477928
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
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 HRESULT hr = SHELL_GetDetailsOfAsStringVariant(pSF, pidl, Column, pVar);
113 if (FAILED(hr))
114 return hr;
115 if (vt == VT_EMPTY)
116 {
118 if (FAILED(pSF->GetDefaultColumnState(Column, &state)))
121 vt = VT_I8;
123 vt = VT_DATE;
124 else
125 vt = VT_BSTR;
126 }
127 if (vt != VT_BSTR)
128 VariantChangeType(pVar, pVar, 0, vt);
129 return hr;
130}
131
133SH32_GetDetailsOfPKeyAsVariant(IShellFolder2 *pSF, PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pVar, BOOL UseFsColMap)
134{
135 // CFSFolder and CRegFolder uses the SHFSF_COL columns and can use the faster and better version,
136 // everyone else must ask the folder to map the SCID to a column.
138 HRESULT hr = UseFsColMap ? MapSCIDToShell32FsColumn(pscid, vt) : SHELL_MapSCIDToColumn(pSF, pscid);
139 return SUCCEEDED(hr) ? SHELL_GetDetailsOfColumnAsVariant(pSF, pidl, hr, vt, pVar) : hr;
140}
141
143{
144 PIDLIST_ABSOLUTE pidlFolder;
145 HRESULT hr = SHGetIDListFromObject(pSF, &pidlFolder);
146 if (SUCCEEDED(hr))
147 {
148 hr = SHILCombine(pidlFolder, pidlChild, ppPidl);
149 ILFree(pidlFolder);
150 }
151 return hr;
152}
153
156 _Inout_ LPWSTR *ppch,
157 _Out_ LPWSTR pszOut,
158 _In_ INT cchOut,
159 _In_ BOOL bValidate)
160{
161 *pszOut = UNICODE_NULL;
162
163 if (!*ppch)
164 return S_FALSE;
165
166 HRESULT hr;
167 LPWSTR pchNext = wcschr(*ppch, L'\\');
168 if (pchNext)
169 {
170 if (*ppch < pchNext)
171 {
172 /* Get an element */
173 StringCchCopyNW(pszOut, cchOut, *ppch, pchNext - *ppch);
174 ++pchNext;
175
176 if (!*pchNext)
177 pchNext = NULL; /* No next */
178
179 hr = S_OK;
180 }
181 else /* Double backslashes found? */
182 {
183 pchNext = NULL;
185 }
186 }
187 else /* No more next */
188 {
189 StringCchCopyW(pszOut, cchOut, *ppch);
190 hr = S_OK;
191 }
192
193 *ppch = pchNext; /* Go next */
194
195 if (hr == S_OK && bValidate && !PathIsValidElement(pszOut))
196 {
197 *pszOut = UNICODE_NULL;
199 }
200
201 return hr;
202}
203
205 LPITEMIDLIST * pidlInOut, LPOLESTR szNext, DWORD * pEaten, DWORD * pdwAttributes)
206{
208 LPITEMIDLIST pidlIn = pidlInOut ? *pidlInOut : NULL;
209 LPITEMIDLIST pidlOut = NULL;
210 LPITEMIDLIST pidlTemp = NULL;
211 CComPtr<IShellFolder> psfChild;
212
213 TRACE ("(%p, %p, %p, %s)\n", psf, pbc, pidlIn, debugstr_w (szNext));
214
215 /* get the shellfolder for the child pidl and let it analyse further */
216 hr = psf->BindToObject(pidlIn, pbc, IID_PPV_ARG(IShellFolder, &psfChild));
217 if (FAILED(hr))
218 return hr;
219
220 hr = psfChild->ParseDisplayName(hwndOwner, pbc, szNext, pEaten, &pidlOut, pdwAttributes);
221 if (FAILED(hr))
222 return hr;
223
224 pidlTemp = ILCombine (pidlIn, pidlOut);
225 if (!pidlTemp)
226 {
228 if (pidlOut)
229 ILFree(pidlOut);
230 return hr;
231 }
232
233 if (pidlOut)
234 ILFree (pidlOut);
235
236 if (pidlIn)
237 ILFree (pidlIn);
238
239 *pidlInOut = pidlTemp;
240
241 TRACE ("-- pidl=%p ret=0x%08x\n", pidlInOut ? *pidlInOut : NULL, hr);
242 return S_OK;
243}
244
245/***********************************************************************
246 * SHELL32_CoCreateInitSF
247 *
248 * Creates a shell folder and initializes it with a pidl and a root folder
249 * via IPersistFolder3 or IPersistFolder.
250 *
251 * NOTES
252 * pathRoot can be NULL for Folders being a drive.
253 * In this case the absolute path is built from pidlChild (eg. C:)
254 */
255HRESULT SHELL32_CoCreateInitSF (LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO* ppfti,
256 LPCITEMIDLIST pidlChild, const GUID* clsid, REFIID riid, LPVOID *ppvOut)
257{
258 HRESULT hr;
259 CComPtr<IShellFolder> pShellFolder;
260
262 if (FAILED(hr))
263 return hr;
264
265 LPITEMIDLIST pidlAbsolute = ILCombine (pidlRoot, pidlChild);
268
269 if (ppfti && SUCCEEDED(pShellFolder->QueryInterface(IID_PPV_ARG(IPersistFolder3, &ppf3))))
270 {
271 ppf3->InitializeEx(NULL, pidlAbsolute, ppfti);
272 }
273 else if (SUCCEEDED(pShellFolder->QueryInterface(IID_PPV_ARG(IPersistFolder, &ppf))))
274 {
275 ppf->Initialize(pidlAbsolute);
276 }
277 ILFree (pidlAbsolute);
278
279 return pShellFolder->QueryInterface(riid, ppvOut);
280}
281
283 int csidl, REFIID riid, LPVOID *ppvOut)
284{
285 /* fill the PERSIST_FOLDER_TARGET_INFO */
286 PERSIST_FOLDER_TARGET_INFO pfti = {0};
287 pfti.dwAttributes = -1;
288 pfti.csidl = csidl;
289
290 return SHELL32_CoCreateInitSF(pidlRoot, &pfti, NULL, clsid, riid, ppvOut);
291}
292
293HRESULT SHELL32_BindToSF (LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO* ppfti,
294 LPCITEMIDLIST pidl, const GUID* clsid, REFIID riid, LPVOID *ppvOut)
295{
296 PITEMID_CHILD pidlChild = ILCloneFirst (pidl);
297 if (!pidlChild)
298 return E_FAIL;
299
302 ppfti,
303 pidlChild,
304 clsid,
306 ILFree(pidlChild);
307
309 return hr;
310
311 if (_ILIsPidlSimple (pidl))
312 return psf->QueryInterface(riid, ppvOut);
313 else
314 return psf->BindToObject(ILGetNext (pidl), NULL, riid, ppvOut);
315}
316
317/***********************************************************************
318 * SHELL32_GetDisplayNameOfChild
319 *
320 * Retrieves the display name of a child object of a shellfolder.
321 *
322 * For a pidl eg. [subpidl1][subpidl2][subpidl3]:
323 * - it binds to the child shellfolder [subpidl1]
324 * - asks it for the displayname of [subpidl2][subpidl3]
325 *
326 * Is possible the pidl is a simple pidl. In this case it asks the
327 * subfolder for the displayname of an empty pidl. The subfolder
328 * returns the own displayname eg. "::{guid}". This is used for
329 * virtual folders with the registry key WantsFORPARSING set.
330 */
332 LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
333{
334 LPITEMIDLIST pidlFirst = ILCloneFirst(pidl);
335 if (!pidlFirst)
336 return E_OUTOFMEMORY;
337
338 CComPtr<IShellFolder> psfChild;
339 HRESULT hr = psf->BindToObject(pidlFirst, NULL, IID_PPV_ARG(IShellFolder, &psfChild));
340 if (SUCCEEDED (hr))
341 {
342 hr = psfChild->GetDisplayNameOf(ILGetNext (pidl), dwFlags, strRet);
343 }
344 ILFree (pidlFirst);
345
346 return hr;
347}
348
350{
351 PUIDLIST_RELATIVE nextpidl1 = ILGetNext (pidl1);
352 PUIDLIST_RELATIVE nextpidl2 = ILGetNext (pidl2);
353
354 bool isEmpty1 = _ILIsDesktop(nextpidl1);
355 bool isEmpty2 = _ILIsDesktop(nextpidl2);
356 if (isEmpty1 || isEmpty2)
357 return MAKE_COMPARE_HRESULT(isEmpty2 - isEmpty1);
358
359 PITEMID_CHILD firstpidl = ILCloneFirst (pidl1);
360 if (!firstpidl)
361 return E_OUTOFMEMORY;
362
364 HRESULT hr = psf->BindToObject(firstpidl, 0, IID_PPV_ARG(IShellFolder, &psf2));
365 ILFree(firstpidl);
366 if (FAILED(hr))
367 return MAKE_COMPARE_HRESULT(0);
368
369 return psf2->CompareIDs(lParam, nextpidl1, nextpidl2);
370}
371
373{
375 WCHAR wszItem1[MAX_PATH], wszItem2[MAX_PATH];
377 UINT col = LOWORD(lParam); // Column index without SHCIDS_* flags
378
379 hres = isf->GetDetailsOf(pidl1, col, &sd);
380 if (FAILED(hres))
381 return MAKE_COMPARE_HRESULT(1);
382
383 hres = StrRetToBufW(&sd.str, pidl1, wszItem1, MAX_PATH);
384 if (FAILED(hres))
385 return MAKE_COMPARE_HRESULT(1);
386
387 hres = isf->GetDetailsOf(pidl2, col, &sd);
388 if (FAILED(hres))
389 return MAKE_COMPARE_HRESULT(1);
390
391 hres = StrRetToBufW(&sd.str, pidl2, wszItem2, MAX_PATH);
392 if (FAILED(hres))
393 return MAKE_COMPARE_HRESULT(1);
394
395 int ret = CFSFolder::CompareUiStrings(wszItem1, wszItem2, lParam);
396 if (ret == 0)
397 return SHELL32_CompareChildren(isf, lParam, pidl1, pidl2);
398
400}
401
403{
404 for (UINT i = 0; i < cKeys; ++i)
406}
407
409{
410 if (*cKeys >= 16)
411 return ERROR_MORE_DATA;
412
413 HKEY hkey;
415 if (result == ERROR_SUCCESS)
416 {
417 array[*cKeys] = hkey;
418 *cKeys += 1;
419 }
420 return result;
421}
422
424{
425 WCHAR path[6 + 38 + 1] = L"CLSID\\";
426 StringFromGUID2(clsid, path + 6, 38 + 1);
427 return AddClassKeyToArray(path, array, cKeys);
428}
429
431{
432 // This function opens the association array keys in canonical order for filesystem items.
433 // The order is documented: learn.microsoft.com/en-us/windows/win32/shell/fa-associationarray
434
435 ASSERT(cidl >= 1 && apidl);
436 PCUITEMID_CHILD pidl = apidl[0];
437 if (_ILIsValue(pidl))
438 {
440 PWSTR name;
441 FileStructW* pFileData = _ILGetFileStructW(pidl);
442 if (pFileData)
443 {
444 name = pFileData->wszName;
445 }
446 else
447 {
449 name = buf;
450 }
451 LPCWSTR extension = PathFindExtension(name);
452
453 if (extension)
454 {
455 WCHAR wszClass[MAX_PATH], wszSFA[23 + _countof(wszClass)];
456 DWORD dwSize = sizeof(wszClass);
457 if (RegGetValueW(HKEY_CLASSES_ROOT, extension, NULL, RRF_RT_REG_SZ, NULL, wszClass, &dwSize) != ERROR_SUCCESS ||
458 !*wszClass || AddClassKeyToArray(wszClass, array, cKeys) != ERROR_SUCCESS)
459 {
460 // Only add the extension key if the ProgId is not valid
461 AddClassKeyToArray(extension, array, cKeys);
462
463 // "Open With" becomes the default when there are no verbs in the above keys
464 if (cidl == 1)
465 AddClassKeyToArray(L"Unknown", array, cKeys);
466 }
467
468 swprintf(wszSFA, L"SystemFileAssociations\\%s", extension);
469 AddClassKeyToArray(wszSFA, array, cKeys);
470
471 dwSize = sizeof(wszClass);
472 if (RegGetValueW(HKEY_CLASSES_ROOT, extension, L"PerceivedType ", RRF_RT_REG_SZ, NULL, wszClass, &dwSize) == ERROR_SUCCESS)
473 {
474 swprintf(wszSFA, L"SystemFileAssociations\\%s", wszClass);
475 AddClassKeyToArray(wszSFA, array, cKeys);
476 }
477 }
478
479 AddClassKeyToArray(L"*", array, cKeys);
480 AddClassKeyToArray(L"AllFilesystemObjects", array, cKeys);
481 }
482 else if (_ILIsFolder(pidl))
483 {
484 // FIXME: Directory > Folder > AFO is the correct order and it's
485 // the order Windows reports in its undocumented association array
486 // but it is somehow not the order Windows adds the items to its menu!
487 // Until the correct algorithm in CDefaultContextMenu can be determined,
488 // we add the folder keys in "menu order".
489 AddClassKeyToArray(L"Folder", array, cKeys);
490 AddClassKeyToArray(L"AllFilesystemObjects", array, cKeys);
491 AddClassKeyToArray(L"Directory", array, cKeys);
492 }
493 else
494 {
495 ERR("Got non FS pidl\n");
496 }
497}
498
499HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE* ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
500{
501 CDataObjectHIDA cida(pDataObject);
502
503 if (FAILED_UNEXPECTEDLY(cida.hr()))
504 return cida.hr();
505
506 /* convert the data into pidl */
507 LPITEMIDLIST pidl;
508 LPITEMIDLIST *apidl = _ILCopyCidaToaPidl(&pidl, cida);
509 if (!apidl)
510 {
511 return E_OUTOFMEMORY;
512 }
513
514 *ppidlfolder = pidl;
515 *apidlItems = apidl;
516 *pcidl = cida->cidl;
517
518 return S_OK;
519}
520
521/***********************************************************************
522 * SHCreateLinks
523 *
524 * Undocumented.
525 */
527 UINT uFlags, LPITEMIDLIST *lppidlLinks)
528{
529 FIXME("%p %s %p %08x %p\n", hWnd, lpszDir, lpDataObject, uFlags, lppidlLinks);
530 return E_NOTIMPL;
531}
532
533/***********************************************************************
534 * SHOpenFolderAndSelectItems
535 *
536 * Unimplemented.
537 */
539WINAPI
541 UINT cidl,
544{
545 ERR("SHOpenFolderAndSelectItems() is hackplemented\n");
547 PCIDLIST_ABSOLUTE pidlItem;
548 if (cidl)
549 {
550 /* Firefox sends a full pidl here dispite the fact it is a PCUITEMID_CHILD_ARRAY -_- */
551 if (!ILIsSingle(apidl[0]))
552 {
553 pidlItem = apidl[0];
554 }
555 else
556 {
557 HRESULT hr = SHILCombine(pidlFolder, apidl[0], &pidlItem);
559 return hr;
560 freeItem.Attach(const_cast<PIDLIST_ABSOLUTE>(pidlItem));
561 }
562 }
563 else
564 {
565 pidlItem = pidlFolder;
566 }
567
568 CComPtr<IShellFolder> psfDesktop;
569
570 HRESULT hr = SHGetDesktopFolder(&psfDesktop);
572 return hr;
573
574 STRRET strret;
575 hr = psfDesktop->GetDisplayNameOf(pidlItem, SHGDN_FORPARSING, &strret);
577 return hr;
578
579 WCHAR wszBuf[MAX_PATH];
580 hr = StrRetToBufW(&strret, pidlItem, wszBuf, _countof(wszBuf));
582 return hr;
583
584 WCHAR wszParams[MAX_PATH];
585 wcscpy(wszParams, L"/select,");
586 wcscat(wszParams, wszBuf);
587
589 memset(&sei, 0, sizeof sei);
590 sei.cbSize = sizeof sei;
592 sei.lpFile = L"explorer.exe";
593 sei.lpParameters = wszParams;
594
595 if (ShellExecuteExW(&sei))
596 return S_OK;
597 else
598 return E_FAIL;
599}
600
601/*
602 * for internal use
603 */
606{
607 if (!pdtobj)
608 return E_INVALIDARG;
610}
611
614{
615 switch (msg)
616 {
618 return S_OK; // Yes, I want verbs
620 return S_FALSE; // Do it for me please
622 return S_FALSE; // Supposedly "required for Windows 7 to pick a default"
623 }
624 return E_NOTIMPL;
625}
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:136
void Attach(T *lp)
Definition: atlalloc.h:162
LPARAM lParam
Definition: combotst.c:139
wcscat
wcscpy
#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
#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
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
#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
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:68
static REFPROPVARIANT PROPVAR_CHANGE_FLAGS VARTYPE vt
Definition: suminfo.c:91
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
Definition: compobj.c:2434
#define RRF_RT_REG_SZ
Definition: driver.c:575
BOOL PathIsValidElement(_In_ LPCWSTR pszPath)
Definition: utils.cpp:158
HRESULT WINAPI SHCoCreateInstance(LPCWSTR aclsid, const CLSID *clsid, LPUNKNOWN pUnkOuter, REFIID refiid, LPVOID *ppv)
Definition: shellole.c:105
HRESULT WINAPI StrRetToBSTR(STRRET *lpStrRet, LPCITEMIDLIST pidl, BSTR *pBstrOut)
Definition: string.c:1700
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
Definition: string.c:1530
#define swprintf
Definition: precomp.h:40
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
#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 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)
#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:184
#define debugstr_w
Definition: kernel32.h:32
#define ASSERT(a)
Definition: mode.c:44
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
HRESULT hres
Definition: protocol.c:465
static const WCHAR sd[]
Definition: suminfo.c:286
static LPOLESTR
Definition: stg_prop.c:27
static SHCONTF
Definition: ordinal.c:64
REFCLSID clsid
Definition: msctf.c:82
unsigned int UINT
Definition: ndis.h:50
#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:1023
#define KEY_QUERY_VALUE
Definition: nt_native.h:1016
#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
#define L(x)
Definition: ntvdm.h:50
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
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1044
LPITEMIDLIST * _ILCopyCidaToaPidl(LPITEMIDLIST *pidl, const CIDA *cida)
Definition: pidl.c:2645
HRESULT WINAPI SHGetIDListFromObject(IUnknown *punk, PIDLIST_ABSOLUTE *ppidl)
Definition: pidl.c:1673
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:816
LPITEMIDLIST WINAPI ILCloneFirst(LPCITEMIDLIST pidl)
Definition: pidl.c:262
FileStructW * _ILGetFileStructW(LPCITEMIDLIST pidl)
Definition: pidl.c:2443
BOOL _ILIsFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2137
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
Definition: pidl.c:970
BOOL _ILIsValue(LPCITEMIDLIST pidl)
Definition: pidl.c:2144
DWORD _ILSimpleGetTextW(LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
Definition: pidl.c:2191
#define IsEqualPropertyKey(a, b)
Definition: propkeydef.h:52
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
#define memset(x, y, z)
Definition: compat.h:39
#define SEE_MASK_WAITFORINPUTIDLE
Definition: shellapi.h:58
VOID WINAPI SHGetSetSettings(LPSHELLSTATE lpss, DWORD dwMask, BOOL bSet)
Definition: shellord.c:225
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:630
static BOOL ILIsSingle(LPCITEMIDLIST pidl)
Definition: shellutils.h:644
#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:2474
HRESULT hr
Definition: shlfolder.c:183
HRESULT SH32_GetDetailsOfPKeyAsVariant(IShellFolder2 *pSF, PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pVar, BOOL UseFsColMap)
Definition: shlfolder.cpp:133
HRESULT SHELL32_CoCreateInitSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidlChild, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:255
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:293
HRESULT SHELL_CreateAbsolutePidl(IShellFolder *pSF, PCUIDLIST_RELATIVE pidlChild, PIDLIST_ABSOLUTE *ppPidl)
Definition: shlfolder.cpp:142
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:331
SHCONTF SHELL_GetDefaultFolderEnumSHCONTF()
Definition: shlfolder.cpp:29
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:349
void AddFSClassKeysToArray(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:430
HRESULT SHELL_GetDetailsOfAsStringVariant(IShellFolder2 *pSF, PCUITEMID_CHILD pidl, UINT Column, VARIANT *pVar)
Definition: shlfolder.cpp:95
LSTATUS AddClsidKeyToArray(REFCLSID clsid, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:423
LSTATUS AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:408
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:372
HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE *ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
Definition: shlfolder.cpp:499
void CloseRegKeyArray(HKEY *array, UINT cKeys)
Definition: shlfolder.cpp:402
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
HRESULT Shell_NextElement(_Inout_ LPWSTR *ppch, _Out_ LPWSTR pszOut, _In_ INT cchOut, _In_ BOOL bValidate)
Definition: shlfolder.cpp:155
EXTERN_C HRESULT WINAPI SHOpenFolderAndSelectItems(PCIDLIST_ABSOLUTE pidlFolder, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD dwFlags)
Definition: shlfolder.cpp:540
HRESULT SHELL32_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdo, UINT msg)
Definition: shlfolder.cpp:613
HRESULT SHELL32_ParseNextElement(IShellFolder2 *psf, HWND hwndOwner, LPBC pbc, LPITEMIDLIST *pidlInOut, LPOLESTR szNext, DWORD *pEaten, DWORD *pdwAttributes)
Definition: shlfolder.cpp:204
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:110
HRESULT SHELL32_ShowPropertiesDialog(IDataObject *pdtobj)
Definition: shlfolder.cpp:605
HRESULT WINAPI SHCreateLinks(HWND hWnd, LPCSTR lpszDir, IDataObject *lpDataObject, UINT uFlags, LPITEMIDLIST *lppidlLinks)
Definition: shlfolder.cpp:526
#define SSF_SHOWSUPERHIDDEN
Definition: shlobj.h:1629
#define SSF_SHOWALLOBJECTS
Definition: shlobj.h:1613
#define PathFindExtension
Definition: shlwapi.h:942
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:1555
LPCWSTR lpParameters
Definition: shellapi.h:340
Definition: name.c:39
uint16_t * PWSTR
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
int ret
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
LONG_PTR LPARAM
Definition: windef.h:208
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:2357
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
#define IID_PPV_ARG(Itype, ppType)
const char * LPCSTR
Definition: xmlstorage.h:183
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185