Jacek Caban : winemac: Directly use ntdll for registry access in create_original_display_mode_descriptor.

Alexandre Julliard julliard at winehq.org
Tue May 17 15:37:22 CDT 2022


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Sun May 15 20:27:37 2022 +0200

winemac: Directly use ntdll for registry access in create_original_display_mode_descriptor.

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

---

 dlls/winemac.drv/display.c | 31 ++++++++++++++++---------------
 1 file changed, 16 insertions(+), 15 deletions(-)

diff --git a/dlls/winemac.drv/display.c b/dlls/winemac.drv/display.c
index dc294df65ff..c6b54c5fd82 100644
--- a/dlls/winemac.drv/display.c
+++ b/dlls/winemac.drv/display.c
@@ -349,9 +349,13 @@ fail:
 
 static BOOL read_dword(HKEY hkey, const char* name, DWORD* val)
 {
-    DWORD type, size = sizeof(*val);
-    if (RegQueryValueExA(hkey, name, 0, &type, (BYTE*)val, &size) || type != REG_DWORD || size != sizeof(*val))
+    char buffer[offsetof(KEY_VALUE_PARTIAL_INFORMATION, Data[sizeof(*val)])];
+    KEY_VALUE_PARTIAL_INFORMATION *value = (void *)buffer;
+    WCHAR nameW[64];
+    asciiz_to_unicode(nameW, name);
+    if (query_reg_value(hkey, nameW, value, sizeof(buffer)) != sizeof(*val) || value->Type != REG_DWORD)
         return FALSE;
+    *val = *(DWORD *)value->Data;
     return TRUE;
 }
 
@@ -369,20 +373,22 @@ static void free_display_mode_descriptor(struct display_mode_descriptor* desc)
 
 static struct display_mode_descriptor* create_original_display_mode_descriptor(CGDirectDisplayID displayID)
 {
-    static const char display_key_format[] = "Software\\Wine\\Mac Driver\\Initial Display Mode\\Display 0x%08x";
+    static const char display_key_format[] =
+        "\\Registry\\Machine\\Software\\Wine\\Mac Driver\\Initial Display Mode\\Display 0x%08x";
     struct display_mode_descriptor* ret = NULL;
     struct display_mode_descriptor* desc;
     char display_key[sizeof(display_key_format) + 10];
+    WCHAR nameW[ARRAYSIZE(display_key)];
+    char buffer[4096];
+    KEY_VALUE_PARTIAL_INFORMATION *value = (void *)buffer;
     HKEY hkey;
-    DWORD type, size;
     DWORD refresh100;
-    WCHAR* pixel_encoding = NULL;
 
     init_original_display_mode();
 
     snprintf(display_key, sizeof(display_key), display_key_format, CGDisplayUnitNumber(displayID));
     /* @@ Wine registry key: HKLM\Software\Wine\Mac Driver\Initial Display Mode\Display 0xnnnnnnnn */
-    if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, display_key, 0, KEY_READ, &hkey))
+    if (!(hkey = reg_open_key(NULL, nameW, asciiz_to_unicode(nameW, display_key))))
         return NULL;
 
     desc = HeapAlloc(GetProcessHeap(), 0, sizeof(*desc));
@@ -405,22 +411,17 @@ static struct display_mode_descriptor* create_original_display_mode_descriptor(C
         desc->pixel_height = desc->height;
     }
 
-    size = 0;
-    if (RegQueryValueExW(hkey, pixelencodingW, 0, &type, NULL, &size) || type != REG_SZ)
+    if (!query_reg_value(hkey, pixelencodingW, value, sizeof(buffer)) || value->Type != REG_SZ)
         goto done;
-    size += sizeof(WCHAR);
-    pixel_encoding = HeapAlloc(GetProcessHeap(), 0, size);
-    if (RegQueryValueExW(hkey, pixelencodingW, 0, &type, (BYTE*)pixel_encoding, &size) || type != REG_SZ)
-        goto done;
-    desc->pixel_encoding = CFStringCreateWithCharacters(NULL, (const UniChar*)pixel_encoding, strlenW(pixel_encoding));
+    desc->pixel_encoding = CFStringCreateWithCharacters(NULL, (const UniChar*)value->Data,
+                                                        lstrlenW((const WCHAR *)value->Data));
 
     ret = desc;
 
 done:
     if (!ret)
         free_display_mode_descriptor(desc);
-    HeapFree(GetProcessHeap(), 0, pixel_encoding);
-    RegCloseKey(hkey);
+    NtClose(hkey);
     return ret;
 }
 




More information about the wine-cvs mailing list