From ba14c5f390c4a02f60b7ee7fb5aa74aa8b065533 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Sat, 25 Oct 2025 16:52:05 +0300 Subject: [PATCH] [KERNEL32] Use wine case mapping instead of ntdll Previously tolowerW/toupperW was defined to towlower/towupper, which was imported from ntdll. These functions don't work correctly though. Instead use wine's case mapping table. The "unhacking" is done in k32.h, because the original hacks in wine/unicode.h are still needed in other places. Fixes 1 LCMApString test and prevents further regression when fixing iswctype in libcntpr. --- dll/win32/kernel32/k32.h | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/dll/win32/kernel32/k32.h b/dll/win32/kernel32/k32.h index 756a29b61b2..87b67964906 100644 --- a/dll/win32/kernel32/k32.h +++ b/dll/win32/kernel32/k32.h @@ -77,4 +77,19 @@ /* Virtual DOS Machines (VDM) Support Definitions */ #include "include/vdm.h" +/* Undo hacks in wine/unicode.h */ +#undef tolowerW +static inline WCHAR tolowerW( WCHAR ch ) +{ + extern WINE_UNICODE_API const WCHAR wine_casemap_lower[]; + return ch + wine_casemap_lower[wine_casemap_lower[ch >> 8] + (ch & 0xff)]; +} + +#undef toupperW +static inline WCHAR toupperW( WCHAR ch ) +{ + extern WINE_UNICODE_API const WCHAR wine_casemap_upper[]; + return ch + wine_casemap_upper[wine_casemap_upper[ch >> 8] + (ch & 0xff)]; +} + #endif /* __K32_H */