ReactOS 0.4.16-dev-1012-g3fe4b41
shfldr.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  shvheader
 
struct  _REQUIREDREGITEM
 
struct  _REGFOLDERINFO
 
struct  _REGFOLDERINITDATA
 

Macros

#define CHARS_IN_GUID   39
 
#define SHFSF_COL_NAME   0
 
#define SHFSF_COL_SIZE   1
 
#define SHFSF_COL_TYPE   2
 
#define SHFSF_COL_MDATE   3
 
#define SHFSF_COL_FATTS   4
 
#define SHFSF_COL_COMMENT   5
 
#define GET_SHGDN_FOR(dwFlags)   ((DWORD)dwFlags & (DWORD)0x0000FF00)
 
#define GET_SHGDN_RELATION(dwFlags)   ((DWORD)dwFlags & (DWORD)0x000000FF)
 
#define IS_SHGDN_FOR_PARSING(flags)   ( ((flags) & (SHGDN_FORADDRESSBAR | SHGDN_FORPARSING)) == SHGDN_FORPARSING)
 
#define IS_SHGDN_DESKTOPABSOLUTEPARSING(flags)   ( ((flags) & (SHGDN_FORADDRESSBAR | SHGDN_FORPARSING | 0xFF)) == SHGDN_FORPARSING)
 

Typedefs

typedef struct _REQUIREDREGITEM REQUIREDREGITEM
 
typedef struct _REGFOLDERINFO REGFOLDERINFO
 
typedef struct _REGFOLDERINITDATA REGFOLDERINITDATA
 
typedef struct _REGFOLDERINITDATAPREGFOLDERINITDATA
 

Functions

HRESULT CRegFolder_CreateInstance (PREGFOLDERINITDATA pInit, LPCITEMIDLIST pidlRoot, REFIID riid, void **ppv)
 
static SFGAOF SHELL_CreateFolderEnumItemAttributeQuery (SHCONTF Flags, BOOL ForRegItem)
 
SHCONTF SHELL_GetDefaultFolderEnumSHCONTF ()
 
BOOL SHELL_IncludeItemInFolderEnum (IShellFolder *pSF, PCUITEMID_CHILD pidl, SFGAOF Query, SHCONTF Flags)
 
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_GetDisplayNameOfChild (IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
 
HRESULT SHELL32_GetFSItemAttributes (IShellFolder *psf, LPCITEMIDLIST pidl, LPDWORD pdwAttributes)
 
HRESULT SHELL32_CompareDetails (IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
 
HRESULT SHELL32_CompareChildren (IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
 
HRESULT SHELL32_BindToSF (LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
 
BOOL HCR_RegOpenClassIDKey (REFIID riid, HKEY *hkey)
 
HRESULT CDefViewBckgrndMenu_CreateInstance (IShellFolder *psf, REFIID riid, void **ppv)
 
HRESULT SH_GetApidlFromDataObject (IDataObject *pDataObject, PIDLIST_ABSOLUTE *ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
 
static __inline int SHELL32_GUIDToStringA (REFGUID guid, LPSTR str)
 
static __inline int SHELL32_GUIDToStringW (REFGUID guid, LPWSTR str)
 
void SHELL_FS_ProcessDisplayFilename (LPWSTR szPath, DWORD dwFlags)
 
BOOL SHELL_FS_HideExtension (LPCWSTR pwszPath)
 
static BOOL IsIllegalFsFileName (PCWSTR Name)
 
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)
 

Macro Definition Documentation

◆ CHARS_IN_GUID

#define CHARS_IN_GUID   39

Definition at line 27 of file shfldr.h.

◆ GET_SHGDN_FOR

#define GET_SHGDN_FOR (   dwFlags)    ((DWORD)dwFlags & (DWORD)0x0000FF00)

Definition at line 75 of file shfldr.h.

◆ GET_SHGDN_RELATION

#define GET_SHGDN_RELATION (   dwFlags)    ((DWORD)dwFlags & (DWORD)0x000000FF)

Definition at line 76 of file shfldr.h.

◆ IS_SHGDN_DESKTOPABSOLUTEPARSING

#define IS_SHGDN_DESKTOPABSOLUTEPARSING (   flags)    ( ((flags) & (SHGDN_FORADDRESSBAR | SHGDN_FORPARSING | 0xFF)) == SHGDN_FORPARSING)

Definition at line 78 of file shfldr.h.

◆ IS_SHGDN_FOR_PARSING

#define IS_SHGDN_FOR_PARSING (   flags)    ( ((flags) & (SHGDN_FORADDRESSBAR | SHGDN_FORPARSING)) == SHGDN_FORPARSING)

Definition at line 77 of file shfldr.h.

◆ SHFSF_COL_COMMENT

#define SHFSF_COL_COMMENT   5

Definition at line 48 of file shfldr.h.

◆ SHFSF_COL_FATTS

#define SHFSF_COL_FATTS   4

Definition at line 47 of file shfldr.h.

◆ SHFSF_COL_MDATE

#define SHFSF_COL_MDATE   3

Definition at line 46 of file shfldr.h.

◆ SHFSF_COL_NAME

#define SHFSF_COL_NAME   0

Definition at line 43 of file shfldr.h.

◆ SHFSF_COL_SIZE

#define SHFSF_COL_SIZE   1

Definition at line 44 of file shfldr.h.

◆ SHFSF_COL_TYPE

#define SHFSF_COL_TYPE   2

Definition at line 45 of file shfldr.h.

Typedef Documentation

◆ PREGFOLDERINITDATA

◆ REGFOLDERINFO

◆ REGFOLDERINITDATA

◆ REQUIREDREGITEM

Function Documentation

◆ AddClassKeyToArray()

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

Definition at line 323 of file shlfolder.cpp.

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}
#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 338 of file shlfolder.cpp.

339{
340 WCHAR path[6 + 38 + 1] = L"CLSID\\";
341 StringFromGUID2(clsid, path + 6, 38 + 1);
342 return AddClassKeyToArray(path, array, cKeys);
343}
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:323
__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 345 of file shlfolder.cpp.

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}
#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:2408
BOOL _ILIsFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2102
BOOL _ILIsValue(LPCITEMIDLIST pidl)
Definition: pidl.c:2109
DWORD _ILSimpleGetTextW(LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
Definition: pidl.c:2156
#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().

◆ CDefViewBckgrndMenu_CreateInstance()

HRESULT CDefViewBckgrndMenu_CreateInstance ( IShellFolder psf,
REFIID  riid,
void **  ppv 
)

Definition at line 330 of file CDefViewBckgrndMenu.cpp.

331{
332 return ShellObjectCreatorInit<CDefViewBckgrndMenu>(psf, riid, ppv);
333}
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39

Referenced by CDefView::GetItemObject().

◆ CloseRegKeyArray()

void CloseRegKeyArray ( HKEY array,
UINT  cKeys 
)

Definition at line 317 of file shlfolder.cpp.

318{
319 for (UINT i = 0; i < cKeys; ++i)
321}
#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

◆ CRegFolder_CreateInstance()

HRESULT CRegFolder_CreateInstance ( PREGFOLDERINITDATA  pInit,
LPCITEMIDLIST  pidlRoot,
REFIID  riid,
void **  ppv 
)

Definition at line 953 of file CRegFolder.cpp.

954{
955 return ShellObjectCreatorInit<CRegFolder>(pInit, pidlRoot, riid, ppv);
956}
PWDFDEVICE_INIT pInit

Referenced by CDesktopFolder::FinalConstruct(), CDrivesFolder::FinalConstruct(), and CControlPanelFolder::Initialize().

◆ HCR_RegOpenClassIDKey()

BOOL HCR_RegOpenClassIDKey ( REFIID  riid,
HKEY hkey 
)

Definition at line 253 of file classes.c.

254{
255 char xriid[50];
256 sprintf( xriid, "CLSID\\{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
257 (UINT)riid->Data1, riid->Data2, riid->Data3,
258 riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3],
259 riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7] );
260
261 TRACE("%s\n",xriid );
262
263 return !RegOpenKeyExA(HKEY_CLASSES_ROOT, xriid, 0, KEY_READ, hkey);
264}
LONG WINAPI RegOpenKeyExA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey, _In_ DWORD ulOptions, _In_ REGSAM samDesired, _Out_ PHKEY phkResult)
Definition: reg.c:3298
#define sprintf(buf, format,...)
Definition: sprintf.c:55
#define TRACE(s)
Definition: solgame.cpp:4

Referenced by CRegFolder::GetDetailsOf(), CRegFolder::GetDisplayNameOf(), HCR_GetClassNameA(), and HCR_GetClassNameW().

◆ IsIllegalFsFileName()

static BOOL IsIllegalFsFileName ( PCWSTR  Name)
inlinestatic

Definition at line 160 of file shfldr.h.

161{
162 return StrIsNullOrEmpty(Name) || StrPBrkW(Name, INVALID_FILETITLE_CHARACTERSW);
163}
LPWSTR Name
Definition: desk.c:124
LPWSTR WINAPI StrPBrkW(LPCWSTR lpszStr, LPCWSTR lpszMatch)
Definition: string.c:1284
#define INVALID_FILETITLE_CHARACTERSW
Definition: undocshell.h:1002

Referenced by CRegFolder::SetNameOf().

◆ SH_GetApidlFromDataObject()

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

Definition at line 414 of file shlfolder.cpp.

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}
#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:2610
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41

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

◆ SHELL32_BindToSF()

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

Definition at line 208 of file shlfolder.cpp.

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}
#define E_FAIL
Definition: ddrawi.h:102
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
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 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
#define IID_PPV_ARG(Itype, ppType)

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

◆ SHELL32_CompareChildren()

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

Definition at line 264 of file shlfolder.cpp.

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}
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 FAILED(hr)
Definition: intsafe.h:51
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:623
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 287 of file shlfolder.cpp.

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}
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
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:264
int ret

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

◆ SHELL32_GetDisplayNameOfChild()

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

Definition at line 246 of file shlfolder.cpp.

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}
#define SUCCEEDED(hr)
Definition: intsafe.h:50
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176

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

◆ SHELL32_GetFSItemAttributes()

HRESULT SHELL32_GetFSItemAttributes ( IShellFolder psf,
LPCITEMIDLIST  pidl,
LPDWORD  pdwAttributes 
)

Definition at line 619 of file CFSFolder.cpp.

620{
621 DWORD dwFileAttributes, dwShellAttributes;
622
623 if (!_ILIsFolderOrFile(pidl))
624 {
625 ERR("Got wrong type of pidl!\n");
626 *pdwAttributes &= SFGAO_CANLINK;
627 return S_OK;
628 }
629
631
632 /* Set common attributes */
633 dwShellAttributes = SFGAO_CANCOPY | SFGAO_CANMOVE | SFGAO_CANLINK | SFGAO_CANRENAME | SFGAO_CANDELETE |
634 SFGAO_HASPROPSHEET | SFGAO_DROPTARGET | SFGAO_FILESYSTEM;
635
636 BOOL bDirectory = (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
637
638 if (SFGAO_VALIDATE & *pdwAttributes)
639 {
640 STRRET strret;
641 LPWSTR path;
642 if (SUCCEEDED(psf->GetDisplayNameOf(pidl, SHGDN_FORPARSING, &strret)) &&
643 SUCCEEDED(StrRetToStrW(&strret, pidl, &path)))
644 {
645 BOOL exists = PathFileExistsW(path);
646 SHFree(path);
647 if (!exists)
648 return E_FAIL;
649 }
650 }
651
652 if (!bDirectory)
653 {
654 // https://git.reactos.org/?p=reactos.git;a=blob;f=dll/shellext/zipfldr/res/zipfldr.rgs;hb=032b5aacd233cd7b83ab6282aad638c161fdc400#l9
655 WCHAR szFileName[MAX_PATH];
656 LPWSTR pExtension;
657 BOOL hasName = _ILSimpleGetTextW(pidl, szFileName, _countof(szFileName));
658 dwShellAttributes |= SFGAO_STREAM;
659
660 // Vista+ feature: Hidden files with a leading tilde treated as super-hidden
661 // See https://devblogs.microsoft.com/oldnewthing/20170526-00/?p=96235
662 if (hasName && szFileName[0] == '~' && (dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
663 dwShellAttributes |= SFGAO_HIDDEN | SFGAO_SYSTEM;
664
665 if (hasName && (pExtension = PathFindExtensionW(szFileName)))
666 {
667 CLSID clsidFile;
668 // FIXME: Cache this?
669 HRESULT hr = GetCLSIDForFileTypeFromExtension(pExtension, L"CLSID", &clsidFile);
670 if (hr == S_OK)
671 {
672 HKEY hkey;
673 hr = SHRegGetCLSIDKeyW(clsidFile, L"ShellFolder", FALSE, FALSE, &hkey);
674 if (SUCCEEDED(hr))
675 {
677 DWORD dwSize = sizeof(dwAttributes);
679
681 if (Status == STATUS_SUCCESS)
682 {
683 TRACE("Augmenting '%S' with dwAttributes=0x%x\n", szFileName, dwAttributes);
684 dwShellAttributes |= dwAttributes;
685 }
686 ::RegCloseKey(hkey);
687
688 // This should be presented as directory!
689 bDirectory = (dwAttributes & SFGAO_FOLDER) != 0 || dwAttributes == 0;
690 TRACE("Treating '%S' as directory!\n", szFileName);
691 }
692 }
693 }
694 }
695
696 // This is a directory
697 if (bDirectory)
698 {
699 dwShellAttributes |= (SFGAO_FOLDER | /*SFGAO_HASSUBFOLDER |*/ SFGAO_STORAGE);
700
701 // Is this a real directory?
703 {
704 dwShellAttributes |= (SFGAO_FILESYSANCESTOR | SFGAO_STORAGEANCESTOR);
705 }
706 }
707
709 dwShellAttributes |= SFGAO_HIDDEN | SFGAO_GHOSTED;
710
712 dwShellAttributes |= SFGAO_READONLY;
713
715 dwShellAttributes |= SFGAO_SYSTEM;
716
718 dwShellAttributes |= SFGAO_COMPRESSED;
719
721 dwShellAttributes |= SFGAO_ENCRYPTED;
722
723 if ((SFGAO_NONENUMERATED & *pdwAttributes) && (dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
724 {
726 if ((!(shcf & SHCONTF_INCLUDEHIDDEN)) || ((dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) && !(shcf & SHCONTF_INCLUDESUPERHIDDEN)))
727 dwShellAttributes |= SFGAO_NONENUMERATED;
728 }
729
730 if (SFGAO_LINK & *pdwAttributes)
731 {
733
734 if (_ILGetExtension(pidl, ext, _countof(ext)) && !lstrcmpiW(ext, L"lnk"))
735 dwShellAttributes |= SFGAO_LINK;
736 }
737
738 if (SFGAO_HASSUBFOLDER & *pdwAttributes)
739 {
740 CComPtr<IShellFolder> psf2;
741 if (SUCCEEDED(psf->BindToObject(pidl, 0, IID_PPV_ARG(IShellFolder, &psf2))))
742 {
743 CComPtr<IEnumIDList> pEnumIL;
744 if (SUCCEEDED(psf2->EnumObjects(0, SHCONTF_FOLDERS, &pEnumIL)))
745 {
746 if (pEnumIL->Skip(1) == S_OK)
747 dwShellAttributes |= SFGAO_HASSUBFOLDER;
748 }
749 }
750 }
751
752 *pdwAttributes = dwShellAttributes;
753
754 TRACE ("-- 0x%08x\n", *pdwAttributes);
755 return S_OK;
756}
DWORD dwFileAttributes
#define FALSE
Definition: types.h:117
#define SFGAO_SYSTEM
Definition: shobjidl.idl:198
static const WCHAR *const ext[]
Definition: module.c:53
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4262
#define RRF_RT_REG_DWORD
Definition: driver.c:578
static HRESULT GetCLSIDForFileTypeFromExtension(LPCWSTR pExtension, LPCWSTR KeyName, CLSID *pclsid)
Definition: CFSFolder.cpp:109
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
Definition: path.c:447
BOOL WINAPI PathFileExistsW(LPCWSTR lpszPath)
Definition: path.c:1783
HRESULT WINAPI SHRegGetCLSIDKeyW(REFGUID, LPCWSTR, BOOL, BOOL, PHKEY)
Definition: reg.c:2422
HRESULT WINAPI StrRetToStrW(LPSTRRET lpStrRet, const ITEMIDLIST *pidl, LPWSTR *ppszName)
Definition: string.c:1631
unsigned int BOOL
Definition: ntddk_ex.h:94
Status
Definition: gdiplustypes.h:25
HRESULT GetDisplayNameOf([in] PCUITEMID_CHILD pidl, [in] SHGDNF uFlags, [out] STRRET *lpName)
static SHCONTF
Definition: ordinal.c:64
#define FILE_ATTRIBUTE_READONLY
Definition: nt_native.h:702
#define FILE_ATTRIBUTE_COMPRESSED
Definition: nt_native.h:711
#define FILE_ATTRIBUTE_HIDDEN
Definition: nt_native.h:703
#define FILE_ATTRIBUTE_SYSTEM
Definition: nt_native.h:704
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define FILE_ATTRIBUTE_ENCRYPTED
Definition: ntifs_ex.h:385
DWORD _ILGetFileAttributes(LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize)
Definition: pidl.c:2543
BOOL _ILGetExtension(LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize)
Definition: pidl.c:2496
#define STATUS_SUCCESS
Definition: shellext.h:65
SHCONTF SHELL_GetDefaultFolderEnumSHCONTF()
Definition: shlfolder.cpp:29
LSTATUS WINAPI SHRegGetValueW(_In_ HKEY hkey, _In_opt_ LPCWSTR pszSubKey, _In_opt_ LPCWSTR pszValue, _In_ SRRF srrfFlags, _Out_opt_ LPDWORD pdwType, _Out_writes_bytes_to_opt_(*pcbData, *pcbData) LPVOID pvData, _Inout_opt_ LPDWORD pcbData)
DWORD dwAttributes
Definition: vdmdbg.h:34
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by CFSFolder::GetAttributesOf().

◆ SHELL32_GUIDToStringA()

static __inline int SHELL32_GUIDToStringA ( REFGUID  guid,
LPSTR  str 
)
static

Definition at line 136 of file shfldr.h.

137{
138 return sprintf(str, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
139 guid.Data1, guid.Data2, guid.Data3,
140 guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
141 guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
142}
const GUID * guid
const WCHAR * str

◆ SHELL32_GUIDToStringW()

static __inline int SHELL32_GUIDToStringW ( REFGUID  guid,
LPWSTR  str 
)
static

Definition at line 144 of file shfldr.h.

145{
146 static const WCHAR fmtW[] =
147 { '{','%','0','8','l','X','-','%','0','4','X','-','%','0','4','X','-',
148 '%','0','2','X','%','0','2','X','-',
149 '%','0','2','X','%','0','2','X','%','0','2','X','%','0','2','X',
150 '%','0','2','X','%','0','2','X','}',0 };
151 return swprintf(str, fmtW,
152 guid.Data1, guid.Data2, guid.Data3,
153 guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
154 guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
155}

Referenced by CRegFolder::GetDisplayNameOf(), and SHELL32_IsShellFolderNamespaceItemHidden().

◆ SHELL32_ParseNextElement()

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

Definition at line 119 of file shlfolder.cpp.

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}
#define E_INVALIDARG
Definition: ddrawi.h:101
#define debugstr_w
Definition: kernel32.h:32
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:816

Referenced by CRegFolder::ParseDisplayName().

◆ SHELL_CreateAbsolutePidl()

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

Definition at line 57 of file shlfolder.cpp.

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

Referenced by CRegFolder::SetNameOf().

◆ SHELL_CreateFolderEnumItemAttributeQuery()

static SFGAOF SHELL_CreateFolderEnumItemAttributeQuery ( SHCONTF  Flags,
BOOL  ForRegItem 
)
inlinestatic

Definition at line 81 of file shfldr.h.

82{
83 SFGAOF query = SFGAO_FOLDER | (ForRegItem ? SFGAO_NONENUMERATED : 0);
84 if (!(Flags & SHCONTF_INCLUDEHIDDEN))
85 query |= SFGAO_HIDDEN;
86 if (!(Flags & SHCONTF_INCLUDESUPERHIDDEN))
87 query |= SFGAO_HIDDEN | SFGAO_SYSTEM;
88 return query;
89}
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
Definition: ebrowser.c:83
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170

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

◆ SHELL_FS_HideExtension()

BOOL SHELL_FS_HideExtension ( LPCWSTR  pwszPath)

Definition at line 1438 of file CFSFolder.cpp.

1439{
1440 HKEY hKey;
1441 BOOL doHide = FALSE; /* The default value is FALSE (win98 at least) */
1442 LONG lError;
1443
1444 doHide = !SHELL_GetSetting(SSF_SHOWEXTENSIONS, fShowExtensions);
1445
1446 if (!doHide)
1447 {
1449 if (*DotExt != 0)
1450 {
1452 LONG classlen = sizeof(classname);
1453 lError = RegQueryValueW(HKEY_CLASSES_ROOT, DotExt, classname, &classlen);
1454 if (lError == ERROR_SUCCESS)
1455 {
1457 if (lError == ERROR_SUCCESS)
1458 {
1459 lError = RegQueryValueExW(hKey, L"NeverShowExt", NULL, NULL, NULL, NULL);
1460 if (lError == ERROR_SUCCESS)
1461 doHide = TRUE;
1462
1464 }
1465 }
1466 }
1467 }
1468
1469 return doHide;
1470}
#define TRUE
Definition: types.h:120
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3268
LSTATUS WINAPI RegQueryValueW(HKEY hkey, LPCWSTR name, LPWSTR data, LPLONG count)
Definition: reg.c:4241
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
FxAutoRegKey hKey
LPCWSTR szPath
Definition: env.c:37
long LONG
Definition: pedump.c:60
WCHAR classname[128]
Definition: startup.c:15
#define SHELL_GetSetting(pss, ssf, field)
Definition: shellutils.h:830
#define SSF_SHOWEXTENSIONS
Definition: shlobj.h:1614

Referenced by CDefView::OnNotify(), CFSFolder::SetNameOf(), and SHELL_FS_ProcessDisplayFilename().

◆ SHELL_FS_ProcessDisplayFilename()

void SHELL_FS_ProcessDisplayFilename ( LPWSTR  szPath,
DWORD  dwFlags 
)

Definition at line 1472 of file CFSFolder.cpp.

1473{
1474 /*FIXME: MSDN also mentions SHGDN_FOREDITING which is not yet handled. */
1475 if (!(dwFlags & SHGDN_FORPARSING) &&
1476 ((dwFlags & SHGDN_INFOLDER) || (dwFlags == SHGDN_NORMAL))) {
1477 if (SHELL_FS_HideExtension(szPath) && szPath[0] != '.')
1479 }
1480}
BOOL SHELL_FS_HideExtension(LPCWSTR szPath)
Definition: CFSFolder.cpp:1438
void WINAPI PathRemoveExtensionW(LPWSTR lpszPath)
Definition: path.c:823

Referenced by CFSFolder::GetDisplayNameOf(), and CRecycleBin::GetDisplayNameOf().

◆ 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 ss
Definition: i386-dis.c:441
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

Referenced by SHELL32_GetFSItemAttributes().

◆ 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
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_NextElement()

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

Definition at line 70 of file shlfolder.cpp.

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}
#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
#define S_FALSE
Definition: winerror.h:2357

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