Alexander Nicolaysen Sørnes : regedit: Use RegSetValueExW when importing data.

Alexandre Julliard julliard at winehq.org
Thu Jul 10 08:58:49 CDT 2008


Module: wine
Branch: master
Commit: c23da6c35fb8f23acfa1eceeb3a3cba4f6d5f2a3
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c23da6c35fb8f23acfa1eceeb3a3cba4f6d5f2a3

Author: Alexander Nicolaysen Sørnes <alex at thehandofagony.com>
Date:   Wed Jul  9 20:02:02 2008 +0200

regedit: Use RegSetValueExW when importing data.

---

 programs/regedit/regproc.c |   31 ++++++++++++++++++-------------
 1 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/programs/regedit/regproc.c b/programs/regedit/regproc.c
index 7101e3a..f8f4eca 100644
--- a/programs/regedit/regproc.c
+++ b/programs/regedit/regproc.c
@@ -202,11 +202,11 @@ static DWORD getDataType(LPSTR *lpValue, DWORD* parse_type)
 /******************************************************************************
  * Replaces escape sequences with the characters.
  */
-static void REGPROC_unescape_string(LPSTR str)
+static void REGPROC_unescape_string(WCHAR* str)
 {
     int str_idx = 0;            /* current character under analysis */
     int val_idx = 0;            /* the last character of the unescaped string */
-    int len = strlen(str);
+    int len = lstrlenW(str);
     for (str_idx = 0; str_idx < len; str_idx++, val_idx++) {
         if (str[str_idx] == '\\') {
             str_idx++;
@@ -328,7 +328,7 @@ static HKEY  currentKeyHandle = NULL;
  * val_name - name of the registry value
  * val_data - registry value data
  */
-static LONG setValue(LPSTR val_name, LPSTR val_data)
+static LONG setValue(WCHAR* val_name, LPSTR val_data)
 {
     LONG res;
     DWORD  dwDataType, dwParseType;
@@ -340,7 +340,7 @@ static LONG setValue(LPSTR val_name, LPSTR val_data)
 
     if (strcmp(val_data, "-") == 0)
     {
-        res=RegDeleteValue(currentKeyHandle,val_name);
+        res=RegDeleteValueW(currentKeyHandle,val_name);
         return (res == ERROR_FILE_NOT_FOUND ? ERROR_SUCCESS : res);
     }
 
@@ -349,19 +349,21 @@ static LONG setValue(LPSTR val_name, LPSTR val_data)
 
     if (dwParseType == REG_SZ)          /* no conversion for string */
     {
-        REGPROC_unescape_string(val_data);
+        WCHAR* val_dataW = GetWideString(val_data, lstrlenA(val_data)+1);
+        REGPROC_unescape_string(val_dataW);
         /* Compute dwLen after REGPROC_unescape_string because it may
          * have changed the string length and we don't want to store
          * the extra garbage in the registry.
          */
-        dwLen = strlen(val_data);
-        if (dwLen>0 && val_data[dwLen-1]=='"')
+        dwLen = lstrlenW(val_dataW);
+        if (dwLen>0 && val_dataW[dwLen-1]=='"')
         {
             dwLen--;
-            val_data[dwLen]='\0';
+            val_dataW[dwLen]='\0';
         }
-        lpbData = (BYTE*) val_data;
+        lpbData = (BYTE*) val_dataW;
         dwLen++;  /* include terminating null */
+        dwLen = dwLen * sizeof(WCHAR); /* size is in bytes */
     }
     else if (dwParseType == REG_DWORD)  /* Convert the dword types */
     {
@@ -382,14 +384,14 @@ static LONG setValue(LPSTR val_name, LPSTR val_data)
         return ERROR_INVALID_DATA;
     }
 
-    res = RegSetValueEx(
+    res = RegSetValueExW(
                currentKeyHandle,
                val_name,
                0,                  /* Reserved */
                dwDataType,
                lpbData,
                dwLen);
-    if (dwParseType == REG_BINARY)
+    if (dwParseType == REG_BINARY || dwParseType == REG_SZ)
         HeapFree(GetProcessHeap(), 0, lpbData);
     return res;
 }
@@ -465,6 +467,7 @@ static void processSetValue(LPSTR line)
 {
     LPSTR val_name;                   /* registry value name   */
     LPSTR val_data;                   /* registry value data   */
+    WCHAR* val_nameW;
 
     int line_idx = 0;                 /* current character under analysis */
     LONG res;
@@ -504,8 +507,10 @@ static void processSetValue(LPSTR line)
     line_idx++;                   /* skip the '=' character */
     val_data = line + line_idx;
 
-    REGPROC_unescape_string(val_name);
-    res = setValue(val_name, val_data);
+    val_nameW = GetWideString(val_name, lstrlenA(val_name)+1);
+    REGPROC_unescape_string(val_nameW);
+    res = setValue(val_nameW, val_data);
+    HeapFree(GetProcessHeap(), 0, val_nameW);
     if ( res != ERROR_SUCCESS )
         fprintf(stderr,"%s: ERROR Key %s not created. Value: %s, Data: %s\n",
                 getAppName(),




More information about the wine-cvs mailing list