Module: wine Branch: master Commit: 4a8716cf5b4a434d72638425038eff0f589f3871 URL: http://source.winehq.org/git/wine.git/?a=commit;h=4a8716cf5b4a434d7263842503...
Author: Alexandre Julliard julliard@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 ) );