Module: wine Branch: master Commit: 5ed078dc14c7c40815c3f65a8718207d861d0320 URL: https://source.winehq.org/git/wine.git/?a=commit;h=5ed078dc14c7c40815c3f65a8...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Mar 21 11:51:13 2022 +0100
ntdll: Implement NtInitializeNlsFiles().
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/ntdll.spec | 2 ++ dlls/ntdll/unix/env.c | 63 +++++++++++++++++++++++++++++++++++------------- dlls/ntdll/unix/loader.c | 3 ++- include/winternl.h | 1 + 4 files changed, 51 insertions(+), 18 deletions(-)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index d514bca5e11..6d134770596 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -235,6 +235,7 @@ @ stdcall -syscall NtImpersonateAnonymousToken(long) # @ stub NtImpersonateClientOfPort # @ stub NtImpersonateThread +@ stdcall -syscall NtInitializeNlsFiles(ptr ptr ptr) # @ stub NtInitializeRegistry @ stdcall -syscall NtInitiatePowerAction (long long long long) @ stdcall -syscall NtIsProcessInJob(long long) @@ -1257,6 +1258,7 @@ @ stdcall -private -syscall ZwImpersonateAnonymousToken(long) NtImpersonateAnonymousToken # @ stub ZwImpersonateClientOfPort # @ stub ZwImpersonateThread +@ stdcall -private -syscall ZwInitializeNlsFiles(ptr ptr ptr) NtInitializeNlsFiles # @ stub ZwInitializeRegistry @ stdcall -private -syscall ZwInitiatePowerAction(long long long long) NtInitiatePowerAction @ stdcall -private -syscall ZwIsProcessInJob(long long) NtIsProcessInJob diff --git a/dlls/ntdll/unix/env.c b/dlls/ntdll/unix/env.c index 227bcdbfa0f..2302ee46e86 100644 --- a/dlls/ntdll/unix/env.c +++ b/dlls/ntdll/unix/env.c @@ -153,22 +153,15 @@ static void *read_nls_file( ULONG type, ULONG id ) return ret; }
-static NTSTATUS open_nls_data_file( ULONG type, ULONG id, HANDLE *file ) +static NTSTATUS open_nls_data_file( const char *path, const WCHAR *sysdir, HANDLE *file ) { - static const WCHAR sortdirW[] = {'\','?','?','\','C',':','\','w','i','n','d','o','w','s','\', - 'g','l','o','b','a','l','i','z','a','t','i','o','n','\', - 's','o','r','t','i','n','g','\',0}; - NTSTATUS status = STATUS_OBJECT_NAME_NOT_FOUND; OBJECT_ATTRIBUTES attr; UNICODE_STRING valueW; - WCHAR buffer[ARRAY_SIZE(sortdirW) + 16]; - char *p, *path = get_nls_file_path( type, id ); - - if (!path) return STATUS_OBJECT_NAME_NOT_FOUND; + WCHAR buffer[64]; + char *p, *ntpath;
- /* try to open file in system dir */ - wcscpy( buffer, type == NLS_SECTION_SORTKEYS ? sortdirW : system_dir ); + wcscpy( buffer, system_dir ); p = strrchr( path, '/' ) + 1; ascii_to_unicode( buffer + wcslen(buffer), p, strlen(p) + 1 ); init_unicode_string( &valueW, buffer ); @@ -176,13 +169,12 @@ static NTSTATUS open_nls_data_file( ULONG type, ULONG id, HANDLE *file )
status = open_unix_file( file, path, GENERIC_READ, &attr, 0, FILE_SHARE_READ, FILE_OPEN, FILE_SYNCHRONOUS_IO_ALERT, NULL, 0 ); - free( path ); if (status != STATUS_NO_SUCH_FILE) return status;
- if ((status = nt_to_unix_file_name( &attr, &path, FILE_OPEN ))) return status; - status = open_unix_file( file, path, GENERIC_READ, &attr, 0, FILE_SHARE_READ, + if ((status = nt_to_unix_file_name( &attr, &ntpath, FILE_OPEN ))) return status; + status = open_unix_file( file, ntpath, GENERIC_READ, &attr, 0, FILE_SHARE_READ, FILE_OPEN, FILE_SYNCHRONOUS_IO_ALERT, NULL, 0 ); - free( path ); + free( ntpath ); return status; }
@@ -2438,6 +2430,9 @@ void *create_startup_info( const UNICODE_STRING *nt_image, const RTL_USER_PROCES */ NTSTATUS WINAPI NtGetNlsSectionPtr( ULONG type, ULONG id, void *unknown, void **ptr, SIZE_T *size ) { + static const WCHAR sortdirW[] = {'\','?','?','\','C',':','\','w','i','n','d','o','w','s','\', + 'g','l','o','b','a','l','i','z','a','t','i','o','n','\', + 's','o','r','t','i','n','g','\',0}; UNICODE_STRING nameW; OBJECT_ATTRIBUTES attr; WCHAR name[32]; @@ -2450,7 +2445,12 @@ NTSTATUS WINAPI NtGetNlsSectionPtr( ULONG type, ULONG id, void *unknown, void ** InitializeObjectAttributes( &attr, &nameW, 0, 0, NULL ); if ((status = NtOpenSection( &handle, SECTION_MAP_READ, &attr ))) { - if ((status = open_nls_data_file( type, id, &file ))) return status; + char *path = get_nls_file_path( type, id ); + + if (!path) return STATUS_OBJECT_NAME_NOT_FOUND; + status = open_nls_data_file( path, type == NLS_SECTION_SORTKEYS ? sortdirW : system_dir, &file ); + free( path ); + if (status) return status; attr.Attributes = OBJ_OPENIF | OBJ_PERMANENT; status = NtCreateSection( &handle, SECTION_MAP_READ, &attr, NULL, PAGE_READONLY, SEC_COMMIT, file ); NtClose( file ); @@ -2461,8 +2461,37 @@ NTSTATUS WINAPI NtGetNlsSectionPtr( ULONG type, ULONG id, void *unknown, void ** status = map_section( handle, ptr, size, PAGE_READONLY ); NtClose( handle ); } + return status; +} + + +/************************************************************************** + * NtInitializeNlsFiles (NTDLL.@) + */ +NTSTATUS WINAPI NtInitializeNlsFiles( void **ptr, LCID *lcid, LARGE_INTEGER *size ) +{ + const char *dir = build_dir ? build_dir : data_dir; + char *path; + HANDLE handle, file; + SIZE_T mapsize; + NTSTATUS status; + + if (!(path = malloc( strlen(dir) + sizeof("/nls/locale.nls") ))) return STATUS_NO_MEMORY; + strcpy( path, dir ); + strcat( path, "/nls/locale.nls" ); + status = open_nls_data_file( path, system_dir, &file ); + free( path ); + if (!status) + { + status = NtCreateSection( &handle, SECTION_MAP_READ, NULL, NULL, PAGE_READONLY, SEC_COMMIT, file ); + NtClose( file ); + } + if (!status) + { + status = map_section( handle, ptr, &mapsize, PAGE_READONLY ); + NtClose( handle ); } - NtClose( handle ); + *lcid = system_lcid; return status; }
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c index 97fb624d6d2..d1c42ddc0f3 100644 --- a/dlls/ntdll/unix/loader.c +++ b/dlls/ntdll/unix/loader.c @@ -196,7 +196,8 @@ static void * const syscalls[] = NtGetNlsSectionPtr, NtGetWriteWatch, NtImpersonateAnonymousToken, - NtInitiatePowerAction , + NtInitializeNlsFiles, + NtInitiatePowerAction, NtIsProcessInJob, NtListenPort, NtLoadDriver, diff --git a/include/winternl.h b/include/winternl.h index 4c49f5eae47..68c174d6086 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -3995,6 +3995,7 @@ NTSYSAPI NTSTATUS WINAPI NtGetWriteWatch(HANDLE,ULONG,PVOID,SIZE_T,PVOID*,ULONG NTSYSAPI NTSTATUS WINAPI NtImpersonateAnonymousToken(HANDLE); NTSYSAPI NTSTATUS WINAPI NtImpersonateClientOfPort(HANDLE,PPORT_MESSAGE); NTSYSAPI NTSTATUS WINAPI NtImpersonateThread(HANDLE,HANDLE,PSECURITY_QUALITY_OF_SERVICE); +NTSYSAPI NTSTATUS WINAPI NtInitializeNlsFiles(void**,LCID*,LARGE_INTEGER*); NTSYSAPI NTSTATUS WINAPI NtInitializeRegistry(BOOLEAN); NTSYSAPI NTSTATUS WINAPI NtInitiatePowerAction(POWER_ACTION,SYSTEM_POWER_STATE,ULONG,BOOLEAN); NTSYSAPI NTSTATUS WINAPI NtIsProcessInJob(HANDLE,HANDLE);