[SHELL32][EXPLORER][SHLWAPI][SDK] Implement SHGetSetSettings (#6982)

These settings are cached per-process (and invalidated by the global counter). This should reduce the number of registry reads performed by DefView and CFSFolder.
This commit is contained in:
Whindmar Saksit 2024-07-05 20:35:45 +02:00 committed by GitHub
parent 80c170d7bc
commit 71a3be2497
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 332 additions and 136 deletions

View file

@ -1563,10 +1563,14 @@ typedef struct
int iSortDirection;
UINT version;
UINT uNotUsed;
BOOL fSepProcess: 1;
BOOL fStartPanelOn: 1;
BOOL fShowStartPage: 1;
UINT fSpareFlags : 13;
BOOL fSepProcess : 1;
BOOL fStartPanelOn : 1;
BOOL fShowStartPage : 1;
BOOL fAutoCheckSelect : 1; // Vista+
BOOL fIconsOnly : 1;
BOOL fShowTypeOverlay : 1;
BOOL fShowStatusBar : 1; // 8+
UINT fSpareFlags : 9;
UINT :15; /* Required for proper binary layout with gcc */
} SHELLSTATE, *LPSHELLSTATE;
@ -1580,51 +1584,53 @@ typedef struct
BOOL fShowExtensions : 1;
BOOL fNoConfirmRecycle : 1;
BOOL fShowSysFiles : 1;
BOOL fShowCompColor : 1;
BOOL fDoubleClickInWebView : 1;
BOOL fDesktopHTML : 1;
BOOL fWin95Classic : 1;
BOOL fDontPrettyPath : 1;
BOOL fShowAttribCol : 1;
BOOL fMapNetDrvBtn : 1;
BOOL fShowInfoTip : 1;
BOOL fHideIcons : 1;
UINT fRestFlags : 3;
BOOL fAutoCheckSelect : 1;
BOOL fIconsOnly : 1;
UINT fRestFlags : 1;
UINT :15; /* Required for proper binary layout with gcc */
} SHELLFLAGSTATE, * LPSHELLFLAGSTATE;
VOID WINAPI SHGetSettings(_Out_ LPSHELLFLAGSTATE lpsfs, DWORD dwMask);
#define SSF_SHOWALLOBJECTS 0x0001
#define SSF_SHOWEXTENSIONS 0x0002
#define SSF_SHOWCOMPCOLOR 0x0008
#define SSF_SHOWSYSFILES 0x0020
#define SSF_DOUBLECLICKINWEBVIEW 0x0080
#define SSF_SHOWATTRIBCOL 0x0100
#define SSF_DESKTOPHTML 0x0200
#define SSF_WIN95CLASSIC 0x0400
#define SSF_DONTPRETTYPATH 0x0800
#define SSF_SHOWINFOTIP 0x2000
#define SSF_MAPNETDRVBUTTON 0x1000
#define SSF_NOCONFIRMRECYCLE 0x8000
#define SSF_HIDEICONS 0x4000
#define SSF_SHOWSUPERHIDDEN 0x00040000
#define SSF_SEPPROCESS 0x00080000
#define SSF_SHOWALLOBJECTS 0x00000001
#define SSF_SHOWEXTENSIONS 0x00000002
#define SSF_SHOWCOMPCOLOR 0x00000008
#define SSF_SORTCOLUMNS 0x00000010
#define SSF_SHOWSYSFILES 0x00000020
#define SSF_DOUBLECLICKINWEBVIEW 0x00000080
#define SSF_SHOWATTRIBCOL 0x00000100
#define SSF_DESKTOPHTML 0x00000200
#define SSF_WIN95CLASSIC 0x00000400
#define SSF_DONTPRETTYPATH 0x00000800
#define SSF_MAPNETDRVBUTTON 0x00001000
#define SSF_SHOWINFOTIP 0x00002000
#define SSF_HIDEICONS 0x00004000
#define SSF_NOCONFIRMRECYCLE 0x00008000
#define SSF_FILTER 0x00010000
#define SSF_WEBVIEW 0x00020000
#define SSF_SHOWSUPERHIDDEN 0x00040000
#define SSF_SEPPROCESS 0x00080000
#if (NTDDI_VERSION >= NTDDI_WINXP)
#define SSF_NONETCRAWLING 0x00100000
#define SSF_STARTPANELON 0x00200000
#define SSF_SHOWSTARTPAGE 0x00400000
#define SSF_NONETCRAWLING 0x00100000
#define SSF_STARTPANELON 0x00200000
#define SSF_SHOWSTARTPAGE 0x00400000
#endif
#if (NTDDI_VERSION >= NTDDI_VISTA)
#define SSF_AUTOCHECKSELECT 0x00800000
#define SSF_ICONSONLY 0x01000000
#define SSF_SHOWTYPEOVERLAY 0x02000000
#define SSF_AUTOCHECKSELECT 0x00800000
#define SSF_ICONSONLY 0x01000000
#define SSF_SHOWTYPEOVERLAY 0x02000000
#endif
#if (NTDDI_VERSION >= NTDDI_WIN8)
#define SSF_SHOWSTATUSBAR 0x04000000
#define SSF_SHOWSTATUSBAR 0x04000000
#endif
/****************************************************************************

View file

@ -783,5 +783,17 @@ DataObject_SetOffset(IDataObject* pDataObject, POINT* point)
#endif
#ifdef __cplusplus
struct SHELL_GetSettingImpl
{
SHELLSTATE ss;
SHELL_GetSettingImpl(DWORD ssf) { SHGetSetSettings(&ss, ssf, FALSE); }
const SHELLSTATE* operator ->() { return &ss; }
};
#define SHELL_GetSetting(ssf, field) ( SHELL_GetSettingImpl(ssf)->field )
#else
#define SHELL_GetSetting(pss, ssf, field) ( SHGetSetSettings((pss), (ssf), FALSE), (pss)->field )
#endif
#endif /* __ROS_SHELL_UTILS_H */

View file

@ -39,6 +39,29 @@ PVOID WINAPI SHInterlockedCompareExchange(PVOID *dest, PVOID xchg, PVOID compare
LONG WINAPI SHGlobalCounterGetValue(HANDLE hGlobalCounter);
LONG WINAPI SHGlobalCounterIncrement(HANDLE hGlobalCounter);
#if FALSE && ((DLL_EXPORT_VERSION) >= _WIN32_WINNT_VISTA)
#define SHELL_GCOUNTER_DEFINE_GUID(name, a, b, c, d, e, f, g, h, i, j, k) enum { SHELLUNUSEDCOUNTERGUID_##name }
#define SHELL_GCOUNTER_DEFINE_HANDLE(name) enum { SHELLUNUSEDCOUNTERHANDLE_##name }
#define SHELL_GCOUNTER_PARAMETERS(handle, id) id
#define SHELL_GlobalCounterCreate(refguid, handle) ( (refguid), (handle), (void)0 )
#define SHELL_GlobalCounterIsInitialized(handle) ( (handle), TRUE )
#define SHELL_GlobalCounterGet(id) SHGlobalCounterGetValue_Vista(id)
#define SHELL_GlobalCounterIncrement(id) SHGlobalCounterIncrement_Vista(id)
#else
#define SHELL_GCOUNTER_DEFINE_GUID(name, a, b, c, d, e, f, g, h, i, j, k) const GUID name = { a, b, c, { d, e, f, g, h, i, j, k } }
#define SHELL_GCOUNTER_DEFINE_HANDLE(name) HANDLE name = NULL
#define SHELL_GCOUNTER_PARAMETERS(handle, id) handle
#define SHELL_GlobalCounterCreate(refguid, handle) \
do { \
EXTERN_C HANDLE SHELL_GetCachedGlobalCounter(HANDLE *phGlobalCounter, REFGUID rguid); \
SHELL_GetCachedGlobalCounter(&(handle), (refguid)); \
} while (0)
#define SHELL_GlobalCounterIsInitialized(handle) ( (handle) != NULL )
#define SHELL_GlobalCounterGet(handle) SHGlobalCounterGetValue(handle)
#define SHELL_GlobalCounterIncrement(handle) SHGlobalCounterIncrement(handle)
#endif
#define SHELL_GCOUNTER_DECLAREPARAMETERS(handle, id) SHELL_GCOUNTER_PARAMETERS(HANDLE handle, SHGLOBALCOUNTER id)
DWORD WINAPI
SHRestrictionLookup(
_In_ DWORD policy,
@ -71,6 +94,7 @@ BOOL WINAPI SHSimulateDrop(IDropTarget *pDrop, IDataObject *pDataObj, DWORD grfK
HMENU WINAPI SHGetMenuFromID(HMENU hMenu, UINT uID);
DWORD WINAPI SHGetCurColorRes(void);
DWORD WINAPI SHWaitForSendMessageThread(HANDLE hand, DWORD dwTimeout);
DWORD WINAPI SHSendMessageBroadcastW(UINT uMsg, WPARAM wParam, LPARAM lParam);
HRESULT WINAPI SHIsExpandableFolder(LPSHELLFOLDER lpFolder, LPCITEMIDLIST pidl);
DWORD WINAPI SHFillRectClr(HDC hDC, LPCRECT pRect, COLORREF cRef);
int WINAPI SHSearchMapInt(const int *lpKeys, const int *lpValues, int iLen, int iKey);

View file

@ -535,6 +535,19 @@ BOOL WINAPI PathIsTemporaryW(_In_ LPCWSTR Str);
// #define DE_ERROR_MAX
#define ERRORONDEST 0x10000
/****************************************************************************
* Shell settings
*/
typedef struct _REGSHELLSTATE
{
DWORD dwSize;
SHELLSTATE ss;
} REGSHELLSTATE, *PREGSHELLSTATE;
#define REGSHELLSTATE_SIZE 0x24
#define REGSHELLSTATE_VERSION 0xD
C_ASSERT(sizeof(REGSHELLSTATE) == REGSHELLSTATE_SIZE);
/****************************************************************************
* Shell Namespace Routines
*/