regedit: Fix importing REG_MULTI_SZ values for ANSI files.
This commit is contained in:
parent
3a2dfbd4e4
commit
484421560b
|
@ -83,6 +83,26 @@ WCHAR* GetWideString(const char* strA)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Allocates memory and convers input from multibyte to wide chars
|
||||||
|
* Returned string must be freed by the caller
|
||||||
|
*/
|
||||||
|
WCHAR* GetWideStringN(const char* strA, int chars, DWORD *len)
|
||||||
|
{
|
||||||
|
if(strA)
|
||||||
|
{
|
||||||
|
WCHAR* strW = NULL;
|
||||||
|
*len = MultiByteToWideChar(CP_ACP, 0, strA, chars, NULL, 0);
|
||||||
|
|
||||||
|
strW = HeapAlloc(GetProcessHeap(), 0, *len * sizeof(WCHAR));
|
||||||
|
CHECK_ENOUGH_MEMORY(strW);
|
||||||
|
MultiByteToWideChar(CP_ACP, 0, strA, chars, strW, *len);
|
||||||
|
return strW;
|
||||||
|
}
|
||||||
|
*len = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* Allocates memory and convers input from wide chars to multibyte
|
* Allocates memory and convers input from wide chars to multibyte
|
||||||
* Returned string must be freed by the caller
|
* Returned string must be freed by the caller
|
||||||
|
@ -322,7 +342,7 @@ static HKEY currentKeyHandle = NULL;
|
||||||
* val_name - name of the registry value
|
* val_name - name of the registry value
|
||||||
* val_data - registry value data
|
* val_data - registry value data
|
||||||
*/
|
*/
|
||||||
static LONG setValue(WCHAR* val_name, WCHAR* val_data)
|
static LONG setValue(WCHAR* val_name, WCHAR* val_data, BOOL is_unicode)
|
||||||
{
|
{
|
||||||
LONG res;
|
LONG res;
|
||||||
DWORD dwDataType, dwParseType;
|
DWORD dwDataType, dwParseType;
|
||||||
|
@ -371,6 +391,14 @@ static LONG setValue(WCHAR* val_name, WCHAR* val_data)
|
||||||
lpbData = convertHexCSVToHex(val_data, &dwLen);
|
lpbData = convertHexCSVToHex(val_data, &dwLen);
|
||||||
if (!lpbData)
|
if (!lpbData)
|
||||||
return ERROR_INVALID_DATA;
|
return ERROR_INVALID_DATA;
|
||||||
|
|
||||||
|
if(dwDataType == REG_MULTI_SZ && !is_unicode)
|
||||||
|
{
|
||||||
|
LPBYTE tmp = lpbData;
|
||||||
|
lpbData = (LPBYTE)GetWideStringN((char*)lpbData, dwLen, &dwLen);
|
||||||
|
dwLen *= sizeof(WCHAR);
|
||||||
|
HeapFree(GetProcessHeap(), 0, tmp);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else /* unknown format */
|
else /* unknown format */
|
||||||
{
|
{
|
||||||
|
@ -451,7 +479,7 @@ static void closeKey(void)
|
||||||
* line - registry file unwrapped line. Should have the registry value name and
|
* line - registry file unwrapped line. Should have the registry value name and
|
||||||
* complete registry value data.
|
* complete registry value data.
|
||||||
*/
|
*/
|
||||||
static void processSetValue(WCHAR* line)
|
static void processSetValue(WCHAR* line, BOOL is_unicode)
|
||||||
{
|
{
|
||||||
WCHAR* val_name; /* registry value name */
|
WCHAR* val_name; /* registry value name */
|
||||||
WCHAR* val_data; /* registry value data */
|
WCHAR* val_data; /* registry value data */
|
||||||
|
@ -499,7 +527,7 @@ static void processSetValue(WCHAR* line)
|
||||||
val_data = line + line_idx;
|
val_data = line + line_idx;
|
||||||
|
|
||||||
REGPROC_unescape_string(val_name);
|
REGPROC_unescape_string(val_name);
|
||||||
res = setValue(val_name, val_data);
|
res = setValue(val_name, val_data, is_unicode);
|
||||||
if ( res != ERROR_SUCCESS )
|
if ( res != ERROR_SUCCESS )
|
||||||
{
|
{
|
||||||
char* val_nameA = GetMultiByteString(val_name);
|
char* val_nameA = GetMultiByteString(val_name);
|
||||||
|
@ -517,8 +545,9 @@ static void processSetValue(WCHAR* line)
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* This function receives the currently read entry and performs the
|
* This function receives the currently read entry and performs the
|
||||||
* corresponding action.
|
* corresponding action.
|
||||||
|
* isUnicode affects parsing of REG_MULTI_SZ values
|
||||||
*/
|
*/
|
||||||
static void processRegEntry(WCHAR* stdInput)
|
static void processRegEntry(WCHAR* stdInput, BOOL isUnicode)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* We encountered the end of the file, make sure we
|
* We encountered the end of the file, make sure we
|
||||||
|
@ -553,7 +582,7 @@ static void processRegEntry(WCHAR* stdInput)
|
||||||
(( stdInput[0] == '@') || /* reading a default @=data pair */
|
(( stdInput[0] == '@') || /* reading a default @=data pair */
|
||||||
( stdInput[0] == '\"'))) /* reading a new value=data pair */
|
( stdInput[0] == '\"'))) /* reading a new value=data pair */
|
||||||
{
|
{
|
||||||
processSetValue(stdInput);
|
processSetValue(stdInput, isUnicode);
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
/* Since we are assuming that the file format is valid we must be
|
/* Since we are assuming that the file format is valid we must be
|
||||||
|
@ -677,10 +706,10 @@ void processRegLinesA(FILE *in)
|
||||||
break; /* That is the full virtual line */
|
break; /* That is the full virtual line */
|
||||||
}
|
}
|
||||||
|
|
||||||
processRegEntry(lineW);
|
processRegEntry(lineW, FALSE);
|
||||||
HeapFree(GetProcessHeap(), 0, lineW);
|
HeapFree(GetProcessHeap(), 0, lineW);
|
||||||
}
|
}
|
||||||
processRegEntry(NULL);
|
processRegEntry(NULL, FALSE);
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(), 0, line);
|
HeapFree(GetProcessHeap(), 0, line);
|
||||||
}
|
}
|
||||||
|
@ -786,14 +815,14 @@ void processRegLinesW(FILE *in)
|
||||||
if(!s_eol)
|
if(!s_eol)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
processRegEntry(s);
|
processRegEntry(s, TRUE);
|
||||||
s = s_eol + 1;
|
s = s_eol + 1;
|
||||||
s_eol = 0;
|
s_eol = 0;
|
||||||
continue; /* That is the full virtual line */
|
continue; /* That is the full virtual line */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
processRegEntry(NULL);
|
processRegEntry(NULL, TRUE);
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(), 0, buf);
|
HeapFree(GetProcessHeap(), 0, buf);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue