From fb45042e4dc9a3e2aa878c61c781ad403ed550a3 Mon Sep 17 00:00:00 2001
From: Mike McCormack <mike@codeweavers.com>
Date: Wed, 14 Sep 2005 15:42:27 +0000
Subject: [PATCH] Create a macro function to write registry values.

---
 dlls/msi/classes.c | 124 ++++++++++++++++-----------------------------
 1 file changed, 45 insertions(+), 79 deletions(-)

diff --git a/dlls/msi/classes.c b/dlls/msi/classes.c
index 1dc6a309b04..41f4071fbf8 100644
--- a/dlls/msi/classes.c
+++ b/dlls/msi/classes.c
@@ -743,26 +743,35 @@ static void mark_mime_for_install( MSIMIME *mime )
     mime->InstallMe = TRUE;
 }
 
+static LONG msi_reg_set_val_str( HKEY hkey, LPCWSTR name, LPCWSTR value )
+{
+    DWORD len = (lstrlenW(value) + 1) * sizeof (WCHAR);
+    return RegSetValueExW( hkey, name, 0, REG_SZ, (LPBYTE)value, len );
+}
+
+static LONG msi_reg_set_val_multi_str( HKEY hkey, LPCWSTR name, LPCWSTR value )
+{
+    LPCWSTR p = value;
+    while (*p) p += lstrlenW(p) + 1;
+    return RegSetValueExW( hkey, name, 0, REG_MULTI_SZ,
+                           (LPBYTE)value, (p + 1 - value) * sizeof(WCHAR) );
+}
+
 static UINT register_appid(MSIAPPID *appid, LPCWSTR app )
 {
     static const WCHAR szAppID[] = { 'A','p','p','I','D',0 };
     HKEY hkey2,hkey3;
-    UINT size; 
 
     RegCreateKeyW(HKEY_CLASSES_ROOT,szAppID,&hkey2);
     RegCreateKeyW( hkey2, appid->AppID, &hkey3 );
-    RegSetValueExW( hkey3, NULL, 0, REG_SZ,
-                    (LPBYTE)app, (strlenW(app)+1)*sizeof(WCHAR) );
+    msi_reg_set_val_str( hkey3, NULL, app );
 
     if (appid->RemoteServerName)
     {
         static const WCHAR szRemoteServerName[] =
              {'R','e','m','o','t','e','S','e','r','v','e','r','N','a','m','e',0};
 
-        size = (lstrlenW(appid->RemoteServerName)+1) * sizeof(WCHAR);
-
-        RegSetValueExW( hkey3, szRemoteServerName, 0, REG_SZ,
-                        (LPBYTE)appid->RemoteServerName, size);
+        msi_reg_set_val_str( hkey3, szRemoteServerName, appid->RemoteServerName );
     }
 
     if (appid->LocalServer)
@@ -770,10 +779,7 @@ static UINT register_appid(MSIAPPID *appid, LPCWSTR app )
         static const WCHAR szLocalService[] =
              {'L','o','c','a','l','S','e','r','v','i','c','e',0};
 
-        size = (lstrlenW(appid->LocalServer)+1) * sizeof(WCHAR);
-
-        RegSetValueExW( hkey3, szLocalService, 0, REG_SZ,
-                        (LPBYTE)appid->LocalServer, size );
+        msi_reg_set_val_str( hkey3, szLocalService, appid->LocalServer );
     }
 
     if (appid->ServiceParameters)
@@ -782,9 +788,7 @@ static UINT register_appid(MSIAPPID *appid, LPCWSTR app )
              {'S','e','r','v','i','c','e',
               'P','a','r','a','m','e','t','e','r','s',0};
 
-        size = (lstrlenW(appid->ServiceParameters)+1) * sizeof(WCHAR);
-        RegSetValueExW( hkey3, szService, 0, REG_SZ,
-                        (LPBYTE)appid->ServiceParameters, size );
+        msi_reg_set_val_str( hkey3, szService, appid->ServiceParameters );
     }
 
     if (appid->DllSurrogate)
@@ -792,9 +796,7 @@ static UINT register_appid(MSIAPPID *appid, LPCWSTR app )
         static const WCHAR szDLL[] =
              {'D','l','l','S','u','r','r','o','g','a','t','e',0};
 
-        size = (lstrlenW(appid->DllSurrogate)+1) * sizeof(WCHAR);
-        RegSetValueExW( hkey3, szDLL, 0, REG_SZ,
-                        (LPBYTE)appid->DllSurrogate, size );
+        msi_reg_set_val_str( hkey3, szDLL, appid->DllSurrogate );
     }
 
     if (appid->ActivateAtStorage)
@@ -804,8 +806,7 @@ static UINT register_appid(MSIAPPID *appid, LPCWSTR app )
               'S','t','o','r','a','g','e',0};
         static const WCHAR szY[] = {'Y',0};
 
-        RegSetValueExW( hkey3, szActivate, 0, REG_SZ,
-                        (LPBYTE)szY, sizeof szY );
+        msi_reg_set_val_str( hkey3, szActivate, szY );
     }
 
     if (appid->RunAsInteractiveUser)
@@ -815,8 +816,7 @@ static UINT register_appid(MSIAPPID *appid, LPCWSTR app )
              {'I','n','t','e','r','a','c','t','i','v','e',' ',
               'U','s','e','r',0};
 
-        RegSetValueExW( hkey3, szRunAs, 0, REG_SZ,
-                        (LPBYTE)szUser, sizeof szUser );
+        msi_reg_set_val_str( hkey3, szRunAs, szUser );
     }
 
     RegCloseKey(hkey3);
@@ -894,8 +894,7 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
         RegCreateKeyW( hkey, cls->clsid, &hkey2 );
 
         if (cls->Description)
-            RegSetValueExW( hkey2, NULL, 0, REG_SZ, (LPBYTE)cls->Description,
-                            (strlenW(cls->Description)+1)*sizeof(WCHAR));
+            msi_reg_set_val_str( hkey2, NULL, cls->Description );
 
         RegCreateKeyW( hkey2, cls->Context, &hkey3 );
         file = get_loaded_file( package, comp->KeyPath );
@@ -906,7 +905,6 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
          */
         if (strcmpiW( cls->Context, szInprocServer32 )!=0)
         {
-            sz = 0;
             sz = GetShortPathNameW( file->TargetPath, NULL, 0 );
             if (sz == 0)
             {
@@ -955,7 +953,7 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
 
         if (argument)
         {
-            RegSetValueExW(hkey3,NULL,0,REG_SZ, (LPBYTE)argument, size);
+            msi_reg_set_val_str( hkey3, NULL, argument );
             HeapFree(GetProcessHeap(),0,argument);
         }
 
@@ -971,16 +969,14 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
                 progid = cls->ProgIDText;
 
             RegCreateKeyW(hkey2,szProgID,&hkey3);
-            RegSetValueExW(hkey3,NULL,0,REG_SZ,(LPBYTE)progid,
-                            (strlenW(progid)+1) *sizeof(WCHAR));
+            msi_reg_set_val_str( hkey3, NULL, progid );
             RegCloseKey(hkey3);
 
             if (cls->ProgID && cls->ProgID->VersionInd)
             {
                 LPWSTR viprogid = strdupW( cls->ProgID->VersionInd->ProgID );
                 RegCreateKeyW(hkey2,szVIProgID,&hkey3);
-                RegSetValueExW(hkey3,NULL,0,REG_SZ,(LPBYTE)viprogid,
-                            (strlenW(viprogid)+1) *sizeof(WCHAR));
+                msi_reg_set_val_str( hkey3, NULL, viprogid );
                 RegCloseKey(hkey3);
                 HeapFree(GetProcessHeap(), 0, viprogid);
             }
@@ -990,8 +986,7 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
         { 
             MSIAPPID *appid = cls->AppID;
 
-            RegSetValueExW( hkey2, szAppID, 0, REG_SZ, (LPBYTE)appid->AppID,
-                           (lstrlenW(appid->AppID)+1)*sizeof(WCHAR) );
+            msi_reg_set_val_str( hkey2, szAppID, appid->AppID );
 
             register_appid( appid, cls->Description );
         }
@@ -1003,8 +998,7 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
 
             RegCreateKeyW(hkey2,szDefaultIcon,&hkey3);
 
-            RegSetValueExW( hkey3, NULL, 0, REG_SZ, (LPVOID)cls->IconPath,
-                           (strlenW(cls->IconPath)+1) * sizeof(WCHAR));
+            msi_reg_set_val_str( hkey3, NULL, cls->IconPath );
 
             RegCloseKey(hkey3);
         }
@@ -1014,23 +1008,19 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
             static const WCHAR szInproc[] =
                 {'I','n','p','r','o','c','H','a','n','d','l','e','r',0};
 
-            size = (strlenW(cls->DefInprocHandler) + 1) * sizeof(WCHAR);
             RegCreateKeyW(hkey2,szInproc,&hkey3);
-            RegSetValueExW(hkey3,NULL,0,REG_SZ, 
-                            (LPBYTE)cls->DefInprocHandler, size);
+            msi_reg_set_val_str( hkey3, NULL, cls->DefInprocHandler );
             RegCloseKey(hkey3);
         }
 
         if (cls->DefInprocHandler32)
         {
             static const WCHAR szInproc32[] =
-                {'I','n','p','r','o','c','H','a','n','d','l','e','r','3','2',
-                 0};
+                {'I','n','p','r','o','c','H','a','n','d','l','e','r','3','2',0};
             size = (strlenW(cls->DefInprocHandler32) + 1) * sizeof(WCHAR);
 
             RegCreateKeyW(hkey2,szInproc32,&hkey3);
-            RegSetValueExW(hkey3,NULL,0,REG_SZ, 
-                           (LPBYTE)cls->DefInprocHandler32,size);
+            msi_reg_set_val_str( hkey3, NULL, cls->DefInprocHandler32 );
             RegCloseKey(hkey3);
         }
         
@@ -1053,8 +1043,7 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
                 sprintfW( keyname, szFileType_fmt, cls->clsid, index );
 
                 RegCreateKeyW(HKEY_CLASSES_ROOT,keyname,&hkey2);
-                RegSetValueExW(hkey2,NULL,0,REG_SZ, (LPVOID)ptr,
-                        strlenW(ptr)*sizeof(WCHAR));
+                msi_reg_set_val_str( hkey2, NULL, ptr );
                 RegCloseKey(hkey2);
                 HeapFree(GetProcessHeap(), 0, keyname);
 
@@ -1089,18 +1078,12 @@ static UINT register_progid_base(MSIPACKAGE* package, MSIPROGID* progid,
     RegCreateKeyW(HKEY_CLASSES_ROOT,progid->ProgID,&hkey);
 
     if (progid->Description)
-    {
-        RegSetValueExW(hkey,NULL,0,REG_SZ,
-                        (LPVOID)progid->Description, 
-                        (strlenW(progid->Description)+1) *
-                       sizeof(WCHAR));
-    }
+        msi_reg_set_val_str( hkey, NULL, progid->Description );
 
     if (progid->Class)
     {   
         RegCreateKeyW(hkey,szCLSID,&hkey2);
-        RegSetValueExW( hkey2, NULL, 0, REG_SZ, (LPBYTE)progid->Class->clsid, 
-                        (strlenW(progid->Class->clsid)+1) * sizeof(WCHAR) );
+        msi_reg_set_val_str( hkey2, NULL, progid->Class->clsid );
 
         if (clsid)
             strcpyW( clsid, progid->Class->clsid );
@@ -1116,8 +1099,7 @@ static UINT register_progid_base(MSIPACKAGE* package, MSIPROGID* progid,
     {
         RegCreateKeyW(hkey,szDefaultIcon,&hkey2);
 
-        RegSetValueExW(hkey2,NULL,0,REG_SZ,(LPVOID)progid->IconPath,
-                           (strlenW(progid->IconPath)+1) * sizeof(WCHAR));
+        msi_reg_set_val_str( hkey2, NULL, progid->IconPath );
         RegCloseKey(hkey2);
     }
     return ERROR_SUCCESS;
@@ -1155,23 +1137,18 @@ static UINT register_progid(MSIPACKAGE *package, MSIPROGID* progid,
 
         /* clsid is same as parent */
         RegCreateKeyW(hkey,szCLSID,&hkey2);
-        RegSetValueExW(hkey2,NULL,0,REG_SZ,(LPVOID)clsid, (strlenW(clsid)+1) *
-                       sizeof(WCHAR));
+        msi_reg_set_val_str( hkey2, NULL, clsid );
 
         RegCloseKey(hkey2);
 
 
         if (progid->Description)
-        {
-            RegSetValueExW(hkey,NULL,0,REG_SZ,(LPVOID)progid->Description,
-                           (strlenW(progid->Description)+1) * sizeof(WCHAR));
-        }
+            msi_reg_set_val_str( hkey, NULL, progid->Description );
 
         if (progid->IconPath)
         {
             RegCreateKeyW(hkey,szDefaultIcon,&hkey2);
-            RegSetValueExW(hkey2,NULL,0,REG_SZ,(LPVOID)progid->IconPath,
-                           (strlenW(progid->IconPath)+1) * sizeof(WCHAR));
+            msi_reg_set_val_str( hkey2, NULL, progid->IconPath );
             RegCloseKey(hkey2);
         }
 
@@ -1179,8 +1156,7 @@ static UINT register_progid(MSIPACKAGE *package, MSIPROGID* progid,
         if (progid->CurVer)
         {
             RegCreateKeyW(hkey,szCurVer,&hkey2);
-            RegSetValueExW(hkey2,NULL,0,REG_SZ, (LPBYTE)progid->CurVer->ProgID,
-                (strlenW(progid->CurVer->ProgID)+1) * sizeof(WCHAR));
+            msi_reg_set_val_str( hkey2, NULL, progid->CurVer->ProgID );
             RegCloseKey(hkey2);
         }
 
@@ -1256,8 +1232,7 @@ static UINT register_verb(MSIPACKAGE *package, LPCWSTR progid,
      else
         sprintfW(command, fmt2, component->FullKeypath);
 
-     RegSetValueExW(key,NULL,0,REG_SZ, (LPVOID)command, (strlenW(command)+1)*
-                     sizeof(WCHAR));
+     msi_reg_set_val_str( key, NULL, command );
      HeapFree(GetProcessHeap(),0,command);
 
      advertise = create_component_advertise_string(package, component, 
@@ -1280,8 +1255,7 @@ static UINT register_verb(MSIPACKAGE *package, LPCWSTR progid,
          strcatW(command,verb->Argument);
      }
 
-     RegSetValueExW(key, szCommand, 0, REG_MULTI_SZ, (LPBYTE)command,
-                        (strlenW(command)+2)*sizeof(WCHAR));
+     msi_reg_set_val_multi_str( key, szCommand, command );
      
      RegCloseKey(key);
      HeapFree(GetProcessHeap(),0,keyname);
@@ -1292,8 +1266,7 @@ static UINT register_verb(MSIPACKAGE *package, LPCWSTR progid,
      {
         keyname = build_directory_name(3, progid, szShell, verb->Verb);
         RegCreateKeyW(HKEY_CLASSES_ROOT, keyname, &key);
-        RegSetValueExW(key,NULL,0,REG_SZ, (LPVOID)verb->Command,
-                                    (strlenW(verb->Command)+1) *sizeof(WCHAR));
+        msi_reg_set_val_str( key, NULL, verb->Command );
         RegCloseKey(key);
         HeapFree(GetProcessHeap(),0,keyname);
      }
@@ -1305,8 +1278,7 @@ static UINT register_verb(MSIPACKAGE *package, LPCWSTR progid,
             *Sequence = verb->Sequence;
             keyname = build_directory_name(2, progid, szShell);
             RegCreateKeyW(HKEY_CLASSES_ROOT, keyname, &key);
-            RegSetValueExW(key,NULL,0,REG_SZ, (LPVOID)verb->Verb,
-                            (strlenW(verb->Verb)+1) *sizeof(WCHAR));
+            msi_reg_set_val_str( key, NULL, verb->Verb );
             RegCloseKey(key);
             HeapFree(GetProcessHeap(),0,keyname);
         }
@@ -1378,11 +1350,7 @@ UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package)
         HeapFree( GetProcessHeap(), 0, extension );
 
         if (ext->Mime)
-        {
-            RegSetValueExW(hkey,szContentType,0,REG_SZ,
-                            (LPBYTE)ext->Mime->ContentType,
-                     (strlenW(ext->Mime->ContentType)+1)*sizeof(WCHAR));
-        }
+            msi_reg_set_val_str( hkey, szContentType, ext->Mime->ContentType );
 
         if (ext->ProgID || ext->ProgIDText)
         {
@@ -1399,8 +1367,7 @@ UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package)
             else
                 progid = ext->ProgIDText;
 
-            RegSetValueExW( hkey, NULL, 0, REG_SZ, (LPBYTE)progid,
-                           (strlenW(progid)+1)*sizeof(WCHAR));
+            msi_reg_set_val_str( hkey, NULL, progid );
 
             newkey = HeapAlloc(GetProcessHeap(),0,
                            (strlenW(progid)+strlenW(szSN)+1) * sizeof(WCHAR)); 
@@ -1481,8 +1448,7 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
                                             sizeof(WCHAR));
         sprintfW(key,fmt,mime);
         RegCreateKeyW(HKEY_CLASSES_ROOT,key,&hkey);
-        RegSetValueExW(hkey,szExten,0,REG_SZ,(LPBYTE)extension,
-                           (strlenW(extension)+1)*sizeof(WCHAR));
+        msi_reg_set_val_str( hkey, szExten, extension );
 
         HeapFree(GetProcessHeap(),0,extension);
         HeapFree(GetProcessHeap(),0,key);
-- 
GitLab