msi: Fix handling of the NULL separator when writing registry values.
diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index 5b940c6..2efcbbb 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -2240,6 +2240,7 @@
                          DWORD *size)
 {
     LPSTR data = NULL;
+
     if (value[0]=='#' && value[1]!='#' && value[1]!='%')
     {
         if (value[1]=='x')
@@ -2321,6 +2322,7 @@
     {
         static const WCHAR szMulti[] = {'[','~',']',0};
         LPCWSTR ptr;
+        LPWSTR newdata;
         *type=REG_SZ;
 
         if (value[0]=='#')
@@ -2339,7 +2341,29 @@
         if (strstrW(value,szMulti))
             *type = REG_MULTI_SZ;
 
+        /* remove initial delimiter */
+        if (!strncmpW(value, szMulti, 3))
+            ptr = value + 3;
+
         *size = deformat_string(package, ptr,(LPWSTR*)&data);
+
+        /* add double NULL terminator */
+        if (*type == REG_MULTI_SZ)
+        {
+            *size += sizeof(WCHAR);
+            newdata = msi_alloc(*size);
+            if (!newdata)
+            {
+                msi_free(data);
+                return NULL;
+            }
+
+            memcpy(newdata, data, *size - 1);
+            newdata[*size] = '\0';
+
+            msi_free(data);
+            data = (LPSTR)newdata;
+        }
     }
     return data;
 }