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