Jacek Caban : gdi32: Directly use ntdll in update_external_font_keys.

Alexandre Julliard julliard at winehq.org
Mon Sep 27 15:21:45 CDT 2021


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Sep 27 13:05:15 2021 +0200

gdi32: Directly use ntdll in update_external_font_keys.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/gdi32/font.c | 65 ++++++++++++++++++++++++++++++-------------------------
 1 file changed, 36 insertions(+), 29 deletions(-)

diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 9132c9b6849..9d2cd37e642 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -91,6 +91,8 @@ static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} };
 
 static const WCHAR nt_prefixW[] = {'\\','?','?','\\'};
 
+static const WCHAR true_type_suffixW[] = {' ','(','T','r','u','e','T','y','p','e',')',0};
+
 static const WCHAR system_link_keyW[] =
 {
     '\\','R','e','g','i','s','t','r','y',
@@ -5984,40 +5986,45 @@ static void update_external_font_keys(void)
     struct gdi_font_family *family;
     struct external_key *key, *next;
     struct gdi_font_face *face;
-    DWORD len, i = 0, type, dlen, vlen;
-    WCHAR value[LF_FULLFACESIZE + 12], path[MAX_PATH + 4], *tmp;
+    DWORD len, i = 0;
+    WCHAR value[LF_FULLFACESIZE + 12], *tmp, *path;
+    char buffer[2048];
+    KEY_VALUE_FULL_INFORMATION *info = (KEY_VALUE_FULL_INFORMATION *)buffer;
     WCHAR *file;
     HKEY hkey;
 
-    RegCreateKeyExW( HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows NT\\CurrentVersion\\Fonts",
-                     0, NULL, 0, KEY_ALL_ACCESS, NULL, &winnt_key, NULL );
-    RegCreateKeyExW( HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion\\Fonts",
-                     0, NULL, 0, KEY_ALL_ACCESS, NULL, &win9x_key, NULL );
+    static const WCHAR external_fontsW[] = {'E','x','t','e','r','n','a','l',' ','F','o','n','t','s'};
+
+    winnt_key = reg_create_key( NULL, fonts_winnt_config_keyW, sizeof(fonts_winnt_config_keyW), 0, NULL );
+    win9x_key = reg_create_key( NULL, fonts_win9x_config_keyW, sizeof(fonts_win9x_config_keyW), 0, NULL );
 
     /* enumerate the fonts and add external ones to the two keys */
 
-    if (RegCreateKeyW( wine_fonts_key, L"External Fonts", &hkey )) return;
+    if (!(hkey = reg_create_key( wine_fonts_key, external_fontsW, sizeof(external_fontsW), 0, NULL )))
+        return;
 
-    memcpy( path, nt_prefixW, sizeof(nt_prefixW) );
-    vlen = ARRAY_SIZE(value);
-    dlen = sizeof(path) - sizeof(nt_prefixW);
-    while (!RegEnumValueW( hkey, i++, value, &vlen, NULL, &type, (BYTE *)path + sizeof(nt_prefixW), &dlen ))
+    while (reg_enum_value( hkey, i++, info, sizeof(buffer) - sizeof(nt_prefixW),
+                           value, LF_FULLFACESIZE * sizeof(WCHAR) ))
     {
-        if (type != REG_SZ) goto next;
-        if ((tmp = wcsrchr( value, ' ' )) && !facename_compare( tmp, L" (TrueType)", -1 )) *tmp = 0;
-        if ((face = find_face_from_full_name( value )) &&
-            !wcsicmp( face->file, path[5] == ':' ? path : path + ARRAYSIZE(nt_prefixW) ))
+        if (info->Type != REG_SZ) continue;
+
+        path = (WCHAR *)(buffer + info->DataOffset);
+        if (path[0] && path[1] == ':')
+        {
+            memmove( path, path + ARRAYSIZE(nt_prefixW), sizeof(nt_prefixW) );
+            memcpy( path, nt_prefixW, sizeof(nt_prefixW) );
+        }
+
+        if ((tmp = wcsrchr( value, ' ' )) && !facename_compare( tmp, true_type_suffixW, -1 )) *tmp = 0;
+        if ((face = find_face_from_full_name( value )) && !wcsicmp( face->file, path ))
         {
             face->flags |= ADDFONT_EXTERNAL_FOUND;
-            goto next;
+            continue;
         }
         if (tmp && !*tmp) *tmp = ' ';
         if (!(key = HeapAlloc( GetProcessHeap(), 0, sizeof(*key) ))) break;
         lstrcpyW( key->value, value );
         list_add_tail( &external_keys, &key->entry );
-    next:
-        vlen = ARRAY_SIZE(value);
-        dlen = sizeof(path) - sizeof(nt_prefixW);
     }
 
     WINE_RB_FOR_EACH_ENTRY( family, &family_name_tree, struct gdi_font_family, name_entry )
@@ -6028,7 +6035,7 @@ static void update_external_font_keys(void)
             if ((face->flags & ADDFONT_EXTERNAL_FOUND)) continue;
 
             lstrcpyW( value, face->full_name );
-            if (face->scalable) lstrcatW( value, L" (TrueType)" );
+            if (face->scalable) lstrcatW( value, true_type_suffixW );
 
             if (face->file[0] == '\\')
             {
@@ -6041,22 +6048,22 @@ static void update_external_font_keys(void)
                 file = face->file;
 
             len = (lstrlenW(file) + 1) * sizeof(WCHAR);
-            RegSetValueExW( winnt_key, value, 0, REG_SZ, (BYTE *)file, len );
-            RegSetValueExW( win9x_key, value, 0, REG_SZ, (BYTE *)file, len );
-            RegSetValueExW( hkey, value, 0, REG_SZ, (BYTE *)file, len );
+            set_reg_value( winnt_key, value, REG_SZ, file, len );
+            set_reg_value( win9x_key, value, REG_SZ, file, len );
+            set_reg_value( hkey, value, REG_SZ, file, len );
         }
     }
     LIST_FOR_EACH_ENTRY_SAFE( key, next, &external_keys, struct external_key, entry )
     {
-        RegDeleteValueW( win9x_key, key->value );
-        RegDeleteValueW( winnt_key, key->value );
-        RegDeleteValueW( hkey, key->value );
+        reg_delete_value( win9x_key, key->value );
+        reg_delete_value( winnt_key, key->value );
+        reg_delete_value( hkey, key->value );
         list_remove( &key->entry );
         HeapFree( GetProcessHeap(), 0, key );
     }
-    RegCloseKey( win9x_key );
-    RegCloseKey( winnt_key );
-    RegCloseKey( hkey );
+    NtClose( win9x_key );
+    NtClose( winnt_key );
+    NtClose( hkey );
 }
 
 static void load_registry_fonts(void)




More information about the wine-cvs mailing list