Module: wine Branch: master Commit: 9bbb66fdf72a4090e38da46bda0eff0a6ab642ac URL: https://source.winehq.org/git/wine.git/?a=commit;h=9bbb66fdf72a4090e38da46bd...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Mar 26 11:26:13 2020 +0100
ntdll: Use the NLS case mapping table for RtlHashUnicodeString().
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/locale.c | 34 ++++++++++++++++++++++++++++++++++ dlls/ntdll/rtlstr.c | 25 ------------------------- dlls/ntdll/tests/rtlstr.c | 20 ++++++++++++-------- 3 files changed, 46 insertions(+), 33 deletions(-)
diff --git a/dlls/ntdll/locale.c b/dlls/ntdll/locale.c index afd65f3c02..1be3086a1e 100644 --- a/dlls/ntdll/locale.c +++ b/dlls/ntdll/locale.c @@ -1288,6 +1288,40 @@ BOOLEAN WINAPI RtlPrefixUnicodeString( const UNICODE_STRING *s1, const UNICODE_S }
+ +/****************************************************************************** + * RtlHashUnicodeString (NTDLL.@) + */ +NTSTATUS WINAPI RtlHashUnicodeString( const UNICODE_STRING *string, BOOLEAN case_insensitive, + ULONG alg, ULONG *hash ) +{ + unsigned int i; + + if (!string || !hash) return STATUS_INVALID_PARAMETER; + + switch (alg) + { + case HASH_STRING_ALGORITHM_DEFAULT: + case HASH_STRING_ALGORITHM_X65599: + break; + default: + return STATUS_INVALID_PARAMETER; + } + + *hash = 0; + if (!case_insensitive) + for (i = 0; i < string->Length / sizeof(WCHAR); i++) + *hash = *hash * 65599 + string->Buffer[i]; + else if (nls_info.UpperCaseTable) + for (i = 0; i < string->Length / sizeof(WCHAR); i++) + *hash = *hash * 65599 + casemap( nls_info.UpperCaseTable, string->Buffer[i] ); + else /* locale not setup yet */ + for (i = 0; i < string->Length / sizeof(WCHAR); i++) + *hash = *hash * 65599 + casemap_ascii( string->Buffer[i] ); + return STATUS_SUCCESS; +} + + /************************************************************************** * RtlCustomCPToUnicodeN (NTDLL.@) */ diff --git a/dlls/ntdll/rtlstr.c b/dlls/ntdll/rtlstr.c index c0d8ec6477..6f2a2e85c2 100644 --- a/dlls/ntdll/rtlstr.c +++ b/dlls/ntdll/rtlstr.c @@ -1708,28 +1708,3 @@ NTSTATUS WINAPI RtlStringFromGUID(const GUID* guid, UNICODE_STRING *str)
return STATUS_SUCCESS; } - -/****************************************************************************** - * RtlHashUnicodeString [NTDLL.@] - */ -NTSTATUS WINAPI RtlHashUnicodeString(PCUNICODE_STRING string, BOOLEAN case_insensitive, ULONG alg, ULONG *hash) -{ - unsigned int i; - - if (!string || !hash) return STATUS_INVALID_PARAMETER; - - switch (alg) - { - case HASH_STRING_ALGORITHM_DEFAULT: - case HASH_STRING_ALGORITHM_X65599: - break; - default: - return STATUS_INVALID_PARAMETER; - } - - *hash = 0; - for (i = 0; i < string->Length/sizeof(WCHAR); i++) - *hash = *hash*65599 + (case_insensitive ? toupperW(string->Buffer[i]) : string->Buffer[i]); - - return STATUS_SUCCESS; -} diff --git a/dlls/ntdll/tests/rtlstr.c b/dlls/ntdll/tests/rtlstr.c index f872422954..cd95ec3a48 100644 --- a/dlls/ntdll/tests/rtlstr.c +++ b/dlls/ntdll/tests/rtlstr.c @@ -1942,14 +1942,18 @@ struct hash_unicodestring_test { };
static const struct hash_unicodestring_test hash_test[] = { - { {'T',0}, FALSE, 0x00000054 }, - { {'T','e','s','t',0}, FALSE, 0x766bb952 }, - { {'T','e','S','t',0}, FALSE, 0x764bb172 }, - { {'t','e','s','t',0}, FALSE, 0x4745d132 }, - { {'t','e','s','t',0}, TRUE, 0x6689c132 }, - { {'T','E','S','T',0}, TRUE, 0x6689c132 }, - { {'T','E','S','T',0}, FALSE, 0x6689c132 }, - { {'a','b','c','d','e','f',0}, FALSE, 0x971318c3 }, + { L"T", FALSE, 0x00000054 }, + { L"Test", FALSE, 0x766bb952 }, + { L"TeSt", FALSE, 0x764bb172 }, + { L"test", FALSE, 0x4745d132 }, + { L"test", TRUE, 0x6689c132 }, + { L"TEST", TRUE, 0x6689c132 }, + { L"TEST", FALSE, 0x6689c132 }, + { L"t\xe9st", FALSE, 0x8845cfb6 }, + { L"t\xe9st", TRUE, 0xa789bfb6 }, + { L"T\xc9ST", TRUE, 0xa789bfb6 }, + { L"T\xc9ST", FALSE, 0xa789bfb6 }, + { L"abcdef", FALSE, 0x971318c3 }, { { 0 } } };