Hugh McMaster : regedit: Export value names from a separate function.
Alexandre Julliard
julliard at winehq.org
Wed Jul 19 16:05:32 CDT 2017
Module: wine
Branch: master
Commit: 40ce665836caafd0e7afcc1bff89f514f7c71a8b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=40ce665836caafd0e7afcc1bff89f514f7c71a8b
Author: Hugh McMaster <hugh.mcmaster at outlook.com>
Date: Wed Jul 19 05:28:38 2017 +0000
regedit: Export value names from a separate function.
Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
programs/regedit/regproc.c | 92 ++++++++++++++++++++++++++++++++++++++--------
1 file changed, 77 insertions(+), 15 deletions(-)
diff --git a/programs/regedit/regproc.c b/programs/regedit/regproc.c
index b5bc3bf..8bdbcd2 100644
--- a/programs/regedit/regproc.c
+++ b/programs/regedit/regproc.c
@@ -1241,24 +1241,12 @@ static void REGPROC_write_line(FILE *file, const WCHAR* str, BOOL unicode)
* Is resized if necessary.
* val_size - size of the buffer for storing values in bytes.
*/
-static void export_hkey(FILE *file, WCHAR **val_name_buf, DWORD *val_name_size,
- DWORD value_type, BYTE **val_buf, DWORD *val_size,
+static void export_hkey(FILE *file, DWORD value_type, BYTE **val_buf, DWORD *val_size,
WCHAR **line_buf, DWORD *line_buf_size, BOOL unicode)
{
DWORD line_len = 0;
DWORD val_size1 = *val_size;
- if (*val_name_buf && (*val_name_buf)[0]) {
- const WCHAR val_start[] = {'"','%','s','"','=',0};
-
- REGPROC_export_string(line_buf, line_buf_size, &line_len, *val_name_buf, lstrlenW(*val_name_buf));
- line_len = sprintfW(*line_buf, val_start, *val_name_buf);
- } else {
- const WCHAR std_val[] = {'@','=',0};
- line_len = 2;
- lstrcpyW(*line_buf, std_val);
- }
-
switch (value_type) {
case REG_SZ:
{
@@ -1375,6 +1363,80 @@ void delete_registry_key(WCHAR *reg_key_name)
RegDeleteTreeW(key_class, key_name);
}
+static WCHAR *REGPROC_escape_string(WCHAR *str, size_t str_len, size_t *line_len)
+{
+ size_t i, escape_count, pos;
+ WCHAR *buf;
+
+ for (i = 0, escape_count = 0; i < str_len; i++)
+ {
+ WCHAR c = str[i];
+ if (c == '\r' || c == '\n' || c == '\\' || c == '"' || c == '\0')
+ escape_count++;
+ }
+
+ buf = resize_buffer(NULL, (str_len + escape_count + 1) * sizeof(WCHAR));
+
+ for (i = 0, pos = 0; i < str_len; i++, pos++)
+ {
+ WCHAR c = str[i];
+
+ switch (c)
+ {
+ case '\r':
+ buf[pos++] = '\\';
+ buf[pos] = 'r';
+ break;
+ case '\n':
+ buf[pos++] = '\\';
+ buf[pos] = 'n';
+ break;
+ case '\\':
+ buf[pos++] = '\\';
+ buf[pos] = '\\';
+ break;
+ case '"':
+ buf[pos++] = '\\';
+ buf[pos] = '"';
+ break;
+ case '\0':
+ buf[pos++] = '\\';
+ buf[pos] = '0';
+ break;
+ default:
+ buf[pos] = c;
+ }
+ }
+
+ buf[pos] = 0;
+ *line_len = pos;
+ return buf;
+}
+
+static size_t export_value_name(FILE *fp, WCHAR *name, size_t len, BOOL unicode)
+{
+ static const WCHAR quoted_fmt[] = {'"','%','s','"','=',0};
+ static const WCHAR default_name[] = {'@','=',0};
+ size_t line_len;
+
+ if (name && *name)
+ {
+ WCHAR *str = REGPROC_escape_string(name, len, &line_len);
+ WCHAR *buf = resize_buffer(NULL, (line_len + 4) * sizeof(WCHAR));
+ line_len = sprintfW(buf, quoted_fmt, str);
+ REGPROC_write_line(fp, buf, unicode);
+ HeapFree(GetProcessHeap(), 0, buf);
+ HeapFree(GetProcessHeap(), 0, str);
+ }
+ else
+ {
+ line_len = lstrlenW(default_name);
+ REGPROC_write_line(fp, default_name, unicode);
+ }
+
+ return line_len;
+}
+
static WCHAR *build_subkey_path(WCHAR *path, DWORD path_len, WCHAR *subkey_name, DWORD subkey_len)
{
WCHAR *subkey_path;
@@ -1428,8 +1490,8 @@ static int export_registry_data(FILE *fp, HKEY key, WCHAR *path, BOOL unicode)
rc = RegEnumValueW(key, i, value_name, &value_len, NULL, &type, data, &data_size);
if (rc == ERROR_SUCCESS)
{
- export_hkey(fp, &value_name, &value_len, type, &data, &data_size,
- &line_buf, &line_buf_size, unicode);
+ export_value_name(fp, value_name, value_len, unicode);
+ export_hkey(fp, type, &data, &data_size, &line_buf, &line_buf_size, unicode);
i++;
}
else if (rc == ERROR_MORE_DATA)
More information about the wine-cvs
mailing list