Jacek Caban : winex11: Directly use ntdll for registry access in read_registry_settings.

Alexandre Julliard julliard at winehq.org
Mon Apr 11 15:54:59 CDT 2022


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Apr  8 13:29:54 2022 +0200

winex11: Directly use ntdll for registry access in read_registry_settings.

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/winex11.drv/settings.c | 44 +++++++++++++++++++++++++-------------------
 1 file changed, 25 insertions(+), 19 deletions(-)

diff --git a/dlls/winex11.drv/settings.c b/dlls/winex11.drv/settings.c
index f4fb450375b..61bdf1afd0f 100644
--- a/dlls/winex11.drv/settings.c
+++ b/dlls/winex11.drv/settings.c
@@ -267,11 +267,25 @@ static HKEY get_display_device_reg_key( const WCHAR *device_name )
     return reg_open_key( NULL, buffer, lstrlenW(buffer) * sizeof(WCHAR) );
 }
 
+static BOOL query_display_setting( HKEY hkey, const char *name, DWORD *ret )
+{
+    char buffer[1024];
+    WCHAR nameW[128];
+    KEY_VALUE_PARTIAL_INFORMATION *value = (void *)buffer;
+
+    asciiz_to_unicode( nameW, name );
+    if (query_reg_value( hkey, nameW, value, sizeof(buffer) ) != sizeof(DWORD) ||
+        value->Type != REG_DWORD)
+        return FALSE;
+
+    *ret = *(DWORD *)value->Data;
+    return TRUE;
+}
+
 static BOOL read_registry_settings(const WCHAR *device_name, DEVMODEW *dm)
 {
     HANDLE mutex;
     HKEY hkey;
-    DWORD type, size;
     BOOL ret = TRUE;
 
     dm->dmFields = 0;
@@ -283,32 +297,24 @@ static BOOL read_registry_settings(const WCHAR *device_name, DEVMODEW *dm)
         return FALSE;
     }
 
-#define query_value(name, data) \
-    size = sizeof(DWORD); \
-    if (RegQueryValueExA(hkey, name, 0, &type, (LPBYTE)(data), &size) || \
-        type != REG_DWORD || size != sizeof(DWORD)) \
-        ret = FALSE
-
-    query_value("DefaultSettings.BitsPerPel", &dm->dmBitsPerPel);
+    ret &= query_display_setting( hkey, "DefaultSettings.BitsPerPel", &dm->dmBitsPerPel );
     dm->dmFields |= DM_BITSPERPEL;
-    query_value("DefaultSettings.XResolution", &dm->dmPelsWidth);
+    ret &= query_display_setting( hkey, "DefaultSettings.XResolution", &dm->dmPelsWidth );
     dm->dmFields |= DM_PELSWIDTH;
-    query_value("DefaultSettings.YResolution", &dm->dmPelsHeight);
+    ret &= query_display_setting( hkey, "DefaultSettings.YResolution", &dm->dmPelsHeight );
     dm->dmFields |= DM_PELSHEIGHT;
-    query_value("DefaultSettings.VRefresh", &dm->dmDisplayFrequency);
+    ret &= query_display_setting( hkey, "DefaultSettings.VRefresh", &dm->dmDisplayFrequency );
     dm->dmFields |= DM_DISPLAYFREQUENCY;
-    query_value("DefaultSettings.Flags", &dm->u2.dmDisplayFlags);
+    ret &= query_display_setting( hkey, "DefaultSettings.Flags", &dm->u2.dmDisplayFlags );
     dm->dmFields |= DM_DISPLAYFLAGS;
-    query_value("DefaultSettings.XPanning", &dm->u1.s2.dmPosition.x);
-    query_value("DefaultSettings.YPanning", &dm->u1.s2.dmPosition.y);
+    ret &= query_display_setting( hkey, "DefaultSettings.XPanning", (DWORD *)&dm->u1.s2.dmPosition.x );
+    ret &= query_display_setting( hkey, "DefaultSettings.YPanning", (DWORD *)&dm->u1.s2.dmPosition.y );
     dm->dmFields |= DM_POSITION;
-    query_value("DefaultSettings.Orientation", &dm->u1.s2.dmDisplayOrientation);
+    ret &= query_display_setting( hkey, "DefaultSettings.Orientation", &dm->u1.s2.dmDisplayOrientation );
     dm->dmFields |= DM_DISPLAYORIENTATION;
-    query_value("DefaultSettings.FixedOutput", &dm->u1.s2.dmDisplayFixedOutput);
+    ret &= query_display_setting( hkey, "DefaultSettings.FixedOutput", &dm->u1.s2.dmDisplayFixedOutput );
 
-#undef query_value
-
-    RegCloseKey(hkey);
+    NtClose( hkey );
     release_display_device_init_mutex(mutex);
     return ret;
 }




More information about the wine-cvs mailing list