[2/5] msi: Ignore the value if a registry value name is special.

Hans Leidekker hans at codeweavers.com
Tue Jun 5 06:43:17 CDT 2012


---
 dlls/msi/action.c |   43 +++++++++++++++++++------------------------
 1 files changed, 19 insertions(+), 24 deletions(-)

diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index 17e8696..3629a3e 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -2390,13 +2390,17 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package)
     return MSI_SetFeatureStates(package);
 }
 
-/* OK this value is "interpreted" and then formatted based on the 
-   first few characters */
-static LPSTR parse_value(MSIPACKAGE *package, LPCWSTR value, DWORD *type, 
-                         DWORD *size)
+static LPSTR parse_value(MSIPACKAGE *package, LPCWSTR value, DWORD *type, DWORD *size)
 {
     LPSTR data = NULL;
 
+    if (!value)
+    {
+        data = (LPSTR)strdupW(szEmpty);
+        *size = sizeof(szEmpty);
+        *type = REG_SZ;
+        return data;
+    }
     if (value[0]=='#' && value[1]!='#' && value[1]!='%')
     {
         if (value[1]=='x')
@@ -2578,19 +2582,19 @@ static WCHAR *get_keypath( MSICOMPONENT *comp, HKEY root, const WCHAR *path )
     return strdupW( path );
 }
 
-static BOOL is_special_entry( const WCHAR *name, const WCHAR *value )
+static BOOL is_special_entry( const WCHAR *name )
 {
-     return (name && (name[0] == '*' || name[0] == '+') && !name[1] && !value);
+     return (name && (name[0] == '*' || name[0] == '+') && !name[1]);
 }
 
 static UINT ITERATE_WriteRegistryValues(MSIRECORD *row, LPVOID param)
 {
     MSIPACKAGE *package = param;
-    LPSTR value_data = NULL;
+    LPSTR value;
     HKEY  root_key, hkey;
     DWORD type,size;
     LPWSTR deformated, uikey, keypath;
-    LPCWSTR szRoot, component, name, key, value;
+    LPCWSTR szRoot, component, name, key;
     MSICOMPONENT *comp;
     MSIRECORD * uirow;
     INT   root;
@@ -2643,25 +2647,16 @@ static UINT ITERATE_WriteRegistryValues(MSIRECORD *row, LPVOID param)
         msi_free(keypath);
         return ERROR_SUCCESS;
     }
-
-    value = MSI_RecordGetString(row,5);
-    if (value)
-        value_data = parse_value(package, value, &type, &size); 
-    else
-    {
-        value_data = (LPSTR)strdupW(szEmpty);
-        size = sizeof(szEmpty);
-        type = REG_SZ;
-    }
-
+    value = parse_value(package, MSI_RecordGetString(row, 5), &type, &size); 
     deformat_string(package, name, &deformated);
-    if (!is_special_entry( name , value ))
+
+    if (!is_special_entry( name ))
     {
         if (!check_first)
         {
             TRACE("Setting value %s of %s\n", debugstr_w(deformated),
                   debugstr_w(uikey));
-            RegSetValueExW(hkey, deformated, 0, type, (LPBYTE)value_data, size);
+            RegSetValueExW(hkey, deformated, 0, type, (LPBYTE)value, size);
         }
         else
         {
@@ -2677,7 +2672,7 @@ static UINT ITERATE_WriteRegistryValues(MSIRECORD *row, LPVOID param)
                 TRACE("Checked and setting value %s of %s\n", debugstr_w(deformated),
                       debugstr_w(uikey));
                 if (deformated || size)
-                    RegSetValueExW(hkey, deformated, 0, type, (LPBYTE)value_data, size);
+                    RegSetValueExW(hkey, deformated, 0, type, (LPBYTE)value, size);
             }
         }
     }
@@ -2687,11 +2682,11 @@ static UINT ITERATE_WriteRegistryValues(MSIRECORD *row, LPVOID param)
     MSI_RecordSetStringW(uirow,2,deformated);
     MSI_RecordSetStringW(uirow,1,uikey);
     if (type == REG_SZ || type == REG_EXPAND_SZ)
-        MSI_RecordSetStringW(uirow,3,(LPWSTR)value_data);
+        MSI_RecordSetStringW(uirow, 3, (LPWSTR)value);
     msi_ui_actiondata( package, szWriteRegistryValues, uirow );
     msiobj_release( &uirow->hdr );
 
-    msi_free(value_data);
+    msi_free(value);
     msi_free(deformated);
     msi_free(uikey);
     msi_free(keypath);
-- 
1.7.5.4







More information about the wine-patches mailing list