ReactOS 0.4.16-dev-983-g23ad936
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
58{
59 PIDLIST_ABSOLUTE pidlFolder;
60 HRESULT hr = SHGetIDListFromObject(pSF, &pidlFolder);
61 if (SUCCEEDED(hr))
62 {
63 hr = SHILCombine(pidlFolder, pidlChild, ppPidl);
64 ILFree(pidlFolder);
65 }
66 return hr;
67}
68
71 _Inout_ LPWSTR *ppch,
72 _Out_ LPWSTR pszOut,
73 _In_ INT cchOut,
74 _In_ BOOL bValidate)
75{
76 *pszOut = UNICODE_NULL;
77
78 if (!*ppch)
79 return S_FALSE;
80
81 HRESULT hr;
82 LPWSTR pchNext = wcschr(*ppch, L'\\');
83 if (pchNext)
84 {
85 if (*ppch < pchNext)
86 {
87 /* Get an element */
88 StringCchCopyNW(pszOut, cchOut, *ppch, pchNext - *ppch);
89 ++pchNext;
90
91 if (!*pchNext)
92 pchNext = NULL; /* No next */
93
94 hr = S_OK;
95 }
96 else /* Double backslashes found? */
97 {
98 pchNext = NULL;
100 }
101 }
102 else /* No more next */
103 {
104 StringCchCopyW(pszOut, cchOut, *ppch);
105 hr = S_OK;
106 }
107
108 *ppch = pchNext; /* Go next */
109
110 if (hr == S_OK && bValidate && !PathIsValidElement(pszOut))
111 {
112 *pszOut = UNICODE_NULL;
114 }
115
116 return hr;
117}
118
120 LPITEMIDLIST * pidlInOut, LPOLESTR szNext, DWORD * pEaten, DWORD * pdwAttributes)
121{
123 LPITEMIDLIST pidlIn = pidlInOut ? *pidlInOut : NULL;
124 LPITEMIDLIST pidlOut = NULL;
125 LPITEMIDLIST pidlTemp = NULL;
126 CComPtr<IShellFolder> psfChild;
127
128 TRACE ("(%p, %p, %p, %s)\n", psf, pbc, pidlIn, debugstr_w (szNext));
129
130 /* get the shellfolder for the child pidl and let it analyse further */
131 hr = psf->BindToObject(pidlIn, pbc, IID_PPV_ARG(IShellFolder, &psfChild));
132 if (FAILED(hr))
133 return hr;
134
135 hr = psfChild->ParseDisplayName(hwndOwner, pbc, szNext, pEaten, &pidlOut, pdwAttributes);
136 if (FAILED(hr))
137 return hr;
138
139 pidlTemp = ILCombine (pidlIn, pidlOut);
140 if (!pidlTemp)
141 {
143 if (pidlOut)
144 ILFree(pidlOut);
145 return hr;
146 }
147
148 if (pidlOut)
149 ILFree (pidlOut);
150
151 if (pidlIn)
152 ILFree (pidlIn);
153
154 *pidlInOut = pidlTemp;
155
156 TRACE ("-- pidl=%p ret=0x%08x\n", pidlInOut ? *pidlInOut : NULL, hr);
157 return S_OK;
158}
159
160/***********************************************************************
161 * SHELL32_CoCreateInitSF
162 *
163 * Creates a shell folder and initializes it with a pidl and a root folder
164 * via IPersistFolder3 or IPersistFolder.
165 *
166 * NOTES
167 * pathRoot can be NULL for Folders being a drive.
168 * In this case the absolute path is built from pidlChild (eg. C:)
169 */
170HRESULT SHELL32_CoCreateInitSF (LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO* ppfti,
171 LPCITEMIDLIST pidlChild, const GUID* clsid, REFIID riid, LPVOID *ppvOut)
172{
173 HRESULT hr;
174 CComPtr<IShellFolder> pShellFolder;
175
177 if (FAILED(hr))
178 return hr;
179
180 LPITEMIDLIST pidlAbsolute = ILCombine (pidlRoot, pidlChild);
183
184 if (ppfti && SUCCEEDED(pShellFolder->QueryInterface(IID_PPV_ARG(IPersistFolder3, &ppf3))))
185 {
186 ppf3->InitializeEx(NULL, pidlAbsolute, ppfti);
187 }
188 else if (SUCCEEDED(pShellFolder->QueryInterface(IID_PPV_ARG(IPersistFolder, &ppf))))
189 {
190 ppf->Initialize(pidlAbsolute);
191 }
192 ILFree (pidlAbsolute);
193
194 return pShellFolder->QueryInterface(riid, ppvOut);
195}
196
198 int csidl, REFIID riid, LPVOID *ppvOut)
199{
200 /* fill the PERSIST_FOLDER_TARGET_INFO */
201 PERSIST_FOLDER_TARGET_INFO pfti = {0};
202 pfti.dwAttributes = -1;
203 pfti.csidl = csidl;
204
205 return SHELL32_CoCreateInitSF(pidlRoot, &pfti, NULL, clsid, riid, ppvOut);
206}
207
208HRESULT SHELL32_BindToSF (LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO* ppfti,
209 LPCITEMIDLIST pidl, const GUID* clsid, REFIID riid, LPVOID *ppvOut)
210{
211 PITEMID_CHILD pidlChild = ILCloneFirst (pidl);
212 if (!pidlChild)
213 return E_FAIL;
214
217 ppfti,
218 pidlChild,
219 clsid,
221 ILFree(pidlChild);
222
224 return hr;
225
226 if (_ILIsPidlSimple (pidl))
227 return psf->QueryInterface(riid, ppvOut);
228 else
229 return psf->BindToObject(ILGetNext (pidl), NULL, riid, ppvOut);
230}
231
232/***********************************************************************
233 * SHELL32_GetDisplayNameOfChild
234 *
235 * Retrieves the display name of a child object of a shellfolder.
236 *
237 * For a pidl eg. [subpidl1][subpidl2][subpidl3]:
238 * - it binds to the child shellfolder [subpidl1]
239 * - asks it for the displayname of [subpidl2][subpidl3]
240 *
241 * Is possible the pidl is a simple pidl. In this case it asks the
242 * subfolder for the displayname of an empty pidl. The subfolder
243 * returns the own displayname eg. "::{guid}". This is used for
244 * virtual folders with the registry key WantsFORPARSING set.
245 */
247 LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
248{
249 LPITEMIDLIST pidlFirst = ILCloneFirst(pidl);
250 if (!pidlFirst)
251 return E_OUTOFMEMORY;
252
253 CComPtr<IShellFolder> psfChild;
254 HRESULT hr = psf->BindToObject(pidlFirst, NULL, IID_PPV_ARG(IShellFolder, &psfChild));
255 if (SUCCEEDED (hr))
256 {
257 hr = psfChild->GetDisplayNameOf(ILGetNext (pidl), dwFlags, strRet);
258 }
259 ILFree (pidlFirst);
260
261 return hr;
262}
263
265{
266 PUIDLIST_RELATIVE nextpidl1 = ILGetNext (pidl1);
267 PUIDLIST_RELATIVE nextpidl2 = ILGetNext (pidl2);
268
269 bool isEmpty1 = _ILIsDesktop(nextpidl1);
270 bool isEmpty2 = _ILIsDesktop(nextpidl2);
271 if (isEmpty1 || isEmpty2)
272 return MAKE_COMPARE_HRESULT(isEmpty2 - isEmpty1);
273
274 PITEMID_CHILD firstpidl = ILCloneFirst (pidl1);
275 if (!firstpidl)
276 return E_OUTOFMEMORY;
277
279 HRESULT hr = psf->BindToObject(firstpidl, 0, IID_PPV_ARG(IShellFolder, &psf2));
280 ILFree(firstpidl);
281 if (FAILED(hr))
282 return MAKE_COMPARE_HRESULT(0);
283
284 return psf2->CompareIDs(lParam, nextpidl1, nextpidl2);
285}
286
288{
290 WCHAR wszItem1[MAX_PATH], wszItem2[MAX_PATH];
292 UINT col = LOWORD(lParam); // Column index without SHCIDS_* flags
293
294 hres = isf->GetDetailsOf(pidl1, col, &sd);
295 if (FAILED(hres))
296 return MAKE_COMPARE_HRESULT(1);
297
298 hres = StrRetToBufW(&sd.str, pidl1, wszItem1, MAX_PATH);
299 if (FAILED(hres))
300 return MAKE_COMPARE_HRESULT(1);
301
302 hres = isf->GetDetailsOf(pidl2, col, &sd);
303 if (FAILED(hres))
304 return MAKE_COMPARE_HRESULT(1);
305
306 hres = StrRetToBufW(&sd.str, pidl2, wszItem2, MAX_PATH);
307 if (FAILED(hres))
308 return MAKE_COMPARE_HRESULT(1);
309
310 int ret = _wcsicmp(wszItem1, wszItem2);
311 if (ret == 0)
312 return SHELL32_CompareChildren(isf, lParam, pidl1, pidl2);
313
315}
316
318{
319 for (UINT i = 0; i < cKeys; ++i)
321}
322
324{
325 if (*cKeys >= 16)
326 return ERROR_MORE_DATA;
327
328 HKEY hkey;
330 if (result == ERROR_SUCCESS)
331 {
332 array[*cKeys] = hkey;
333 *cKeys += 1;
334 }
335 return result;
336}
337
339{
340 WCHAR path[6 + 38 + 1] = L"CLSID\\";
341 StringFromGUID2(clsid, path + 6, 38 + 1);
342 return AddClassKeyToArray(path, array, cKeys);
343}
344
346{
347 // This function opens the association array keys in canonical order for filesystem items.
348 // The order is documented: learn.microsoft.com/en-us/windows/win32/shell/fa-associationarray
349
350 ASSERT(cidl >= 1 && apidl);
351 PCUITEMID_CHILD pidl = apidl[0];
352 if (_ILIsValue(pidl))
353 {
355 PWSTR name;
356 FileStructW* pFileData = _ILGetFileStructW(pidl);
357 if (pFileData)
358 {
359 name = pFileData->wszName;
360 }
361 else
362 {
364 name = buf;
365 }
366 LPCWSTR extension = PathFindExtension(name);
367
368 if (extension)
369 {
370 WCHAR wszClass[MAX_PATH], wszSFA[23 + _countof(wszClass)];
371 DWORD dwSize = sizeof(wszClass);
372 if (RegGetValueW(HKEY_CLASSES_ROOT, extension, NULL, RRF_RT_REG_SZ, NULL, wszClass, &dwSize) != ERROR_SUCCESS ||
373 !*wszClass || AddClassKeyToArray(wszClass, array, cKeys) != ERROR_SUCCESS)
374 {
375 // Only add the extension key if the ProgId is not valid
376 AddClassKeyToArray(extension, array, cKeys);
377
378 // "Open With" becomes the default when there are no verbs in the above keys
379 if (cidl == 1)
380 AddClassKeyToArray(L"Unknown", array, cKeys);
381 }
382
383 swprintf(wszSFA, L"SystemFileAssociations\\%s", extension);
384 AddClassKeyToArray(wszSFA, array, cKeys);
385
386 dwSize = sizeof(wszClass);
387 if (RegGetValueW(HKEY_CLASSES_ROOT, extension, L"PerceivedType ", RRF_RT_REG_SZ, NULL, wszClass, &dwSize) == ERROR_SUCCESS)
388 {
389 swprintf(wszSFA, L"SystemFileAssociations\\%s", wszClass);
390 AddClassKeyToArray(wszSFA, array, cKeys);
391 }
392 }
393
394 AddClassKeyToArray(L"*", array, cKeys);
395 AddClassKeyToArray(L"AllFilesystemObjects", array, cKeys);
396 }
397 else if (_ILIsFolder(pidl))
398 {
399 // FIXME: Directory > Folder > AFO is the correct order and it's
400 // the order Windows reports in its undocumented association array
401 // but it is somehow not the order Windows adds the items to its menu!
402 // Until the correct algorithm in CDefaultContextMenu can be determined,
403 // we add the folder keys in "menu order".
404 AddClassKeyToArray(L"Folder", array, cKeys);
405 AddClassKeyToArray(L"AllFilesystemObjects", array, cKeys);
406 AddClassKeyToArray(L"Directory", array, cKeys);
407 }
408 else
409 {
410 ERR("Got non FS pidl\n");
411 }
412}
413
414HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE* ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
415{
416 CDataObjectHIDA cida(pDataObject);
417
418 if (FAILED_UNEXPECTEDLY(cida.hr()))
419 return cida.hr();
420
421 /* convert the data into pidl */
422 LPITEMIDLIST pidl;
423 LPITEMIDLIST *apidl = _ILCopyCidaToaPidl(&pidl, cida);
424 if (!apidl)
425 {
426 return E_OUTOFMEMORY;
427 }
428
429 *ppidlfolder = pidl;
430 *apidlItems = apidl;
431 *pcidl = cida->cidl;
432
433 return S_OK;
434}
435
436/***********************************************************************
437 * SHCreateLinks
438 *
439 * Undocumented.
440 */
442 UINT uFlags, LPITEMIDLIST *lppidlLinks)
443{
444 FIXME("%p %s %p %08x %p\n", hWnd, lpszDir, lpDataObject, uFlags, lppidlLinks);
445 return E_NOTIMPL;
446}
447
448/***********************************************************************
449 * SHOpenFolderAndSelectItems
450 *
451 * Unimplemented.
452 */
454WINAPI
456 UINT cidl,
459{
460 ERR("SHOpenFolderAndSelectItems() is hackplemented\n");
462 PCIDLIST_ABSOLUTE pidlItem;
463 if (cidl)
464 {
465 /* Firefox sends a full pidl here dispite the fact it is a PCUITEMID_CHILD_ARRAY -_- */
466 if (!ILIsSingle(apidl[0]))
467 {
468 pidlItem = apidl[0];
469 }
470 else
471 {
472 HRESULT hr = SHILCombine(pidlFolder, apidl[0], &pidlItem);
474 return hr;
475 freeItem.Attach(const_cast<PIDLIST_ABSOLUTE>(pidlItem));
476 }
477 }
478 else
479 {
480 pidlItem = pidlFolder;
481 }
482
483 CComPtr<IShellFolder> psfDesktop;
484
485 HRESULT hr = SHGetDesktopFolder(&psfDesktop);
487 return hr;
488
489 STRRET strret;
490 hr = psfDesktop->GetDisplayNameOf(pidlItem, SHGDN_FORPARSING, &strret);
492 return hr;
493
494 WCHAR wszBuf[MAX_PATH];
495 hr = StrRetToBufW(&strret, pidlItem, wszBuf, _countof(wszBuf));
497 return hr;
498
499 WCHAR wszParams[MAX_PATH];
500 wcscpy(wszParams, L"/select,");
501 wcscat(wszParams, wszBuf);
502
504 memset(&sei, 0, sizeof sei);
505 sei.cbSize = sizeof sei;
507 sei.lpFile = L"explorer.exe";
508 sei.lpParameters = wszParams;
509
510 if (ShellExecuteExW(&sei))
511 return S_OK;
512 else
513 return E_FAIL;
514}
515
516/*
517 * for internal use
518 */
521{
522 if (!pdtobj)
523 return E_INVALIDARG;
525}
526
529{
530 switch (msg)
531 {
533 return S_OK; // Yes, I want verbs
535 return S_FALSE; // Do it for me please
537 return S_FALSE; // Supposedly "required for Windows 7 to pick a default"
538 }
539 return E_NOTIMPL;
540}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
#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
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
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
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 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 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 L(x)
Definition: ntvdm.h:50
interface IBindCtx * LPBC
Definition: objfwd.h:18
#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:2610
HRESULT WINAPI SHGetIDListFromObject(IUnknown *punk, PIDLIST_ABSOLUTE *ppidl)
Definition: pidl.c:1638
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:2408
BOOL _ILIsFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2102
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
Definition: pidl.c:970
BOOL _ILIsValue(LPCITEMIDLIST pidl)
Definition: pidl.c:2109
DWORD _ILSimpleGetTextW(LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
Definition: pidl.c:2156
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#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:623
static BOOL ILIsSingle(LPCITEMIDLIST pidl)
Definition: shellutils.h:631
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2452
HRESULT hr
Definition: shlfolder.c:183
HRESULT SHELL32_CoCreateInitSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidlChild, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:170
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:208
HRESULT SHELL_CreateAbsolutePidl(IShellFolder *pSF, PCUIDLIST_RELATIVE pidlChild, PIDLIST_ABSOLUTE *ppPidl)
Definition: shlfolder.cpp:57
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:246
SHCONTF SHELL_GetDefaultFolderEnumSHCONTF()
Definition: shlfolder.cpp:29
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:264
void AddFSClassKeysToArray(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:345
LSTATUS AddClsidKeyToArray(REFCLSID clsid, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:338
LSTATUS AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:323
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:287
HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE *ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
Definition: shlfolder.cpp:414
void CloseRegKeyArray(HKEY *array, UINT cKeys)
Definition: shlfolder.cpp:317
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:70
EXTERN_C HRESULT WINAPI SHOpenFolderAndSelectItems(PCIDLIST_ABSOLUTE pidlFolder, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD dwFlags)
Definition: shlfolder.cpp:455
HRESULT SHELL32_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdo, UINT msg)
Definition: shlfolder.cpp:528
HRESULT SHELL32_ParseNextElement(IShellFolder2 *psf, HWND hwndOwner, LPBC pbc, LPITEMIDLIST *pidlInOut, LPOLESTR szNext, DWORD *pEaten, DWORD *pdwAttributes)
Definition: shlfolder.cpp:119
HRESULT SHELL32_ShowPropertiesDialog(IDataObject *pdtobj)
Definition: shlfolder.cpp:520
HRESULT WINAPI SHCreateLinks(HWND hWnd, LPCSTR lpszDir, IDataObject *lpDataObject, UINT uFlags, LPITEMIDLIST *lppidlLinks)
Definition: shlfolder.cpp:441
#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
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
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:334
Definition: name.c:39
uint16_t * PWSTR
Definition: typedefs.h:56
int32_t INT
Definition: typedefs.h:58
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