Alexandre Julliard : ntdll: Support the sortkey file in NtGetNlsSectionPtr().

Alexandre Julliard julliard at winehq.org
Tue Mar 17 17:21:09 CDT 2020


Module: wine
Branch: master
Commit: b408b07eae99ad94e3f12ee77d96090f94513fa0
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=b408b07eae99ad94e3f12ee77d96090f94513fa0

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Mar 17 11:27:14 2020 +0100

ntdll: Support the sortkey file in NtGetNlsSectionPtr().

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntdll/locale.c | 45 +++++++++++++++++++++++++++++++--------------
 1 file changed, 31 insertions(+), 14 deletions(-)

diff --git a/dlls/ntdll/locale.c b/dlls/ntdll/locale.c
index 8334de172d..afd65f3c02 100644
--- a/dlls/ntdll/locale.c
+++ b/dlls/ntdll/locale.c
@@ -67,6 +67,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(nls);
 
 enum nls_section_type
 {
+    NLS_SECTION_SORTKEYS = 9,
     NLS_SECTION_CASEMAP = 10,
     NLS_SECTION_CODEPAGE = 11,
     NLS_SECTION_NORMALIZE = 12
@@ -548,6 +549,9 @@ static NTSTATUS open_nls_data_file( ULONG type, ULONG id, HANDLE *file )
     {'\\','R','e','g','i','s','t','r','y','\\','M','a','c','h','i','n','e','\\','S','y','s','t','e','m','\\',
      'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
      'C','o','n','t','r','o','l','\\','N','l','s','\\','%','s',0};
+    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};
     static const WCHAR cpW[] = {'C','o','d','e','p','a','g','e',0};
     static const WCHAR normW[] = {'N','o','r','m','a','l','i','z','a','t','i','o','n',0};
     static const WCHAR langW[] = {'L','a','n','g','u','a','g','e',0};
@@ -564,21 +568,26 @@ static NTSTATUS open_nls_data_file( ULONG type, ULONG id, HANDLE *file )
     static const WCHAR normnfkcW[] = {'n','o','r','m','n','f','k','c','.','n','l','s',0};
     static const WCHAR normnfkdW[] = {'n','o','r','m','n','f','k','d','.','n','l','s',0};
     static const WCHAR normidnaW[] = {'n','o','r','m','i','d','n','a','.','n','l','s',0};
+    static const WCHAR sortkeysW[] = {'s','o','r','t','d','e','f','a','u','l','t','.','n','l','s',0};
 
     DWORD size;
     HANDLE handle;
-    NTSTATUS status;
+    NTSTATUS status = STATUS_OBJECT_NAME_NOT_FOUND;
     IO_STATUS_BLOCK io;
     OBJECT_ATTRIBUTES attr;
     UNICODE_STRING nameW, valueW;
     WCHAR buffer[MAX_PATH], value[10];
-    const WCHAR *name = NULL;
+    const WCHAR *name = NULL, *dir = system_dir;
     KEY_VALUE_PARTIAL_INFORMATION *info;
 
     /* get filename from registry */
 
     switch (type)
     {
+    case NLS_SECTION_SORTKEYS:
+        if (id) return STATUS_INVALID_PARAMETER_1;
+        buffer[0] = 0;
+        break;
     case NLS_SECTION_CASEMAP:
         if (id) return STATUS_UNSUCCESSFUL;
         sprintfW( buffer, keyfmtW, langW );
@@ -595,25 +604,33 @@ static NTSTATUS open_nls_data_file( ULONG type, ULONG id, HANDLE *file )
     default:
         return STATUS_INVALID_PARAMETER_1;
     }
-    RtlInitUnicodeString( &nameW, buffer );
-    RtlInitUnicodeString( &valueW, value );
-    InitializeObjectAttributes( &attr, &nameW, 0, 0, NULL );
-    if (!(status = NtOpenKey( &handle, KEY_READ, &attr )))
+
+    if (buffer[0])
     {
-        info = (KEY_VALUE_PARTIAL_INFORMATION *)buffer;
-        size = sizeof(buffer) - sizeof(WCHAR);
-        if (!(status = NtQueryValueKey( handle, &valueW, KeyValuePartialInformation, info, size, &size )))
+        RtlInitUnicodeString( &nameW, buffer );
+        RtlInitUnicodeString( &valueW, value );
+        InitializeObjectAttributes( &attr, &nameW, 0, 0, NULL );
+        if (!(status = NtOpenKey( &handle, KEY_READ, &attr )))
         {
-            ((WCHAR *)info->Data)[info->DataLength / sizeof(WCHAR)] = 0;
-            name = (WCHAR *)info->Data;
+            info = (KEY_VALUE_PARTIAL_INFORMATION *)buffer;
+            size = sizeof(buffer) - sizeof(WCHAR);
+            if (!(status = NtQueryValueKey( handle, &valueW, KeyValuePartialInformation, info, size, &size )))
+            {
+                ((WCHAR *)info->Data)[info->DataLength / sizeof(WCHAR)] = 0;
+                name = (WCHAR *)info->Data;
+            }
+            NtClose( handle );
         }
-        NtClose( handle );
     }
 
     if (!name || !*name)  /* otherwise some hardcoded defaults */
     {
         switch (type)
         {
+        case NLS_SECTION_SORTKEYS:
+            name = sortkeysW;
+            dir = sortdirW;
+            break;
         case NLS_SECTION_CASEMAP:
             name = intlW;
             break;
@@ -637,10 +654,10 @@ static NTSTATUS open_nls_data_file( ULONG type, ULONG id, HANDLE *file )
 
     /* try to open file in system dir */
 
-    valueW.MaximumLength = (strlenW(name) + strlenW(system_dir) + 5) * sizeof(WCHAR);
+    valueW.MaximumLength = (strlenW(name) + strlenW(dir) + 5) * sizeof(WCHAR);
     if (!(valueW.Buffer = RtlAllocateHeap( GetProcessHeap(), 0, valueW.MaximumLength )))
         return STATUS_NO_MEMORY;
-    valueW.Length = sprintfW( valueW.Buffer, pathfmtW, system_dir, name ) * sizeof(WCHAR);
+    valueW.Length = sprintfW( valueW.Buffer, pathfmtW, dir, name ) * sizeof(WCHAR);
     InitializeObjectAttributes( &attr, &valueW, 0, 0, NULL );
     status = NtOpenFile( file, GENERIC_READ, &attr, &io, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_ALERT );
     if (!status) TRACE( "found %s\n", debugstr_w( valueW.Buffer ));




More information about the wine-cvs mailing list