ReactOS 0.4.16-dev-178-g8ba6102
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_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)
 
void AddFSClassKeysToArray (UINT cidl, PCUITEMID_CHILD_ARRAY apidl, HKEY *array, UINT *cKeys)
 
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)
 
LSTATUS AddClassKeyToArray (const WCHAR *szClass, HKEY *array, UINT *cKeys)
 
LSTATUS AddClsidKeyToArray (REFCLSID clsid, 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 305 of file shlfolder.cpp.

306{
307 if (*cKeys >= 16)
308 return ERROR_MORE_DATA;
309
310 HKEY hkey;
312 if (result == ERROR_SUCCESS)
313 {
314 array[*cKeys] = hkey;
315 *cKeys += 1;
316 }
317 return result;
318}
#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(), CDesktopFolder::CreateViewObject(), CDrivesFolder::CreateViewObject(), CFSFolder::CreateViewObject(), CRegItemContextMenu_CreateInstance(), CDesktopFolder::GetUIObjectOf(), and CNetFolder::GetUIObjectOf().

◆ AddClsidKeyToArray()

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

Definition at line 320 of file shlfolder.cpp.

321{
322 WCHAR path[6 + 38 + 1] = L"CLSID\\";
323 StringFromGUID2(clsid, path + 6, 38 + 1);
324 return AddClassKeyToArray(path, array, cKeys);
325}
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:305
__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 327 of file shlfolder.cpp.

328{
329 // This function opens the association array keys in canonical order for filesystem items.
330 // The order is documented: learn.microsoft.com/en-us/windows/win32/shell/fa-associationarray
331
332 ASSERT(cidl >= 1 && apidl);
333 PCUITEMID_CHILD pidl = apidl[0];
334 if (_ILIsValue(pidl))
335 {
337 PWSTR name;
338 FileStructW* pFileData = _ILGetFileStructW(pidl);
339 if (pFileData)
340 {
341 name = pFileData->wszName;
342 }
343 else
344 {
346 name = buf;
347 }
348 LPCWSTR extension = PathFindExtension(name);
349
350 if (extension)
351 {
352 WCHAR wszClass[MAX_PATH], wszSFA[23 + _countof(wszClass)];
353 DWORD dwSize = sizeof(wszClass);
354 if (RegGetValueW(HKEY_CLASSES_ROOT, extension, NULL, RRF_RT_REG_SZ, NULL, wszClass, &dwSize) != ERROR_SUCCESS ||
355 !*wszClass || AddClassKeyToArray(wszClass, array, cKeys) != ERROR_SUCCESS)
356 {
357 // Only add the extension key if the ProgId is not valid
358 AddClassKeyToArray(extension, array, cKeys);
359
360 // "Open With" becomes the default when there are no verbs in the above keys
361 if (cidl == 1)
362 AddClassKeyToArray(L"Unknown", array, cKeys);
363 }
364
365 swprintf(wszSFA, L"SystemFileAssociations\\%s", extension);
366 AddClassKeyToArray(wszSFA, array, cKeys);
367
368 dwSize = sizeof(wszClass);
369 if (RegGetValueW(HKEY_CLASSES_ROOT, extension, L"PerceivedType ", RRF_RT_REG_SZ, NULL, wszClass, &dwSize) == ERROR_SUCCESS)
370 {
371 swprintf(wszSFA, L"SystemFileAssociations\\%s", wszClass);
372 AddClassKeyToArray(wszSFA, array, cKeys);
373 }
374 }
375
376 AddClassKeyToArray(L"*", array, cKeys);
377 AddClassKeyToArray(L"AllFilesystemObjects", array, cKeys);
378 }
379 else if (_ILIsFolder(pidl))
380 {
381 // FIXME: Directory > Folder > AFO is the correct order and it's
382 // the order Windows reports in its undocumented association array
383 // but it is somehow not the order Windows adds the items to its menu!
384 // Until the correct algorithm in CDefaultContextMenu can be determined,
385 // we add the folder keys in "menu order".
386 AddClassKeyToArray(L"Folder", array, cKeys);
387 AddClassKeyToArray(L"AllFilesystemObjects", array, cKeys);
388 AddClassKeyToArray(L"Directory", array, cKeys);
389 }
390 else
391 {
392 ERR("Got non FS pidl\n");
393 }
394}
#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:2334
BOOL _ILIsFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2021
BOOL _ILIsValue(LPCITEMIDLIST pidl)
Definition: pidl.c:2030
DWORD _ILSimpleGetTextW(LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
Definition: pidl.c:2080
#define PathFindExtension
Definition: shlwapi.h:933
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 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().

◆ CRegFolder_CreateInstance()

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

Definition at line 943 of file CRegFolder.cpp.

944{
945 return ShellObjectCreatorInit<CRegFolder>(pInit, pidlRoot, riid, ppv);
946}
PWDFDEVICE_INIT pInit

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

◆ HCR_RegOpenClassIDKey()

BOOL HCR_RegOpenClassIDKey ( REFIID  riid,
HKEY hkey 
)

Definition at line 236 of file classes.c.

237{
238 char xriid[50];
239 sprintf( xriid, "CLSID\\{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
240 riid->Data1, riid->Data2, riid->Data3,
241 riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3],
242 riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7] );
243
244 TRACE("%s\n",xriid );
245
246 return !RegOpenKeyExA(HKEY_CLASSES_ROOT, xriid, 0, KEY_READ, hkey);
247}
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().

◆ SH_GetApidlFromDataObject()

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

Definition at line 396 of file shlfolder.cpp.

397{
398 CDataObjectHIDA cida(pDataObject);
399
400 if (FAILED_UNEXPECTEDLY(cida.hr()))
401 return cida.hr();
402
403 /* convert the data into pidl */
404 LPITEMIDLIST pidl;
405 LPITEMIDLIST *apidl = _ILCopyCidaToaPidl(&pidl, cida);
406 if (!apidl)
407 {
408 return E_OUTOFMEMORY;
409 }
410
411 *ppidlfolder = pidl;
412 *apidlItems = apidl;
413 *pcidl = cida->cidl;
414
415 return S_OK;
416}
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
#define S_OK
Definition: intsafe.h:52
LPITEMIDLIST * _ILCopyCidaToaPidl(LPITEMIDLIST *pidl, const CIDA *cida)
Definition: pidl.c:2638
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 196 of file shlfolder.cpp.

198{
199 PITEMID_CHILD pidlChild = ILCloneFirst (pidl);
200 if (!pidlChild)
201 return E_FAIL;
202
205 ppfti,
206 pidlChild,
207 clsid,
209 ILFree(pidlChild);
210
212 return hr;
213
214 if (_ILIsPidlSimple (pidl))
215 return psf->QueryInterface(riid, ppvOut);
216 else
217 return psf->BindToObject(ILGetNext (pidl), NULL, riid, ppvOut);
218}
#define E_FAIL
Definition: ddrawi.h:102
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:946
LPITEMIDLIST WINAPI ILCloneFirst(LPCITEMIDLIST pidl)
Definition: pidl.c:262
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
Definition: pidl.c:872
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:158
#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 252 of file shlfolder.cpp.

253{
254 PUIDLIST_RELATIVE nextpidl1 = ILGetNext (pidl1);
255 PUIDLIST_RELATIVE nextpidl2 = ILGetNext (pidl2);
256
257 bool isEmpty1 = _ILIsDesktop(nextpidl1);
258 bool isEmpty2 = _ILIsDesktop(nextpidl2);
259 if (isEmpty1 || isEmpty2)
260 return MAKE_COMPARE_HRESULT(isEmpty2 - isEmpty1);
261
262 PITEMID_CHILD firstpidl = ILCloneFirst (pidl1);
263 if (!firstpidl)
264 return E_OUTOFMEMORY;
265
267 HRESULT hr = psf->BindToObject(firstpidl, 0, IID_PPV_ARG(IShellFolder, &psf2));
268 ILFree(firstpidl);
269 if (FAILED(hr))
270 return MAKE_COMPARE_HRESULT(0);
271
272 return psf2->CompareIDs(lParam, nextpidl1, nextpidl2);
273}
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:621
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 275 of file shlfolder.cpp.

276{
278 WCHAR wszItem1[MAX_PATH], wszItem2[MAX_PATH];
280 UINT col = LOWORD(lParam); // Column index without SHCIDS_* flags
281
282 hres = isf->GetDetailsOf(pidl1, col, &sd);
283 if (FAILED(hres))
284 return MAKE_COMPARE_HRESULT(1);
285
286 hres = StrRetToBufW(&sd.str, pidl1, wszItem1, MAX_PATH);
287 if (FAILED(hres))
288 return MAKE_COMPARE_HRESULT(1);
289
290 hres = isf->GetDetailsOf(pidl2, col, &sd);
291 if (FAILED(hres))
292 return MAKE_COMPARE_HRESULT(1);
293
294 hres = StrRetToBufW(&sd.str, pidl2, wszItem2, MAX_PATH);
295 if (FAILED(hres))
296 return MAKE_COMPARE_HRESULT(1);
297
298 int ret = _wcsicmp(wszItem1, wszItem2);
299 if (ret == 0)
300 return SHELL32_CompareChildren(isf, lParam, pidl1, pidl2);
301
303}
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
unsigned int UINT
Definition: ndis.h:50
#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:252
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 234 of file shlfolder.cpp.

236{
237 LPITEMIDLIST pidlFirst = ILCloneFirst(pidl);
238 if (!pidlFirst)
239 return E_OUTOFMEMORY;
240
241 CComPtr<IShellFolder> psfChild;
242 HRESULT hr = psf->BindToObject(pidlFirst, NULL, IID_PPV_ARG(IShellFolder, &psfChild));
243 if (SUCCEEDED (hr))
244 {
245 hr = psfChild->GetDisplayNameOf(ILGetNext (pidl), dwFlags, strRet);
246 }
247 ILFree (pidlFirst);
248
249 return hr;
250}
#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 588 of file CFSFolder.cpp.

589{
590 DWORD dwFileAttributes, dwShellAttributes;
591
592 if (!_ILIsFolder(pidl) && !_ILIsValue(pidl))
593 {
594 ERR("Got wrong type of pidl!\n");
595 *pdwAttributes &= SFGAO_CANLINK;
596 return S_OK;
597 }
598
600
601 /* Set common attributes */
602 dwShellAttributes = SFGAO_CANCOPY | SFGAO_CANMOVE | SFGAO_CANLINK | SFGAO_CANRENAME | SFGAO_CANDELETE |
603 SFGAO_HASPROPSHEET | SFGAO_DROPTARGET | SFGAO_FILESYSTEM;
604
605 BOOL bDirectory = (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0;
606
607 if (SFGAO_VALIDATE & *pdwAttributes)
608 {
609 STRRET strret;
610 LPWSTR path;
611 if (SUCCEEDED(psf->GetDisplayNameOf(pidl, SHGDN_FORPARSING, &strret)) &&
612 SUCCEEDED(StrRetToStrW(&strret, pidl, &path)))
613 {
614 BOOL exists = PathFileExistsW(path);
615 SHFree(path);
616 if (!exists)
617 return E_FAIL;
618 }
619 }
620
621 if (!bDirectory)
622 {
623 // https://git.reactos.org/?p=reactos.git;a=blob;f=dll/shellext/zipfldr/res/zipfldr.rgs;hb=032b5aacd233cd7b83ab6282aad638c161fdc400#l9
624 WCHAR szFileName[MAX_PATH];
625 LPWSTR pExtension;
626 BOOL hasName = _ILSimpleGetTextW(pidl, szFileName, _countof(szFileName));
627 dwShellAttributes |= SFGAO_STREAM;
628
629 // Vista+ feature: Hidden files with a leading tilde treated as super-hidden
630 // See https://devblogs.microsoft.com/oldnewthing/20170526-00/?p=96235
631 if (hasName && szFileName[0] == '~' && (dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
632 dwShellAttributes |= SFGAO_HIDDEN | SFGAO_SYSTEM;
633
634 if (hasName && (pExtension = PathFindExtensionW(szFileName)))
635 {
636 CLSID clsidFile;
637 // FIXME: Cache this?
638 HRESULT hr = GetCLSIDForFileTypeFromExtension(pExtension, L"CLSID", &clsidFile);
639 if (hr == S_OK)
640 {
641 HKEY hkey;
642 hr = SHRegGetCLSIDKeyW(clsidFile, L"ShellFolder", FALSE, FALSE, &hkey);
643 if (SUCCEEDED(hr))
644 {
646 DWORD dwSize = sizeof(dwAttributes);
648
650 if (Status == STATUS_SUCCESS)
651 {
652 TRACE("Augmenting '%S' with dwAttributes=0x%x\n", szFileName, dwAttributes);
653 dwShellAttributes |= dwAttributes;
654 }
655 ::RegCloseKey(hkey);
656
657 // This should be presented as directory!
658 bDirectory = (dwAttributes & SFGAO_FOLDER) != 0 || dwAttributes == 0;
659 TRACE("Treating '%S' as directory!\n", szFileName);
660 }
661 }
662 }
663 }
664
665 // This is a directory
666 if (bDirectory)
667 {
668 dwShellAttributes |= (SFGAO_FOLDER | /*SFGAO_HASSUBFOLDER |*/ SFGAO_STORAGE);
669
670 // Is this a real directory?
672 {
673 dwShellAttributes |= (SFGAO_FILESYSANCESTOR | SFGAO_STORAGEANCESTOR);
674 }
675 }
676
678 dwShellAttributes |= SFGAO_HIDDEN | SFGAO_GHOSTED;
679
681 dwShellAttributes |= SFGAO_READONLY;
682
684 dwShellAttributes |= SFGAO_SYSTEM;
685
687 dwShellAttributes |= SFGAO_COMPRESSED;
688
690 dwShellAttributes |= SFGAO_ENCRYPTED;
691
692 if ((SFGAO_NONENUMERATED & *pdwAttributes) && (dwFileAttributes & FILE_ATTRIBUTE_HIDDEN))
693 {
695 if ((!(shcf & SHCONTF_INCLUDEHIDDEN)) || ((dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) && !(shcf & SHCONTF_INCLUDESUPERHIDDEN)))
696 dwShellAttributes |= SFGAO_NONENUMERATED;
697 }
698
699 if (SFGAO_LINK & *pdwAttributes)
700 {
702
703 if (_ILGetExtension(pidl, ext, _countof(ext)) && !lstrcmpiW(ext, L"lnk"))
704 dwShellAttributes |= SFGAO_LINK;
705 }
706
707 if (SFGAO_HASSUBFOLDER & *pdwAttributes)
708 {
709 CComPtr<IShellFolder> psf2;
710 if (SUCCEEDED(psf->BindToObject(pidl, 0, IID_PPV_ARG(IShellFolder, &psf2))))
711 {
712 CComPtr<IEnumIDList> pEnumIL;
713 if (SUCCEEDED(psf2->EnumObjects(0, SHCONTF_FOLDERS, &pEnumIL)))
714 {
715 if (pEnumIL->Skip(1) == S_OK)
716 dwShellAttributes |= SFGAO_HASSUBFOLDER;
717 }
718 }
719 }
720
721 *pdwAttributes = dwShellAttributes;
722
723 TRACE ("-- 0x%08x\n", *pdwAttributes);
724 return S_OK;
725}
DWORD dwFileAttributes
#define RegCloseKey(hKey)
Definition: registry.h:49
#define FALSE
Definition: types.h:117
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:78
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:1777
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:2560
BOOL _ILGetExtension(LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize)
Definition: pidl.c:2460
#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 135 of file shfldr.h.

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

◆ SHELL32_GUIDToStringW()

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

Definition at line 143 of file shfldr.h.

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

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 107 of file shlfolder.cpp.

109{
111 LPITEMIDLIST pidlIn = pidlInOut ? *pidlInOut : NULL;
112 LPITEMIDLIST pidlOut = NULL;
113 LPITEMIDLIST pidlTemp = NULL;
114 CComPtr<IShellFolder> psfChild;
115
116 TRACE ("(%p, %p, %p, %s)\n", psf, pbc, pidlIn, debugstr_w (szNext));
117
118 /* get the shellfolder for the child pidl and let it analyse further */
119 hr = psf->BindToObject(pidlIn, pbc, IID_PPV_ARG(IShellFolder, &psfChild));
120 if (FAILED(hr))
121 return hr;
122
123 hr = psfChild->ParseDisplayName(hwndOwner, pbc, szNext, pEaten, &pidlOut, pdwAttributes);
124 if (FAILED(hr))
125 return hr;
126
127 pidlTemp = ILCombine (pidlIn, pidlOut);
128 if (!pidlTemp)
129 {
131 if (pidlOut)
132 ILFree(pidlOut);
133 return hr;
134 }
135
136 if (pidlOut)
137 ILFree (pidlOut);
138
139 if (pidlIn)
140 ILFree (pidlIn);
141
142 *pidlInOut = pidlTemp;
143
144 TRACE ("-- pidl=%p ret=0x%08x\n", pidlInOut ? *pidlInOut : NULL, hr);
145 return S_OK;
146}
#define E_INVALIDARG
Definition: ddrawi.h:101
#define debugstr_w
Definition: kernel32.h:32
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:718

Referenced by CRegFolder::ParseDisplayName().

◆ 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 1396 of file CFSFolder.cpp.

1397{
1398 HKEY hKey;
1399 BOOL doHide = FALSE; /* The default value is FALSE (win98 at least) */
1400 LONG lError;
1401
1402 doHide = !SHELL_GetSetting(SSF_SHOWEXTENSIONS, fShowExtensions);
1403
1404 if (!doHide)
1405 {
1407 if (*DotExt != 0)
1408 {
1410 LONG classlen = sizeof(classname);
1411 lError = RegQueryValueW(HKEY_CLASSES_ROOT, DotExt, classname, &classlen);
1412 if (lError == ERROR_SUCCESS)
1413 {
1415 if (lError == ERROR_SUCCESS)
1416 {
1417 lError = RegQueryValueExW(hKey, L"NeverShowExt", NULL, NULL, NULL, NULL);
1418 if (lError == ERROR_SUCCESS)
1419 doHide = TRUE;
1420
1422 }
1423 }
1424 }
1425 }
1426
1427 return doHide;
1428}
#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:828
#define SSF_SHOWEXTENSIONS
Definition: shlobj.h:1606

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

◆ SHELL_FS_ProcessDisplayFilename()

void SHELL_FS_ProcessDisplayFilename ( LPWSTR  szPath,
DWORD  dwFlags 
)

Definition at line 1430 of file CFSFolder.cpp.

1431{
1432 /*FIXME: MSDN also mentions SHGDN_FOREDITING which is not yet handled. */
1433 if (!(dwFlags & SHGDN_FORPARSING) &&
1434 ((dwFlags & SHGDN_INFOLDER) || (dwFlags == SHGDN_NORMAL))) {
1435 if (SHELL_FS_HideExtension(szPath) && szPath[0] != '.')
1437 }
1438}
BOOL SHELL_FS_HideExtension(LPCWSTR szPath)
Definition: CFSFolder.cpp:1396
void WINAPI PathRemoveExtensionW(LPWSTR lpszPath)
Definition: path.c:823

Referenced by CFSFolder::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:1621
#define SSF_SHOWALLOBJECTS
Definition: shlobj.h:1605

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 58 of file shlfolder.cpp.

63{
64 *pszOut = UNICODE_NULL;
65
66 if (!*ppch)
67 return S_FALSE;
68
69 HRESULT hr;
70 LPWSTR pchNext = wcschr(*ppch, L'\\');
71 if (pchNext)
72 {
73 if (*ppch < pchNext)
74 {
75 /* Get an element */
76 StringCchCopyNW(pszOut, cchOut, *ppch, pchNext - *ppch);
77 ++pchNext;
78
79 if (!*pchNext)
80 pchNext = NULL; /* No next */
81
82 hr = S_OK;
83 }
84 else /* Double backslashes found? */
85 {
86 pchNext = NULL;
88 }
89 }
90 else /* No more next */
91 {
92 StringCchCopyW(pszOut, cchOut, *ppch);
93 hr = S_OK;
94 }
95
96 *ppch = pchNext; /* Go next */
97
98 if (hr == S_OK && bValidate && !PathIsValidElement(pszOut))
99 {
100 *pszOut = UNICODE_NULL;
102 }
103
104 return hr;
105}
#define wcschr
Definition: compat.h:17
BOOL PathIsValidElement(_In_ LPCWSTR pszPath)
Definition: utils.cpp:38
#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().