Alexandre Julliard : user32: Check the length of the loaded registry key for system parameters.

Alexandre Julliard julliard at winehq.org
Thu Nov 15 15:26:31 CST 2012


Module: wine
Branch: master
Commit: 4a8716cf5b4a434d72638425038eff0f589f3871
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4a8716cf5b4a434d72638425038eff0f589f3871

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Nov 15 16:18:16 2012 +0100

user32: Check the length of the loaded registry key for system parameters.

---

 dlls/user32/sysparams.c |  125 ++++++++++++++++-------------------------------
 1 files changed, 43 insertions(+), 82 deletions(-)

diff --git a/dlls/user32/sysparams.c b/dlls/user32/sysparams.c
index 465ab8f..45e23c7 100644
--- a/dlls/user32/sysparams.c
+++ b/dlls/user32/sysparams.c
@@ -601,32 +601,6 @@ static void SYSPARAMS_NotifyChange( UINT uiAction, UINT fWinIni )
 
 
 /***********************************************************************
- * Loads system parameter from user profile.
- */
-static BOOL SYSPARAMS_Load( LPCWSTR lpRegKey, LPCWSTR lpValName, void *lpBuf, DWORD count )
-{
-    BOOL ret = FALSE;
-    DWORD type;
-    HKEY hKey;
-
-    memset( lpBuf, 0, count );
-
-    if (RegOpenKeyW( get_volatile_regkey(), lpRegKey, &hKey ) == ERROR_SUCCESS)
-    {
-        ret = !RegQueryValueExW( hKey, lpValName, NULL, &type, lpBuf, &count );
-        RegCloseKey( hKey );
-    }
-
-    if (!ret && RegOpenKeyW( HKEY_CURRENT_USER, lpRegKey, &hKey ) == ERROR_SUCCESS)
-    {
-        ret = !RegQueryValueExW( hKey, lpValName, NULL, &type, lpBuf, &count );
-        RegCloseKey( hKey );
-    }
-
-    return ret;
-}
-
-/***********************************************************************
  * Saves system parameter to user profile.
  */
 
@@ -676,11 +650,27 @@ static BOOL SYSPARAMS_Save( LPCWSTR lpRegKey, LPCWSTR lpValName, LPCWSTR lpValue
 }
 
 /* load a value to a registry entry */
-static BOOL load_entry( struct sysparam_entry *entry, void *data, DWORD size )
+static DWORD load_entry( struct sysparam_entry *entry, void *data, DWORD size )
 {
-    BOOL ret = SYSPARAMS_Load( entry->regkey, entry->regval, data, size );
+    DWORD type, count = 0;
+    HKEY key;
+
+    if (!RegOpenKeyW( get_volatile_regkey(), entry->regkey, &key ))
+    {
+        count = size;
+        if (RegQueryValueExW( key, entry->regval, NULL, &type, data, &count )) count = 0;
+        RegCloseKey( key );
+    }
+    if (!count && !RegOpenKeyW( HKEY_CURRENT_USER, entry->regkey, &key ))
+    {
+        count = size;
+        if (RegQueryValueExW( key, entry->regval, NULL, &type, data, &count )) count = 0;
+        RegCloseKey( key );
+    }
+    /* make sure strings are null-terminated */
+    if (size && count == size && type == REG_SZ) ((WCHAR *)data)[count - 1] = 0;
     entry->loaded = TRUE;
-    return ret;
+    return count;
 }
 
 /* save a value to a registry entry */
@@ -792,53 +782,6 @@ void SYSPARAMS_Init(void)
 }
 
 
-/***********************************************************************
- *              reg_get_logfont
- *
- *  Tries to retrieve logfont info from the specified key and value
- */
-static BOOL reg_get_logfont(LPCWSTR key, LPCWSTR value, LOGFONTW *lf)
-{
-    HKEY hkey;
-    LOGFONTW lfbuf;
-    DWORD type, size;
-    BOOL found = FALSE;
-    HKEY base_keys[2];
-    int i;
-
-    base_keys[0] = get_volatile_regkey();
-    base_keys[1] = HKEY_CURRENT_USER;
-
-    for(i = 0; i < 2 && !found; i++)
-    {
-        if(RegOpenKeyW(base_keys[i], key, &hkey) == ERROR_SUCCESS)
-        {
-            size = sizeof(lfbuf);
-            if(RegQueryValueExW(hkey, value, NULL, &type, (LPBYTE)&lfbuf, &size) == ERROR_SUCCESS &&
-                    type == REG_BINARY)
-            {
-                if( size == sizeof(lfbuf))
-                {
-                    found = TRUE;
-                    memcpy(lf, &lfbuf, size);
-                } else if( size == sizeof( LOGFONT16))
-                {    /* win9x-winME format */
-                    found = TRUE;
-                    SYSPARAMS_LogFont16To32W( (LOGFONT16*) &lfbuf, lf);
-                } else
-                    WARN("Unknown format in key %s value %s, size is %d\n",
-                            debugstr_w( key), debugstr_w( value), size);
-            }
-            RegCloseKey(hkey);
-        }
-    }
-    if( found && lf->lfHeight > 0) { 
-        /* positive height value means points ( inch/72 ) */
-        lf->lfHeight = -MulDiv( lf->lfHeight, get_display_dpi(), 72);
-    }
-    return found;
-}
-
 /* adjust some of the raw values found in the registry */
 static void normalize_nonclientmetrics( NONCLIENTMETRICSW *pncm)
 {
@@ -997,8 +940,7 @@ static BOOL get_dword_entry( union sysparam_all_entry *entry, UINT int_param, vo
     if (!entry->hdr.loaded)
     {
         DWORD val;
-
-        if (load_entry( &entry->hdr, &val, sizeof(val) )) entry->dword.val = val;
+        if (load_entry( &entry->hdr, &val, sizeof(val) ) == sizeof(DWORD)) entry->dword.val = val;
     }
     *(DWORD *)ptr_param = entry->bool.val;
     return TRUE;
@@ -1024,13 +966,28 @@ static BOOL get_font_entry( union sysparam_all_entry *entry, UINT int_param, voi
     {
         LOGFONTW font;
 
-        if (!reg_get_logfont( entry->hdr.regkey, entry->hdr.regval, &font ))
+        switch (load_entry( &entry->hdr, &font, sizeof(font) ))
         {
-            /* use the default GUI font */
+        case sizeof(font):
+            entry->font.val = font;
+            if (font.lfHeight > 0) /* positive height value means points ( inch/72 ) */
+                font.lfHeight = -MulDiv( font.lfHeight, get_display_dpi(), 72 );
+            break;
+        case sizeof(LOGFONT16): /* win9x-winME format */
+            SYSPARAMS_LogFont16To32W( (LOGFONT16 *)&font, &entry->font.val );
+            if (entry->font.val.lfHeight > 0)
+                entry->font.val.lfHeight = -MulDiv( entry->font.val.lfHeight, get_display_dpi(), 72 );
+            break;
+        default:
+            WARN( "Unknown format in key %s value %s\n",
+                  debugstr_w(entry->hdr.regkey), debugstr_w(entry->hdr.regval));
+            /* fall through */
+        case 0: /* use the default GUI font */
             GetObjectW( GetStockObject( DEFAULT_GUI_FONT ), sizeof(font), &font );
             font.lfWeight = entry->font.weight;
+            entry->font.val = font;
+            break;
         }
-        entry->font.val = font;
         entry->hdr.loaded = TRUE;
     }
     *(LOGFONTW *)ptr_param = entry->font.val;
@@ -1096,9 +1053,13 @@ static BOOL get_binary_entry( union sysparam_all_entry *entry, UINT int_param, v
     if (!entry->hdr.loaded)
     {
         void *buffer = HeapAlloc( GetProcessHeap(), 0, entry->bin.size );
+        DWORD len = load_entry( &entry->hdr, buffer, entry->bin.size );
 
-        if (load_entry( &entry->hdr, buffer, entry->bin.size ))
+        if (len)
+        {
             memcpy( entry->bin.ptr, buffer, entry->bin.size );
+            memset( (char *)entry->bin.ptr + len, 0, entry->bin.size - len );
+        }
         HeapFree( GetProcessHeap(), 0, buffer );
     }
     memcpy( ptr_param, entry->bin.ptr, min( int_param, entry->bin.size ) );




More information about the wine-cvs mailing list