[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; shellstate.fWebView = !!bUseCommonTasks;
SHGetSetSettings(&shellstate, SSF_DOUBLECLICKINWEBVIEW | SSF_WEBVIEW, TRUE); SHGetSetSettings(&shellstate, SSF_DOUBLECLICKINWEBVIEW | SSF_WEBVIEW, TRUE);
// FIXME: This is not correct, it does nothing. SHGetSetSettings will broadcast it.
SHSettingsChanged(0, L"ShellState"); SHSettingsChanged(0, L"ShellState");
return TRUE; return TRUE;
} }
@ -107,7 +108,7 @@ static BOOL IntSetUnderlineState(BOOL bIconUnderline)
if (Status != ERROR_SUCCESS) if (Status != ERROR_SUCCESS)
return FALSE; 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; return TRUE;
} }

View file

@ -942,8 +942,11 @@ ViewDlg_Apply(HWND hwndDlg)
// update user's settings // update user's settings
SHGetSetSettings(&ShellState, dwMask, TRUE); SHGetSetSettings(&ShellState, dwMask, TRUE);
// invalidate cached restrictions
SHSettingsChanged(0, 0);
// notify all // notify all
SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, 0); SHSendMessageBroadcastW(WM_WININICHANGE, 0, 0);
PostCabinetMessage(WM_COMMAND, FCIDM_DESKBROWSER_REFRESH, 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)) switch(LOWORD(lParam))
{ {
case CONTROLPANEL_COL_NAME: 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; break;
case CONTROLPANEL_COL_COMMENT: 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; break;
default: default:
ERR("Got wrong lParam!\n"); ERR("Got wrong lParam!\n");

View file

@ -1127,7 +1127,7 @@ HRESULT WINAPI CFSFolder::CompareIDs(LPARAM lParam,
switch (LOWORD(lParam)) switch (LOWORD(lParam))
{ {
case SHFSF_COL_NAME: case SHFSF_COL_NAME:
result = _wcsicmp(pszName1, pszName2); result = CompareUiStrings(pszName1, pszName2, lParam);
break; break;
case SHFSF_COL_SIZE: case SHFSF_COL_SIZE:
if (pData1->u.file.dwFileSize > pData2->u.file.dwFileSize) 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 // FIXME: Compare the type strings from SHGetFileInfo
pExtension1 = PathFindExtensionW(pszName1); pExtension1 = PathFindExtensionW(pszName1);
pExtension2 = PathFindExtensionW(pszName2); pExtension2 = PathFindExtensionW(pszName2);
result = _wcsicmp(pExtension1, pExtension2); result = CompareUiStrings(pExtension1, pExtension2, lParam);
break; break;
case SHFSF_COL_MDATE: case SHFSF_COL_MDATE:
result = pData1->u.file.uFileDate - pData2->u.file.uFileDate; 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 FormatDateTime(const FILETIME &ft, LPWSTR Buf, UINT cchBuf);
static HRESULT FormatSize(UINT64 size, LPWSTR Buf, UINT cchBuf); static HRESULT FormatSize(UINT64 size, LPWSTR Buf, UINT cchBuf);
static HRESULT CompareSortFoldersFirst(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); 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); return CompareCanonical(*pData1, *pData2);
pName1 = GetItemOriginalFileName(*pData1); pName1 = GetItemOriginalFileName(*pData1);
pName2 = GetItemOriginalFileName(*pData2); pName2 = GetItemOriginalFileName(*pData2);
result = CFSFolder::CompareUiStrings(pName1, pName2); result = CFSFolder::CompareUiStrings(pName1, pName2, lParam);
} }
else else
{ {
@ -782,7 +782,7 @@ HRESULT WINAPI CRecycleBin::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1,
{ {
if (SUCCEEDED(hr = GetItemOriginalFolder(*pData2, const_cast<LPWSTR&>(pName2)))) 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>(pName2));
} }
SHFree(const_cast<LPWSTR>(pName1)); SHFree(const_cast<LPWSTR>(pName1));
@ -797,7 +797,7 @@ HRESULT WINAPI CRecycleBin::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1,
case COLUMN_TYPE: case COLUMN_TYPE:
GetItemTypeName(pidl1, *pData1, shfi1); GetItemTypeName(pidl1, *pData1, shfi1);
GetItemTypeName(pidl2, *pData2, shfi2); GetItemTypeName(pidl2, *pData2, shfi2);
result = CFSFolder::CompareUiStrings(shfi1.szTypeName, shfi2.szTypeName); result = CFSFolder::CompareUiStrings(shfi1.szTypeName, shfi2.szTypeName, lParam);
break; break;
case COLUMN_MTIME: case COLUMN_MTIME:
_ILGetFileDateTime(pidl1, &ft1); _ILGetFileDateTime(pidl1, &ft1);

View file

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

View file

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

View file

@ -35,6 +35,7 @@ extern "C" {
*/ */
extern HMODULE huser32 DECLSPEC_HIDDEN; extern HMODULE huser32 DECLSPEC_HIDDEN;
extern HINSTANCE shell32_hInstance 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); BOOL WINAPI Shell_GetImageLists(HIMAGELIST * lpBigList, HIMAGELIST * lpSmallList);

View file

@ -40,6 +40,7 @@
#include <shlobj.h> #include <shlobj.h>
#include <initguid.h> #include <initguid.h>
#include <shlwapi_undoc.h> #include <shlwapi_undoc.h>
#include <shlwapi.h>
#include <wine/debug.h> #include <wine/debug.h>
#include "shell32_main.h" #include "shell32_main.h"
@ -66,6 +67,21 @@ HANDLE g_hRestGlobalCounter = NULL;
LONG g_nRestCountValue = -1; LONG g_nRestCountValue = -1;
DWORD g_RestValues[_countof(s_PolicyTable)] = { 0 }; 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 * 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 restrictions from registry have changed, reset all cached values to SHELL_NO_POLICY */
if (SHELL_QueryRestrictionsChanged()) if (SHELL_QueryRestrictionsChanged())
{
FillMemory(&g_RestValues, sizeof(g_RestValues), 0xFF); FillMemory(&g_RestValues, sizeof(g_RestValues), 0xFF);
SH32_RestrictionsChanged();
}
return SHRestrictionLookup(rest, NULL, s_PolicyTable, g_RestValues); return SHRestrictionLookup(rest, NULL, s_PolicyTable, g_RestValues);
} }