Alexandre Julliard : kernel32/tests: Add tests for NtInitializeNlsFiles() and RtlGetLocaleFileMappingAddress().
Alexandre Julliard
julliard at winehq.org
Mon Mar 21 17:20:25 CDT 2022
Module: wine
Branch: master
Commit: e195a9b0c398c12f87a5bf645fdbe94f68666ca0
URL: https://source.winehq.org/git/wine.git/?a=commit;h=e195a9b0c398c12f87a5bf645fdbe94f68666ca0
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Mar 21 11:53:24 2022 +0100
kernel32/tests: Add tests for NtInitializeNlsFiles() and RtlGetLocaleFileMappingAddress().
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernel32/tests/locale.c | 54 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 54 insertions(+)
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index ee9aad33312..ad644cf5a3e 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -94,6 +94,8 @@ static DWORD (WINAPI *pIsValidNLSVersion)(NLS_FUNCTION,LPCWSTR,NLSVERSIONINFOEX*
static NTSTATUS (WINAPI *pRtlNormalizeString)(ULONG, LPCWSTR, INT, LPWSTR, INT*);
static NTSTATUS (WINAPI *pRtlIsNormalizedString)(ULONG, LPCWSTR, INT, BOOLEAN*);
static NTSTATUS (WINAPI *pNtGetNlsSectionPtr)(ULONG,ULONG,void*,void**,SIZE_T*);
+static NTSTATUS (WINAPI *pNtInitializeNlsFiles)(void**,LCID*,LARGE_INTEGER*);
+static NTSTATUS (WINAPI *pRtlGetLocaleFileMappingAddress)(void**,LCID*,LARGE_INTEGER*);
static void (WINAPI *pRtlInitCodePageTable)(USHORT*,CPTABLEINFO*);
static NTSTATUS (WINAPI *pRtlCustomCPToUnicodeN)(CPTABLEINFO*,WCHAR*,DWORD,DWORD*,const char*,DWORD);
static NTSTATUS (WINAPI *pRtlGetSystemPreferredUILanguages)(DWORD,ULONG,ULONG*,WCHAR*,ULONG*);
@@ -146,8 +148,10 @@ static void InitFunctionPointers(void)
X(RtlNormalizeString);
X(RtlIsNormalizedString);
X(NtGetNlsSectionPtr);
+ X(NtInitializeNlsFiles);
X(RtlInitCodePageTable);
X(RtlCustomCPToUnicodeN);
+ X(RtlGetLocaleFileMappingAddress);
X(RtlGetSystemPreferredUILanguages);
X(RtlGetThreadPreferredUILanguages);
X(RtlGetUserPreferredUILanguages);
@@ -6804,6 +6808,55 @@ static void test_NLSVersion(void)
else win_skip( "IsValidNLSVersion not available\n" );
}
+static void test_locale_nls(void)
+{
+ NTSTATUS status;
+ void *addr, *addr2;
+ UINT *ptr;
+ LCID lcid;
+ LARGE_INTEGER size;
+
+ if (!pNtInitializeNlsFiles || !pRtlGetLocaleFileMappingAddress)
+ {
+ win_skip( "locale.nls functions not supported\n" );
+ return;
+ }
+ size.QuadPart = 0xdeadbeef;
+ status = pNtInitializeNlsFiles( &addr, &lcid, &size );
+ ok( !status, "NtInitializeNlsFiles failed %lx\n", status );
+ trace( "locale %04lx size %I64x\n", lcid, size.QuadPart );
+ ptr = addr;
+ ok( size.QuadPart == 0xdeadbeef || size.QuadPart == ptr[4] || size.QuadPart == ptr[4] + 8,
+ "wrong offset %x / %I64x\n", ptr[4], size.QuadPart );
+ ptr = (UINT *)((char *)addr + ptr[4]);
+ ok( ptr[0] == 8, "wrong offset %u\n", ptr[0] );
+ ok( ptr[3] == 0x5344534e, "wrong magic %x\n", ptr[3] );
+
+ status = pNtInitializeNlsFiles( &addr2, &lcid, &size );
+ ok( !status, "NtInitializeNlsFiles failed %lx\n", status );
+ ok( addr != addr2, "got same address %p\n", addr );
+ ok( !memcmp( addr, addr2, ptr[4] ), "contents differ\n" );
+ status = NtUnmapViewOfSection( GetCurrentProcess(), addr );
+ ok( !status, "NtUnmapViewOfSection failed %lx\n", status );
+ status = NtUnmapViewOfSection( GetCurrentProcess(), addr2 );
+ ok( !status, "NtUnmapViewOfSection failed %lx\n", status );
+
+ size.QuadPart = 0xdeadbeef;
+ status = pRtlGetLocaleFileMappingAddress( &addr, &lcid, &size );
+ ok( !status, "NtInitializeNlsFiles failed %lx\n", status );
+ ptr = addr;
+ ok( size.QuadPart == 0xdeadbeef || size.QuadPart == ptr[4] || size.QuadPart == ptr[4] + 8,
+ "wrong offset %x / %I64x\n", ptr[4], size.QuadPart );
+ ptr = (UINT *)((char *)addr + ptr[4]);
+ ok( ptr[0] == 8, "wrong offset %u\n", ptr[0] );
+ ok( ptr[3] == 0x5344534e, "wrong magic %x\n", ptr[3] );
+
+ /* RtlGetLocaleFileMappingAddress caches the pointer */
+ status = pRtlGetLocaleFileMappingAddress( &addr2, &lcid, &size );
+ ok( !status, "NtInitializeNlsFiles failed %lx\n", status );
+ ok( addr == addr2, "got different address %p / %p\n", addr, addr2 );
+}
+
static void test_geo_name(void)
{
WCHAR reg_name[32], buf[32], set_name[32], nation[32], region[32];
@@ -7192,6 +7245,7 @@ START_TEST(locale)
test_NormalizeString();
test_SpecialCasing();
test_NLSVersion();
+ test_locale_nls();
test_geo_name();
test_sorting();
test_EnumCalendarInfoA();
More information about the wine-cvs
mailing list