regedit: Use a helper function to export hex data and REG_DWORD data.

Signed-off-by: Hugh McMaster <hugh.mcmaster@outlook.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Hugh McMaster 2017-07-19 05:28:56 +00:00 committed by Alexandre Julliard
parent bb147fbaa7
commit 6515837ada
1 changed files with 87 additions and 22 deletions

View File

@ -1246,11 +1246,7 @@ static void export_hkey(FILE *file, DWORD value_type, BYTE **val_buf, DWORD *val
{ {
DWORD line_len = 0; DWORD line_len = 0;
DWORD val_size1 = *val_size; DWORD val_size1 = *val_size;
WCHAR *wstr = (WCHAR *)*val_buf;
switch (value_type) {
case REG_SZ:
{
WCHAR* wstr = (WCHAR*)*val_buf;
if (val_size1 < sizeof(WCHAR) || val_size1 % sizeof(WCHAR) || if (val_size1 < sizeof(WCHAR) || val_size1 % sizeof(WCHAR) ||
wstr[val_size1 / sizeof(WCHAR) - 1]) { wstr[val_size1 / sizeof(WCHAR) - 1]) {
@ -1270,15 +1266,6 @@ static void export_hkey(FILE *file, DWORD value_type, BYTE **val_buf, DWORD *val
REGPROC_resize_char_buffer(line_buf, line_buf_size, line_len + lstrlenW(end)); REGPROC_resize_char_buffer(line_buf, line_buf_size, line_len + lstrlenW(end));
lstrcpyW(*line_buf + line_len, end); lstrcpyW(*line_buf + line_len, end);
} }
break;
}
case REG_NONE:
case REG_EXPAND_SZ:
case REG_MULTI_SZ:
case REG_BINARY:
default:
REGPROC_export_binary(line_buf, line_buf_size, &line_len, value_type, *val_buf, val_size1, unicode);
}
REGPROC_write_line(file, *line_buf, unicode); REGPROC_write_line(file, *line_buf, unicode);
} }
@ -1427,15 +1414,93 @@ static size_t export_value_name(FILE *fp, WCHAR *name, size_t len, BOOL unicode)
return line_len; return line_len;
} }
static void export_dword_data(FILE *fp, void *data, BOOL unicode) static void export_dword_data(WCHAR **buf, DWORD *data)
{ {
static const WCHAR fmt[] = {'d','w','o','r','d',':','%','0','8','x','\r','\n',0}; static const WCHAR fmt[] = {'d','w','o','r','d',':','%','0','8','x',0};
WCHAR *buf;
buf = resize_buffer(NULL, 17 * sizeof(WCHAR)); *buf = resize_buffer(NULL, 15 * sizeof(WCHAR));
sprintfW(buf, fmt, *(DWORD *)data); sprintfW(*buf, fmt, *data);
}
static size_t export_hex_data_type(FILE *fp, DWORD type, BOOL unicode)
{
static const WCHAR hex[] = {'h','e','x',':',0};
static const WCHAR hexp_fmt[] = {'h','e','x','(','%','x',')',':',0};
size_t line_len;
if (type == REG_BINARY)
{
line_len = lstrlenW(hex);
REGPROC_write_line(fp, hex, unicode);
}
else
{
WCHAR *buf = resize_buffer(NULL, 15 * sizeof(WCHAR));
line_len = sprintfW(buf, hexp_fmt, type);
REGPROC_write_line(fp, buf, unicode); REGPROC_write_line(fp, buf, unicode);
HeapFree(GetProcessHeap(), 0, buf); HeapFree(GetProcessHeap(), 0, buf);
}
return line_len;
}
#define MAX_HEX_CHARS 77
static void export_hex_data(FILE *fp, WCHAR **buf, DWORD type, DWORD line_len,
void *data, DWORD size, BOOL unicode)
{
static const WCHAR fmt[] = {'%','0','2','x',0};
static const WCHAR hex_concat[] = {'\\','\r','\n',' ',' ',0};
size_t num_commas, i, pos;
line_len += export_hex_data_type(fp, type, unicode);
if (!unicode && (type == REG_EXPAND_SZ || type == REG_MULTI_SZ))
data = GetMultiByteStringN(data, size / sizeof(WCHAR), &size);
num_commas = size - 1;
*buf = resize_buffer(NULL, (size * 3) * sizeof(WCHAR));
for (i = 0, pos = 0; i < size; i++)
{
pos += sprintfW(*buf + pos, fmt, ((BYTE *)data)[i]);
if (i == num_commas) break;
(*buf)[pos++] = ',';
(*buf)[pos] = 0;
line_len += 3;
if (line_len >= MAX_HEX_CHARS)
{
REGPROC_write_line(fp, *buf, unicode);
REGPROC_write_line(fp, hex_concat, unicode);
line_len = 2;
pos = 0;
}
}
}
static void export_data(FILE *fp, DWORD type, size_t line_len, void *data, size_t size, BOOL unicode)
{
WCHAR *buf = NULL;
static const WCHAR newline[] = {'\r','\n',0};
switch (type)
{
case REG_DWORD:
export_dword_data(&buf, data);
break;
case REG_NONE:
case REG_EXPAND_SZ:
case REG_BINARY:
case REG_MULTI_SZ:
default:
export_hex_data(fp, &buf, type, line_len, data, size, unicode);
break;
}
REGPROC_write_line(fp, buf, unicode);
HeapFree(GetProcessHeap(), 0, buf);
REGPROC_write_line(fp, newline, unicode);
} }
static WCHAR *build_subkey_path(WCHAR *path, DWORD path_len, WCHAR *subkey_name, DWORD subkey_len) static WCHAR *build_subkey_path(WCHAR *path, DWORD path_len, WCHAR *subkey_name, DWORD subkey_len)
@ -1491,9 +1556,9 @@ 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); rc = RegEnumValueW(key, i, value_name, &value_len, NULL, &type, data, &data_size);
if (rc == ERROR_SUCCESS) if (rc == ERROR_SUCCESS)
{ {
export_value_name(fp, value_name, value_len, unicode); size_t line_len = export_value_name(fp, value_name, value_len, unicode);
if (type == REG_DWORD) if (type != REG_SZ)
export_dword_data(fp, data, unicode); export_data(fp, type, line_len, data, data_size, unicode);
else else
export_hkey(fp, type, &data, &data_size, &line_buf, &line_buf_size, unicode); export_hkey(fp, type, &data, &data_size, &line_buf, &line_buf_size, unicode);
i++; i++;