[SHELL32] Respect StrCmpLogicalW policy in shell folders (#7900)

This commit is contained in:
Whindmar Saksit 2025-04-21 23:06:47 +02:00 committed by GitHub
parent 4514e748f0
commit fb6191b71a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 39 additions and 12 deletions

View file

@ -72,6 +72,7 @@ IntSetShellStateSettings(BOOL bDoubleClick, BOOL bUseCommonTasks)
shellstate.fWebView = !!bUseCommonTasks;
SHGetSetSettings(&shellstate, SSF_DOUBLECLICKINWEBVIEW | SSF_WEBVIEW, TRUE);
// FIXME: This is not correct, it does nothing. SHGetSetSettings will broadcast it.
SHSettingsChanged(0, L"ShellState");
return TRUE;
}
@ -107,7 +108,7 @@ static BOOL IntSetUnderlineState(BOOL bIconUnderline)
if (Status != ERROR_SUCCESS)
return FALSE;
SHSettingsChanged(0, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\IconUnderline");
SHSendMessageBroadcastW(WM_SETTINGCHANGE, 0, (LPARAM)L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\IconUnderline");
return TRUE;
}

View file

@ -942,8 +942,11 @@ ViewDlg_Apply(HWND hwndDlg)
// update user's settings
SHGetSetSettings(&ShellState, dwMask, TRUE);
// invalidate cached restrictions
SHSettingsChanged(0, 0);
// notify all
SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, 0);
SHSendMessageBroadcastW(WM_WININICHANGE, 0, 0);
PostCabinetMessage(WM_COMMAND, FCIDM_DESKBROWSER_REFRESH, 0);
}

View file

@ -345,10 +345,10 @@ HRESULT WINAPI CControlPanelFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE
switch(LOWORD(lParam))
{
case CONTROLPANEL_COL_NAME:
result = _wcsicmp(pData1->szName + pData1->offsDispName, pData2->szName + pData2->offsDispName);
result = SHELL_StrCmpLogical(pData1->szName + pData1->offsDispName, pData2->szName + pData2->offsDispName);
break;
case CONTROLPANEL_COL_COMMENT:
result = _wcsicmp(pData1->szName + pData1->offsComment, pData2->szName + pData2->offsComment);
result = SHELL_StrCmpLogical(pData1->szName + pData1->offsComment, pData2->szName + pData2->offsComment);
break;
default:
ERR("Got wrong lParam!\n");

View file

@ -1127,7 +1127,7 @@ HRESULT WINAPI CFSFolder::CompareIDs(LPARAM lParam,
switch (LOWORD(lParam))
{
case SHFSF_COL_NAME:
result = _wcsicmp(pszName1, pszName2);
result = CompareUiStrings(pszName1, pszName2, lParam);
break;
case SHFSF_COL_SIZE:
if (pData1->u.file.dwFileSize > pData2->u.file.dwFileSize)
@ -1141,7 +1141,7 @@ HRESULT WINAPI CFSFolder::CompareIDs(LPARAM lParam,
// FIXME: Compare the type strings from SHGetFileInfo
pExtension1 = PathFindExtensionW(pszName1);
pExtension2 = PathFindExtensionW(pszName2);
result = _wcsicmp(pExtension1, pExtension2);
result = CompareUiStrings(pExtension1, pExtension2, lParam);
break;
case SHFSF_COL_MDATE:
result = pData1->u.file.uFileDate - pData2->u.file.uFileDate;

View file

@ -133,9 +133,11 @@ class CFSFolder :
static HRESULT FormatDateTime(const FILETIME &ft, LPWSTR Buf, UINT cchBuf);
static HRESULT FormatSize(UINT64 size, LPWSTR Buf, UINT cchBuf);
static HRESULT CompareSortFoldersFirst(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2);
static inline int CompareUiStrings(LPCWSTR a, LPCWSTR b)
static inline int CompareUiStrings(LPCWSTR a, LPCWSTR b, LPARAM lParam = 0)
{
return StrCmpLogicalW(a, b);
if (lParam & SHCIDS_CANONICALONLY)
return _wcsicmp(a, b);
return SHELL_StrCmpLogical(a, b);
}
};

View file

@ -762,7 +762,7 @@ HRESULT WINAPI CRecycleBin::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1,
return CompareCanonical(*pData1, *pData2);
pName1 = GetItemOriginalFileName(*pData1);
pName2 = GetItemOriginalFileName(*pData2);
result = CFSFolder::CompareUiStrings(pName1, pName2);
result = CFSFolder::CompareUiStrings(pName1, pName2, lParam);
}
else
{
@ -782,7 +782,7 @@ HRESULT WINAPI CRecycleBin::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1,
{
if (SUCCEEDED(hr = GetItemOriginalFolder(*pData2, const_cast<LPWSTR&>(pName2))))
{
result = CFSFolder::CompareUiStrings(pName1, pName2);
result = CFSFolder::CompareUiStrings(pName1, pName2, lParam);
SHFree(const_cast<LPWSTR>(pName2));
}
SHFree(const_cast<LPWSTR>(pName1));
@ -797,7 +797,7 @@ HRESULT WINAPI CRecycleBin::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1,
case COLUMN_TYPE:
GetItemTypeName(pidl1, *pData1, shfi1);
GetItemTypeName(pidl2, *pData2, shfi2);
result = CFSFolder::CompareUiStrings(shfi1.szTypeName, shfi2.szTypeName);
result = CFSFolder::CompareUiStrings(shfi1.szTypeName, shfi2.szTypeName, lParam);
break;
case COLUMN_MTIME:
_ILGetFileDateTime(pidl1, &ft1);

View file

@ -431,6 +431,7 @@ LRESULT CDesktopBrowser::OnSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam
LPVOID lpEnvironment;
RegenerateUserEnvironment(&lpEnvironment, TRUE);
}
SHSettingsChanged((LPCVOID)wParam, (PCWSTR)lParam); // Invalidate cached restrictions
if (m_hWndShellView)
{

View file

@ -307,7 +307,7 @@ HRESULT SHELL32_CompareDetails(IShellFolder2* isf, LPARAM lParam, LPCITEMIDLIST
if (FAILED(hres))
return MAKE_COMPARE_HRESULT(1);
int ret = _wcsicmp(wszItem1, wszItem2);
int ret = CFSFolder::CompareUiStrings(wszItem1, wszItem2, lParam);
if (ret == 0)
return SHELL32_CompareChildren(isf, lParam, pidl1, pidl2);

View file

@ -35,6 +35,7 @@ extern "C" {
*/
extern HMODULE huser32 DECLSPEC_HIDDEN;
extern HINSTANCE shell32_hInstance DECLSPEC_HIDDEN;
extern int (WINAPI* SHELL_StrCmpLogical)(PCWSTR s1, PCWSTR s2);
BOOL WINAPI Shell_GetImageLists(HIMAGELIST * lpBigList, HIMAGELIST * lpSmallList);

View file

@ -40,6 +40,7 @@
#include <shlobj.h>
#include <initguid.h>
#include <shlwapi_undoc.h>
#include <shlwapi.h>
#include <wine/debug.h>
#include "shell32_main.h"
@ -66,6 +67,21 @@ HANDLE g_hRestGlobalCounter = NULL;
LONG g_nRestCountValue = -1;
DWORD g_RestValues[_countof(s_PolicyTable)] = { 0 };
#ifdef __REACTOS__
int WINAPI SHELL_StrCmpLogicalInit(PCWSTR s1, PCWSTR s2)
{
SHELL_StrCmpLogical = SHRestricted(REST_NOSTRCMPLOGICAL) ? StrCmpIW : StrCmpLogicalW;
return SHELL_StrCmpLogical(s1, s2);
}
int (WINAPI* SHELL_StrCmpLogical)(PCWSTR s1, PCWSTR s2) = SHELL_StrCmpLogicalInit;
static void SH32_RestrictionsChanged()
{
SHELL_StrCmpLogical = SHELL_StrCmpLogicalInit;
}
#endif
/****************************************************************************
* SHELL_GetCachedGlobalCounter
*
@ -153,7 +169,10 @@ DWORD WINAPI SHRestricted (RESTRICTIONS rest)
/* If restrictions from registry have changed, reset all cached values to SHELL_NO_POLICY */
if (SHELL_QueryRestrictionsChanged())
{
FillMemory(&g_RestValues, sizeof(g_RestValues), 0xFF);
SH32_RestrictionsChanged();
}
return SHRestrictionLookup(rest, NULL, s_PolicyTable, g_RestValues);
}