Jacek Caban : gdi32: Directly use ntdll in load_face_from_cache.

Alexandre Julliard julliard at winehq.org
Thu Sep 23 15:35:05 CDT 2021


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Sep 23 13:44:06 2021 +0100

gdi32: Directly use ntdll in load_face_from_cache.

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 | 27 +++++++++++++--------------
 1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index b78e5947f5e..a8de47a2b59 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -1136,19 +1136,21 @@ struct cached_face
 static void load_face_from_cache( HKEY hkey_family, struct gdi_font_family *family,
                                   void *buffer, DWORD buffer_size, BOOL scalable )
 {
-    DWORD type, size, needed, index = 0;
+    KEY_VALUE_FULL_INFORMATION *info = (KEY_VALUE_FULL_INFORMATION *)buffer;
+    KEY_NODE_INFORMATION *node_info = (KEY_NODE_INFORMATION *)buffer;
+    DWORD index = 0, total_size;
     struct gdi_font_face *face;
     HKEY hkey_strike;
     WCHAR name[256];
-    struct cached_face *cached = (struct cached_face *)buffer;
+    struct cached_face *cached;
 
-    size = sizeof(name);
-    needed = buffer_size - sizeof(DWORD);
-    while (!RegEnumValueW( hkey_family, index++, name, &size, NULL, &type, buffer, &needed ))
+    while (reg_enum_value( hkey_family, index++, info,
+                           buffer_size - sizeof(DWORD), name, sizeof(name) ))
     {
-        if (type == REG_BINARY && needed > sizeof(*cached))
+        cached = (struct cached_face *)((char *)info + info->DataOffset);
+        if (info->Type == REG_BINARY && info->DataLength > sizeof(*cached))
         {
-            ((DWORD *)buffer)[needed / sizeof(DWORD)] = 0;
+            ((DWORD *)cached)[info->DataLength / sizeof(DWORD)] = 0;
             if ((face = create_face( family, name, cached->full_name,
                                      cached->full_name + lstrlenW(cached->full_name) + 1,
                                      NULL, 0, cached->index, cached->fs, cached->ntmflags, cached->version,
@@ -1167,22 +1169,19 @@ static void load_face_from_cache( HKEY hkey_family, struct gdi_font_family *fami
                 release_face( face );
             }
         }
-        size = sizeof(name);
-        needed = buffer_size - sizeof(DWORD);
     }
 
     /* load bitmap strikes */
 
     index = 0;
-    needed = buffer_size;
-    while (!RegEnumKeyExW( hkey_family, index++, buffer, &needed, NULL, NULL, NULL, NULL ))
+    while (!NtEnumerateKey( hkey_family, index++, KeyNodeInformation, node_info,
+                            buffer_size, &total_size ))
     {
-        if (!RegOpenKeyExW( hkey_family, buffer, 0, KEY_ALL_ACCESS, &hkey_strike ))
+        if ((hkey_strike = reg_open_key( hkey_family, node_info->Name, node_info->NameLength )))
         {
             load_face_from_cache( hkey_strike, family, buffer, buffer_size, FALSE );
-            RegCloseKey( hkey_strike );
+            NtClose( hkey_strike );
         }
-        needed = buffer_size;
     }
 }
 




More information about the wine-cvs mailing list