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