ReactOS 0.4.16-dev-1044-ga6558c0
shlfolder.cpp File Reference
#include "precomp.h"
Include dependency graph for shlfolder.cpp:

Go to the source code of this file.

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (shell)
 
SHCONTF SHELL_GetDefaultFolderEnumSHCONTF ()
 
BOOL SHELL_IncludeItemInFolderEnum (IShellFolder *pSF, PCUITEMID_CHILD pidl, SFGAOF Query, SHCONTF Flags)
 
static HRESULT MapSCIDToShell32FsColumn (const SHCOLUMNID *pscid, VARTYPE &vt)
 
HRESULT SHELL_MapSCIDToColumn (IShellFolder2 *pSF, const SHCOLUMNID *pscid)
 
HRESULT SHELL_GetDetailsOfAsStringVariant (IShellFolder2 *pSF, PCUITEMID_CHILD pidl, UINT Column, VARIANT *pVar)
 
HRESULT SHELL_GetDetailsOfColumnAsVariant (IShellFolder2 *pSF, PCUITEMID_CHILD pidl, UINT Column, VARTYPE vt, VARIANT *pVar)
 
HRESULT SH32_GetDetailsOfPKeyAsVariant (IShellFolder2 *pSF, PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pVar, BOOL UseFsColMap)
 
HRESULT SHELL_CreateAbsolutePidl (IShellFolder *pSF, PCUIDLIST_RELATIVE pidlChild, PIDLIST_ABSOLUTE *ppPidl)
 
HRESULT Shell_NextElement (_Inout_ LPWSTR *ppch, _Out_ LPWSTR pszOut, _In_ INT cchOut, _In_ BOOL bValidate)
 
HRESULT SHELL32_ParseNextElement (IShellFolder2 *psf, HWND hwndOwner, LPBC pbc, LPITEMIDLIST *pidlInOut, LPOLESTR szNext, DWORD *pEaten, DWORD *pdwAttributes)
 
HRESULT SHELL32_CoCreateInitSF (LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidlChild, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
 
HRESULT SHELL32_CoCreateInitSF (LPCITEMIDLIST pidlRoot, const GUID *clsid, int csidl, REFIID riid, LPVOID *ppvOut)
 
HRESULT SHELL32_BindToSF (LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
 
HRESULT SHELL32_GetDisplayNameOfChild (IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
 
HRESULT SHELL32_CompareChildren (IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
 
HRESULT SHELL32_CompareDetails (IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
 
void CloseRegKeyArray (HKEY *array, UINT cKeys)
 
LSTATUS AddClassKeyToArray (const WCHAR *szClass, HKEY *array, UINT *cKeys)
 
LSTATUS AddClsidKeyToArray (REFCLSID clsid, HKEY *array, UINT *cKeys)
 
void AddFSClassKeysToArray (UINT cidl, PCUITEMID_CHILD_ARRAY apidl, HKEY *array, UINT *cKeys)
 
HRESULT SH_GetApidlFromDataObject (IDataObject *pDataObject, PIDLIST_ABSOLUTE *ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
 
HRESULT WINAPI SHCreateLinks (HWND hWnd, LPCSTR lpszDir, IDataObject *lpDataObject, UINT uFlags, LPITEMIDLIST *lppidlLinks)
 
EXTERN_C HRESULT WINAPI SHOpenFolderAndSelectItems (PCIDLIST_ABSOLUTE pidlFolder, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD dwFlags)
 
HRESULT SHELL32_ShowPropertiesDialog (IDataObject *pdtobj)
 
HRESULT SHELL32_DefaultContextMenuCallBack (IShellFolder *psf, IDataObject *pdo, UINT msg)
 

Function Documentation

◆ AddClassKeyToArray()

LSTATUS AddClassKeyToArray ( const WCHAR szClass,
HKEY array,
UINT cKeys 
)

Definition at line 408 of file shlfolder.cpp.

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}
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define ERROR_SUCCESS
Definition: deptool.c:10
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
GLuint64EXT * result
Definition: glext.h:11304
#define KEY_READ
Definition: nt_native.h:1023
#define KEY_QUERY_VALUE
Definition: nt_native.h:1016
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10

Referenced by AddClsidKeyToArray(), AddFSClassKeysToArray(), CDrivesContextMenu_CreateInstance(), ClassPropDialogInitCallback(), CDesktopFolder::CreateViewObject(), CFSFolder::CreateViewObject(), CRegItemContextMenu_CreateInstance(), CDesktopFolder::GetUIObjectOf(), and CNetFolder::GetUIObjectOf().

◆ AddClsidKeyToArray()

LSTATUS AddClsidKeyToArray ( REFCLSID  clsid,
HKEY array,
UINT cKeys 
)

Definition at line 423 of file shlfolder.cpp.

424{
425 WCHAR path[6 + 38 + 1] = L"CLSID\\";
426 StringFromGUID2(clsid, path + 6, 38 + 1);
427 return AddClassKeyToArray(path, array, cKeys);
428}
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
Definition: compobj.c:2434
REFCLSID clsid
Definition: msctf.c:82
#define L(x)
Definition: ntvdm.h:50
LSTATUS AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:408
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by CDesktopFolder::GetUIObjectOf().

◆ AddFSClassKeysToArray()

void AddFSClassKeysToArray ( UINT  cidl,
PCUITEMID_CHILD_ARRAY  apidl,
HKEY array,
UINT cKeys 
)

Definition at line 430 of file shlfolder.cpp.

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}
#define ERR(fmt,...)
Definition: precomp.h:57
#define NULL
Definition: types.h:112
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
Definition: reg.c:1931
#define MAX_PATH
Definition: compat.h:34
#define RRF_RT_REG_SZ
Definition: driver.c:575
#define swprintf
Definition: precomp.h:40
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define ASSERT(a)
Definition: mode.c:44
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
FileStructW * _ILGetFileStructW(LPCITEMIDLIST pidl)
Definition: pidl.c:2443
BOOL _ILIsFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2137
BOOL _ILIsValue(LPCITEMIDLIST pidl)
Definition: pidl.c:2144
DWORD _ILSimpleGetTextW(LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
Definition: pidl.c:2191
#define PathFindExtension
Definition: shlwapi.h:942
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
#define _countof(array)
Definition: sndvol32.h:70
WCHAR wszName[1]
Definition: shlfolder.c:1555
Definition: name.c:39
uint16_t * PWSTR
Definition: typedefs.h:56
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by FSFolderItemPropDialogInitCallback(), CDesktopFolder::GetUIObjectOf(), and CFSFolder::GetUIObjectOf().

◆ CloseRegKeyArray()

void CloseRegKeyArray ( HKEY array,
UINT  cKeys 
)

Definition at line 402 of file shlfolder.cpp.

403{
404 for (UINT i = 0; i < cKeys; ++i)
406}
#define RegCloseKey(hKey)
Definition: registry.h:49
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: ndis.h:50

◆ MapSCIDToShell32FsColumn()

static HRESULT MapSCIDToShell32FsColumn ( const SHCOLUMNID *  pscid,
VARTYPE vt 
)
static

Definition at line 58 of file shlfolder.cpp.

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}
#define E_INVALIDARG
Definition: ddrawi.h:101
@ VT_UI8
Definition: compat.h:2315
@ VT_BSTR
Definition: compat.h:2303
@ VT_DATE
Definition: compat.h:2302
static REFPROPVARIANT PROPVAR_CHANGE_FLAGS VARTYPE vt
Definition: suminfo.c:91
#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
const FMTID FMTID_SummaryInformation
#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

Referenced by SH32_GetDetailsOfPKeyAsVariant().

◆ SH32_GetDetailsOfPKeyAsVariant()

HRESULT SH32_GetDetailsOfPKeyAsVariant ( IShellFolder2 pSF,
PCUITEMID_CHILD  pidl,
const SHCOLUMNID *  pscid,
VARIANT pVar,
BOOL  UseFsColMap 
)

Definition at line 133 of file shlfolder.cpp.

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}
unsigned short VARTYPE
Definition: compat.h:2254
@ VT_EMPTY
Definition: compat.h:2295
#define SUCCEEDED(hr)
Definition: intsafe.h:50
HRESULT hr
Definition: shlfolder.c:183
static HRESULT MapSCIDToShell32FsColumn(const SHCOLUMNID *pscid, VARTYPE &vt)
Definition: shlfolder.cpp:58
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

Referenced by CControlPanelFolder::GetDetailsEx(), CDrivesFolder::GetDetailsEx(), CFSFolder::GetDetailsEx(), and CRegFolder::GetDetailsEx().

◆ SH_GetApidlFromDataObject()

HRESULT SH_GetApidlFromDataObject ( IDataObject pDataObject,
PIDLIST_ABSOLUTE ppidlfolder,
PUITEMID_CHILD **  apidlItems,
UINT pcidl 
)

Definition at line 499 of file shlfolder.cpp.

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}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define FAILED_UNEXPECTEDLY(hr)
Definition: debug.h:83
#define S_OK
Definition: intsafe.h:52
LPITEMIDLIST * _ILCopyCidaToaPidl(LPITEMIDLIST *pidl, const CIDA *cida)
Definition: pidl.c:2645
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41

Referenced by CFSDropTarget::_RepositionItems(), DrivesContextMenuCallback(), and RegFolderContextMenuCallback().

◆ SHCreateLinks()

HRESULT WINAPI SHCreateLinks ( HWND  hWnd,
LPCSTR  lpszDir,
IDataObject lpDataObject,
UINT  uFlags,
LPITEMIDLIST lppidlLinks 
)

Definition at line 526 of file shlfolder.cpp.

528{
529 FIXME("%p %s %p %08x %p\n", hWnd, lpszDir, lpDataObject, uFlags, lppidlLinks);
530 return E_NOTIMPL;
531}
HWND hWnd
Definition: settings.c:17
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_NOTIMPL
Definition: ddrawi.h:99
UINT uFlags
Definition: api.c:59

◆ SHELL32_BindToSF()

HRESULT SHELL32_BindToSF ( LPCITEMIDLIST  pidlRoot,
PERSIST_FOLDER_TARGET_INFO *  ppfti,
LPCITEMIDLIST  pidl,
const GUID clsid,
REFIID  riid,
LPVOID ppvOut 
)

Definition at line 293 of file shlfolder.cpp.

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}
#define E_FAIL
Definition: ddrawi.h:102
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
REFIID riid
Definition: atlbase.h:39
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1044
LPITEMIDLIST WINAPI ILCloneFirst(LPCITEMIDLIST pidl)
Definition: pidl.c:262
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
Definition: pidl.c:970
HRESULT SHELL32_CoCreateInitSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidlChild, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:255
#define IID_PPV_ARG(Itype, ppType)

Referenced by CDrivesFolder::BindToObject(), CFSFolder::BindToObject(), CNetFolder::BindToObject(), and CRegFolder::BindToObject().

◆ SHELL32_CoCreateInitSF() [1/2]

HRESULT SHELL32_CoCreateInitSF ( LPCITEMIDLIST  pidlRoot,
const GUID clsid,
int  csidl,
REFIID  riid,
LPVOID ppvOut 
)

Definition at line 282 of file shlfolder.cpp.

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}

◆ SHELL32_CoCreateInitSF() [2/2]

HRESULT SHELL32_CoCreateInitSF ( LPCITEMIDLIST  pidlRoot,
PERSIST_FOLDER_TARGET_INFO *  ppfti,
LPCITEMIDLIST  pidlChild,
const GUID clsid,
REFIID  riid,
LPVOID ppvOut 
)

Definition at line 255 of file shlfolder.cpp.

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}
HRESULT WINAPI SHCoCreateInstance(LPCWSTR aclsid, const CLSID *clsid, LPUNKNOWN pUnkOuter, REFIID refiid, LPVOID *ppv)
Definition: shellole.c:105
#define FAILED(hr)
Definition: intsafe.h:51
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:816

Referenced by SHELL32_BindToSF(), and SHELL32_CoCreateInitSF().

◆ SHELL32_CompareChildren()

HRESULT SHELL32_CompareChildren ( IShellFolder2 psf,
LPARAM  lParam,
LPCITEMIDLIST  pidl1,
LPCITEMIDLIST  pidl2 
)

Definition at line 349 of file shlfolder.cpp.

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}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
LPARAM lParam
Definition: combotst.c:139
HRESULT BindToObject([in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut)
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:630
ITEMIDLIST_RELATIVE UNALIGNED * PUIDLIST_RELATIVE
Definition: shtypes.idl:55

Referenced by CDrivesFolder::CompareIDs(), CFSFolder::CompareIDs(), CRegFolder::CompareIDs(), and SHELL32_CompareDetails().

◆ SHELL32_CompareDetails()

HRESULT SHELL32_CompareDetails ( IShellFolder2 isf,
LPARAM  lParam,
LPCITEMIDLIST  pidl1,
LPCITEMIDLIST  pidl2 
)

Definition at line 372 of file shlfolder.cpp.

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}
static int CompareUiStrings(LPCWSTR a, LPCWSTR b, LPARAM lParam=0)
Definition: CFSFolder.h:136
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
Definition: string.c:1530
HRESULT GetDetailsOf([in] PCUITEMID_CHILD pidl, [in] UINT iColumn, [out] SHELLDETAILS *psd)
HRESULT hres
Definition: protocol.c:465
static const WCHAR sd[]
Definition: suminfo.c:286
#define LOWORD(l)
Definition: pedump.c:82
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:349
int ret

Referenced by CControlPanelFolder::CompareIDs(), CDrivesFolder::CompareIDs(), CFSFolder::CompareIDs(), CPrinterFolder::CompareIDs(), and CRegFolder::CompareIDs().

◆ SHELL32_DefaultContextMenuCallBack()

HRESULT SHELL32_DefaultContextMenuCallBack ( IShellFolder psf,
IDataObject pdo,
UINT  msg 
)

Definition at line 613 of file shlfolder.cpp.

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}
#define msg(x)
Definition: auth_time.c:54
#define DFM_GETDEFSTATICID
Definition: precomp.h:47
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
#define S_FALSE
Definition: winerror.h:2357

Referenced by CDesktopFolder::CallBack(), CDrivesFolder::CallBack(), CFSFolder::CallBack(), CNetFolderBackgroundMenuCB(), DrivesContextMenuCallback(), NetFolderMenuCallback(), and RegFolderContextMenuCallback().

◆ SHELL32_GetDisplayNameOfChild()

HRESULT SHELL32_GetDisplayNameOfChild ( IShellFolder2 psf,
LPCITEMIDLIST  pidl,
DWORD  dwFlags,
LPSTRRET  strRet 
)

Definition at line 331 of file shlfolder.cpp.

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}
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176

Referenced by CDesktopFolder::GetDisplayNameOf(), CDrivesFolder::GetDisplayNameOf(), CFSFolder::GetDisplayNameOf(), and CRegFolder::GetDisplayNameOf().

◆ SHELL32_ParseNextElement()

HRESULT SHELL32_ParseNextElement ( IShellFolder2 psf,
HWND  hwndOwner,
LPBC  pbc,
LPITEMIDLIST pidlInOut,
LPOLESTR  szNext,
DWORD pEaten,
DWORD pdwAttributes 
)

Definition at line 204 of file shlfolder.cpp.

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}
#define debugstr_w
Definition: kernel32.h:32
#define TRACE(s)
Definition: solgame.cpp:4

Referenced by CRegFolder::ParseDisplayName().

◆ SHELL32_ShowPropertiesDialog()

HRESULT SHELL32_ShowPropertiesDialog ( IDataObject pdtobj)

Definition at line 605 of file shlfolder.cpp.

606{
607 if (!pdtobj)
608 return E_INVALIDARG;
610}
HRESULT SHELL32_ShowFilesystemItemsPropertiesDialogAsync(HWND hOwner, IDataObject *pDO)
Definition: item_prop.cpp:184

Referenced by CDefaultContextMenu::DoProperties(), and SHMultiFileProperties().

◆ SHELL_CreateAbsolutePidl()

HRESULT SHELL_CreateAbsolutePidl ( IShellFolder pSF,
PCUIDLIST_RELATIVE  pidlChild,
PIDLIST_ABSOLUTE ppPidl 
)

Definition at line 142 of file shlfolder.cpp.

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}
HRESULT WINAPI SHGetIDListFromObject(IUnknown *punk, PIDLIST_ABSOLUTE *ppidl)
Definition: pidl.c:1673

Referenced by CRegFolder::SetNameOf().

◆ SHELL_GetDefaultFolderEnumSHCONTF()

SHCONTF SHELL_GetDefaultFolderEnumSHCONTF ( )

Definition at line 29 of file shlfolder.cpp.

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}
#define FALSE
Definition: types.h:117
#define ss
Definition: i386-dis.c:441
static SHCONTF
Definition: ordinal.c:64
VOID WINAPI SHGetSetSettings(LPSHELLSTATE lpss, DWORD dwMask, BOOL bSet)
Definition: shellord.c:225
#define SSF_SHOWSUPERHIDDEN
Definition: shlobj.h:1629
#define SSF_SHOWALLOBJECTS
Definition: shlobj.h:1613
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170

Referenced by SHELL32_GetFSItemAttributes().

◆ SHELL_GetDetailsOfAsStringVariant()

HRESULT SHELL_GetDetailsOfAsStringVariant ( IShellFolder2 pSF,
PCUITEMID_CHILD  pidl,
UINT  Column,
VARIANT pVar 
)

Definition at line 95 of file shlfolder.cpp.

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}
HRESULT WINAPI StrRetToBSTR(STRRET *lpStrRet, LPCITEMIDLIST pidl, BSTR *pBstrOut)
Definition: string.c:1700
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
@ STRRET_CSTR
Definition: shtypes.idl:87

Referenced by CFSFolder::GetDetailsEx(), and SHELL_GetDetailsOfColumnAsVariant().

◆ SHELL_GetDetailsOfColumnAsVariant()

HRESULT SHELL_GetDetailsOfColumnAsVariant ( IShellFolder2 pSF,
PCUITEMID_CHILD  pidl,
UINT  Column,
VARTYPE  vt,
VARIANT pVar 
)

Definition at line 110 of file shlfolder.cpp.

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}
static int state
Definition: maze.c:121
@ VT_I8
Definition: compat.h:2314
HRESULT GetDefaultColumnState([in] UINT iColumn, [out] SHCOLSTATEF *pcsFlags)
HRESULT SHELL_GetDetailsOfAsStringVariant(IShellFolder2 *pSF, PCUITEMID_CHILD pidl, UINT Column, VARIANT *pVar)
Definition: shlfolder.cpp:95
@ 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
DWORD SHCOLSTATEF
Definition: shtypes.idl:142
HRESULT WINAPI DECLSPEC_HOTPATCH VariantChangeType(VARIANTARG *pvargDest, VARIANTARG *pvargSrc, USHORT wFlags, VARTYPE vt)
Definition: variant.c:962

Referenced by SH32_GetDetailsOfPKeyAsVariant().

◆ SHELL_IncludeItemInFolderEnum()

BOOL SHELL_IncludeItemInFolderEnum ( IShellFolder pSF,
PCUITEMID_CHILD  pidl,
SFGAOF  Query,
SHCONTF  Flags 
)

Definition at line 41 of file shlfolder.cpp.

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}
BOOL Query(LPCTSTR *ServiceArgs, DWORD ArgCount, BOOL bExtended)
Definition: query.c:292
#define TRUE
Definition: types.h:120
#define SFGAO_SYSTEM
Definition: shobjidl.idl:198
HRESULT GetAttributesOf([in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in, out] SFGAOF *rgfInOut)

Referenced by CRegFolderEnum::AddItemsFromKey(), and CRegFolderEnum::Initialize().

◆ SHELL_MapSCIDToColumn()

HRESULT SHELL_MapSCIDToColumn ( IShellFolder2 pSF,
const SHCOLUMNID *  pscid 
)

Definition at line 80 of file shlfolder.cpp.

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}
HRESULT MapColumnToSCID([in] UINT iColumn, [in] SHCOLUMNID *pscid)
#define IsEqualPropertyKey(a, b)
Definition: propkeydef.h:52

Referenced by SH32_GetDetailsOfPKeyAsVariant().

◆ Shell_NextElement()

HRESULT Shell_NextElement ( _Inout_ LPWSTR ppch,
_Out_ LPWSTR  pszOut,
_In_ INT  cchOut,
_In_ BOOL  bValidate 
)

Definition at line 155 of file shlfolder.cpp.

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}
#define wcschr
Definition: compat.h:17
BOOL PathIsValidElement(_In_ LPCWSTR pszPath)
Definition: utils.cpp:158
#define UNICODE_NULL
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 * LPWSTR
Definition: xmlstorage.h:184

Referenced by CFSFolder::_ParseSimple(), and CFSFolder::ParseDisplayName().

◆ SHOpenFolderAndSelectItems()

EXTERN_C HRESULT WINAPI SHOpenFolderAndSelectItems ( PCIDLIST_ABSOLUTE  pidlFolder,
UINT  cidl,
PCUITEMID_CHILD_ARRAY  apidl,
DWORD  dwFlags 
)

Definition at line 540 of file shlfolder.cpp.

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}
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
void Attach(T *lp)
Definition: atlalloc.h:162
wcscat
wcscpy
#define memset(x, y, z)
Definition: compat.h:39
#define SEE_MASK_WAITFORINPUTIDLE
Definition: shellapi.h:58
static BOOL ILIsSingle(LPCITEMIDLIST pidl)
Definition: shellutils.h:638
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2452
LPCWSTR lpParameters
Definition: shellapi.h:334

Referenced by CFindFolderContextMenu::InvokeCommand(), and CShellLink::OnCommand().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( shell  )