From 032d32f94052a5e7386d07b4a4986d1140f736e6 Mon Sep 17 00:00:00 2001 From: Hugh McMaster Date: Fri, 30 Jun 2017 13:42:55 +0000 Subject: [PATCH] regedit: Improve the parsing of multiline hex data during the registry import operation. Signed-off-by: Hugh McMaster Signed-off-by: Alexandre Julliard --- programs/regedit/regproc.c | 141 +++++++++++++++++++++++-------- programs/regedit/tests/regedit.c | 125 ++++++++++++++------------- 2 files changed, 170 insertions(+), 96 deletions(-) diff --git a/programs/regedit/regproc.c b/programs/regedit/regproc.c index e5a4f741e8b..512ddb46965 100644 --- a/programs/regedit/regproc.c +++ b/programs/regedit/regproc.c @@ -147,6 +147,8 @@ enum parser_state STRING_DATA, /* parsing REG_SZ data */ DWORD_DATA, /* parsing DWORD data */ HEX_DATA, /* parsing REG_BINARY, REG_NONE, REG_EXPAND_SZ or REG_MULTI_SZ data */ + EOL_BACKSLASH, /* preparing to parse multiple lines of hex data */ + HEX_MULTILINE, /* parsing multiple lines of hex data */ UNKNOWN_DATA, /* parsing an unhandled or invalid data type */ SET_VALUE, /* adding a value to the registry */ NB_PARSER_STATES @@ -165,6 +167,7 @@ struct parser DWORD data_type; /* data type */ void *data; /* value data */ DWORD data_size; /* size of the data (in bytes) */ + BOOL backslash; /* TRUE if the current line contains a backslash */ enum parser_state state; /* current parser state */ }; @@ -184,6 +187,8 @@ static WCHAR *data_type_state(struct parser *parser, WCHAR *pos); static WCHAR *string_data_state(struct parser *parser, WCHAR *pos); static WCHAR *dword_data_state(struct parser *parser, WCHAR *pos); static WCHAR *hex_data_state(struct parser *parser, WCHAR *pos); +static WCHAR *eol_backslash_state(struct parser *parser, WCHAR *pos); +static WCHAR *hex_multiline_state(struct parser *parser, WCHAR *pos); static WCHAR *unknown_data_state(struct parser *parser, WCHAR *pos); static WCHAR *set_value_state(struct parser *parser, WCHAR *pos); @@ -202,6 +207,8 @@ static const parser_state_func parser_funcs[NB_PARSER_STATES] = string_data_state, /* STRING_DATA */ dword_data_state, /* DWORD_DATA */ hex_data_state, /* HEX_DATA */ + eol_backslash_state, /* EOL_BACKSLASH */ + hex_multiline_state, /* HEX_MULTILINE */ unknown_data_state, /* UNKNOWN_DATA */ set_value_state, /* SET_VALUE */ }; @@ -214,6 +221,19 @@ static inline enum parser_state set_state(struct parser *parser, enum parser_sta return ret; } +static void *resize_buffer(void *buf, size_t count) +{ + void *new_buf; + + if (buf) + new_buf = HeapReAlloc(GetProcessHeap(), 0, buf, count); + else + new_buf = HeapAlloc(GetProcessHeap(), 0, count); + + CHECK_ENOUGH_MEMORY(new_buf); + return new_buf; +} + /****************************************************************************** * Converts a hex representation of a DWORD into a DWORD. */ @@ -246,37 +266,61 @@ error: } /****************************************************************************** - * Converts comma-separated hex data into a binary string. + * Converts comma-separated hex data into a binary string and modifies + * the input parameter to skip the concatenating backslash, if found. + * + * Returns TRUE or FALSE to indicate whether parsing was successful. */ -static BYTE *convert_hex_csv_to_hex(WCHAR *str, DWORD *size) +static BOOL convert_hex_csv_to_hex(struct parser *parser, WCHAR **str) { + size_t size; + BYTE *d; WCHAR *s; - BYTE *d, *data; + + parser->backslash = FALSE; /* The worst case is 1 digit + 1 comma per byte */ - *size=(lstrlenW(str)+1)/2; - data=HeapAlloc(GetProcessHeap(), 0, *size); - CHECK_ENOUGH_MEMORY(data); + size = ((lstrlenW(*str) + 1) / 2) + parser->data_size; + parser->data = resize_buffer(parser->data, size); - s = str; - d = data; - *size=0; - while (*s != '\0') { - UINT wc; + s = *str; + d = (BYTE *)parser->data + parser->data_size; + + while (*s) + { WCHAR *end; + unsigned long wc; - wc = strtoulW(s,&end,16); - if (end == s || wc > 0xff || (*end && *end != ',')) { - HeapFree(GetProcessHeap(), 0, data); - return NULL; + wc = strtoulW(s, &end, 16); + if (wc > 0xff) return FALSE; + + if (s == end && wc == 0) + { + while (*end == ' ' || *end == '\t') end++; + if (*end == '\\') + { + parser->backslash = TRUE; + *str = end + 1; + return TRUE; + } + return FALSE; } - *d++ =(BYTE)wc; - (*size)++; + + *d++ = wc; + parser->data_size++; + + if (*end && *end != ',') + { + while (*end == ' ' || *end == '\t') end++; + if (*end && *end != ';') return FALSE; + return TRUE; + } + if (*end) end++; s = end; } - return data; + return TRUE; } /****************************************************************************** @@ -790,9 +834,15 @@ static WCHAR *hex_data_state(struct parser *parser, WCHAR *pos) { WCHAR *line = pos; - if (!(parser->data = convert_hex_csv_to_hex(line, &parser->data_size))) + if (!convert_hex_csv_to_hex(parser, &line)) goto invalid; + if (parser->backslash) + { + set_state(parser, EOL_BACKSLASH); + return line; + } + if (!parser->is_unicode && (parser->data_type == REG_EXPAND_SZ || parser->data_type == REG_MULTI_SZ)) { void *tmp = parser->data; @@ -814,6 +864,44 @@ invalid: return line; } +/* handler for parser EOL_BACKSLASH state */ +static WCHAR *eol_backslash_state(struct parser *parser, WCHAR *pos) +{ + WCHAR *p = pos; + + while (*p == ' ' || *p == '\t') p++; + if (*p && *p != ';') goto invalid; + + set_state(parser, HEX_MULTILINE); + return pos; + +invalid: + HeapFree(GetProcessHeap(), 0, parser->data); + parser->data = NULL; + parser->data_size = 0; + + set_state(parser, LINE_START); + return p; +} + +/* handler for parser HEX_MULTILINE state */ +static WCHAR *hex_multiline_state(struct parser *parser, WCHAR *pos) +{ + WCHAR *line; + + if (!(line = get_line(parser->file))) + { + set_state(parser, SET_VALUE); + return pos; + } + + while (*line == ' ' || *line == '\t') line++; + if (*line == ';') return line; + + set_state(parser, HEX_DATA); + return line; +} + /* handler for parser UNKNOWN_DATA state */ static WCHAR *unknown_data_state(struct parser *parser, WCHAR *pos) { @@ -893,13 +981,6 @@ static WCHAR *get_lineA(FILE *fp) next = p + 1; if (*p == '\r' && *(p + 1) == '\n') next++; *p = 0; - if (p > buf && *(p - 1) == '\\') - { - while (*next == ' ' || *next == '\t') next++; - memmove(p - 1, next, strlen(next) + 1); - next = line; - continue; - } if (*line == ';' || *line == '#') { line = next; @@ -963,13 +1044,6 @@ static WCHAR *get_lineW(FILE *fp) next = p + 1; if (*p == '\r' && *(p + 1) == '\n') next++; *p = 0; - if (p > buf && *(p - 1) == '\\') - { - while (*next == ' ' || *next == '\t') next++; - memmove(p - 1, next, (strlenW(next) + 1) * sizeof(WCHAR)); - next = line; - continue; - } if (*line == ';' || *line == '#') { line = next; @@ -1473,6 +1547,7 @@ BOOL import_registry_file(FILE *reg_file) parser.data_type = 0; parser.data = NULL; parser.data_size = 0; + parser.backslash = FALSE; parser.state = HEADER; pos = parser.two_wchars; diff --git a/programs/regedit/tests/regedit.c b/programs/regedit/tests/regedit.c index 3b5a7f51dda..e85e2a7a7e2 100644 --- a/programs/regedit/tests/regedit.c +++ b/programs/regedit/tests/regedit.c @@ -332,7 +332,7 @@ static void test_basic_import(void) verify_reg(hkey, "Wine9a", REG_EXPAND_SZ, "Line", 5, 0); verify_reg(hkey, "Wine9b", REG_SZ, "Value 1", 8, 0); verify_reg_nonexist(hkey, "Wine9c"); - todo_wine verify_reg(hkey, "Wine9d", REG_SZ, "Value 2", 8, 0); + verify_reg(hkey, "Wine9d", REG_SZ, "Value 2", 8, 0); verify_reg_nonexist(hkey, "Wine9e"); verify_reg_nonexist(hkey, "Wine9f"); verify_reg(hkey, "Wine9g", REG_SZ, "Value 4", 8, 0); @@ -362,8 +362,8 @@ static void test_basic_import(void) " 65,00,00,00\n"); verify_reg(hkey, "Wine10a", REG_NONE, "V\0a\0l\0u\0e\0\0", 12, 0); verify_reg(hkey, "Wine10b", REG_NONE, "V\0a\0l\0u\0e\0\0", 12, 0); - todo_wine verify_reg(hkey, "Wine10c", REG_NONE, "V\0a\0l\0u\0e\0\0", 12, 0); - todo_wine verify_reg(hkey, "Wine10d", REG_NONE, "V\0a\0l\0u", 8, 0); + verify_reg(hkey, "Wine10c", REG_NONE, "V\0a\0l\0u\0e\0\0", 12, 0); + verify_reg(hkey, "Wine10d", REG_NONE, "V\0a\0l\0u", 8, 0); todo_wine verify_reg(hkey, "Wine10e", REG_NONE, "V\0a\0l\0u", 8, 0); exec_import_str("REGEDIT4\n\n" @@ -382,14 +382,14 @@ static void test_basic_import(void) " 25,00\n"); verify_reg(hkey, "Wine11a", REG_EXPAND_SZ, "%PATH%", 7, 0); verify_reg(hkey, "Wine11b", REG_EXPAND_SZ, "%PATH%", 7, 0); - todo_wine verify_reg(hkey, "Wine11c", REG_EXPAND_SZ, "%PATH%", 7, 0); + verify_reg(hkey, "Wine11c", REG_EXPAND_SZ, "%PATH%", 7, 0); /* Wine11d */ size = sizeof(buffer); lr = RegQueryValueExA(hkey, "Wine11d", NULL, &type, (BYTE *)&buffer, &size); - todo_wine ok(lr == ERROR_SUCCESS, "RegQueryValueExA failed: %d\n", lr); - todo_wine ok(type == REG_EXPAND_SZ, "got wrong type %u, expected %u\n", type, REG_EXPAND_SZ); + ok(lr == ERROR_SUCCESS, "RegQueryValueExA failed: %d\n", lr); + ok(type == REG_EXPAND_SZ, "got wrong type %u, expected %u\n", type, REG_EXPAND_SZ); todo_wine ok(size == 6 || broken(size == 5) /* WinXP */, "got wrong size %u, expected 6\n", size); - todo_wine ok(memcmp(buffer, "%PATH", size) == 0, "got wrong data\n"); + ok(memcmp(buffer, "%PATH", size) == 0, "got wrong data\n"); /* Wine11e */ size = sizeof(buffer); memset(buffer, '-', size); @@ -417,8 +417,8 @@ static void test_basic_import(void) hex[4] = 0x55; hex[5] = 0x66; hex[6] = 0x77; hex[7] = 0x88; verify_reg(hkey, "Wine12a", REG_BINARY, hex, sizeof(hex), 0); verify_reg(hkey, "Wine12b", REG_BINARY, hex, sizeof(hex), 0); - todo_wine verify_reg(hkey, "Wine12c", REG_BINARY, hex, sizeof(hex), 0); - todo_wine verify_reg(hkey, "Wine12d", REG_BINARY, hex, 6, 0); + verify_reg(hkey, "Wine12c", REG_BINARY, hex, sizeof(hex), 0); + verify_reg(hkey, "Wine12d", REG_BINARY, hex, 6, 0); todo_wine verify_reg(hkey, "Wine12e", REG_BINARY, hex, 6, 0); /* Test import with subkeys */ @@ -490,10 +490,9 @@ static void test_basic_import(void) "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" "\"Wine17\"=hex(7):4c,69,6e,65,20,\\"); lr = RegQueryValueExA(hkey, "Wine17", NULL, NULL, NULL, NULL); - todo_wine ok(lr == ERROR_SUCCESS || broken(lr == ERROR_FILE_NOT_FOUND) /* WinXP */, - "got %u, expected 0\n", lr); + ok(lr == ERROR_SUCCESS || broken(lr == ERROR_FILE_NOT_FOUND) /* WinXP */, "got %u, expected 0\n", lr); if (lr == ERROR_SUCCESS) - todo_wine verify_reg(hkey, "Wine17", REG_MULTI_SZ, "Line ", 6, 0); + verify_reg(hkey, "Wine17", REG_MULTI_SZ, "Line ", 6, TODO_REG_SIZE | TODO_REG_DATA); RegCloseKey(hkey); @@ -664,25 +663,25 @@ static void test_invalid_import(void) "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" "\"Multi-Line1\"=hex(7):4c,69,6e,65,20\\\n" ",63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n\n"); - todo_wine verify_reg_nonexist(hkey, "Multi-Line1"); + verify_reg_nonexist(hkey, "Multi-Line1"); exec_import_str("REGEDIT4\n\n" "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" "\"Multi-Line2\"=hex(7):4c,69,6e,65,20\\\n" " ,63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n\n"); - todo_wine verify_reg_nonexist(hkey, "Multi-Line2"); + verify_reg_nonexist(hkey, "Multi-Line2"); exec_import_str("Windows Registry Editor Version 5.00\n\n" "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" "\"Multi-Line3\"=hex(7):4c,69,6e,65,20\\\n" ",63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n\n"); - todo_wine verify_reg_nonexist(hkey, "Multi-Line3"); + verify_reg_nonexist(hkey, "Multi-Line3"); exec_import_str("Windows Registry Editor Version 5.00\n\n" "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" "\"Multi-Line4\"=hex(7):4c,69,6e,65,20\\\n" " ,63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n\n"); - todo_wine verify_reg_nonexist(hkey, "Multi-Line4"); + verify_reg_nonexist(hkey, "Multi-Line4"); exec_import_str("REGEDIT4\n\n" "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" @@ -749,7 +748,7 @@ static void test_invalid_import(void) "\"Test17b\"=\"Value 2\"\n" "\"Test\n" "\\17c\"=\"Value 3\"\n\n"); - todo_wine verify_reg_nonexist(hkey, "Test17a"); + verify_reg_nonexist(hkey, "Test17a"); verify_reg(hkey, "Test17b", REG_SZ, "Value 2", 8, 0); verify_reg_nonexist(hkey, "Test17c"); @@ -759,8 +758,8 @@ static void test_invalid_import(void) "5678\n" "\"Test18b\"=\"Test \\\n" "Value\"\n\n"); - todo_wine verify_reg_nonexist(hkey, "Test18a"); - todo_wine verify_reg_nonexist(hkey, "Test18b"); + verify_reg_nonexist(hkey, "Test18a"); + verify_reg_nonexist(hkey, "Test18b"); /* Test hex data concatenation for REG_NONE, REG_EXPAND_SZ and REG_BINARY */ exec_import_str("REGEDIT4\n\n" @@ -778,11 +777,11 @@ static void test_invalid_import(void) "\"Test19f\"=hex(0):56,00,61,00,\\;comment\n" " 6c,00,75,00,\\#comment\n" " 65,00,00,00\n\n"); - todo_wine verify_reg_nonexist(hkey, "Test19a"); - todo_wine verify_reg_nonexist(hkey, "Test19b"); - todo_wine verify_reg_nonexist(hkey, "Test19c"); - todo_wine verify_reg_nonexist(hkey, "Test19d"); - todo_wine verify_reg_nonexist(hkey, "Test19e"); + verify_reg_nonexist(hkey, "Test19a"); + verify_reg_nonexist(hkey, "Test19b"); + verify_reg_nonexist(hkey, "Test19c"); + verify_reg_nonexist(hkey, "Test19d"); + verify_reg_nonexist(hkey, "Test19e"); verify_reg_nonexist(hkey, "Test19f"); exec_import_str("REGEDIT4\n\n" @@ -800,11 +799,11 @@ static void test_invalid_import(void) "\"Test20f\"=hex(2):25,50,41,\\;comment\n" " 54,48,\\#comment\n" " 25,00\n\n"); - todo_wine verify_reg_nonexist(hkey, "Test20a"); - todo_wine verify_reg_nonexist(hkey, "Test20b"); + verify_reg_nonexist(hkey, "Test20a"); + verify_reg_nonexist(hkey, "Test20b"); verify_reg_nonexist(hkey, "Test20c"); - todo_wine verify_reg_nonexist(hkey, "Test20d"); - todo_wine verify_reg_nonexist(hkey, "Test20e"); + verify_reg_nonexist(hkey, "Test20d"); + verify_reg_nonexist(hkey, "Test20e"); verify_reg_nonexist(hkey, "Test20f"); exec_import_str("REGEDIT4\n\n" @@ -822,11 +821,11 @@ static void test_invalid_import(void) "\"Test21f\"=hex:11,22,33,\\;comment\n" " 44,55,66,\\#comment\n" " 77,88\n\n"); - todo_wine verify_reg_nonexist(hkey, "Test21a"); - todo_wine verify_reg_nonexist(hkey, "Test21b"); + verify_reg_nonexist(hkey, "Test21a"); + verify_reg_nonexist(hkey, "Test21b"); verify_reg_nonexist(hkey, "Test21c"); - todo_wine verify_reg_nonexist(hkey, "Test21d"); - todo_wine verify_reg_nonexist(hkey, "Test21e"); + verify_reg_nonexist(hkey, "Test21d"); + verify_reg_nonexist(hkey, "Test21e"); verify_reg_nonexist(hkey, "Test21f"); /* Test support for characters greater than 0xff */ @@ -861,7 +860,7 @@ static void test_invalid_import(void) verify_reg_nonexist(hkey, "Wine23e"); verify_reg_nonexist(hkey, "Wine23f"); verify_reg_nonexist(hkey, "Wine23g"); - todo_wine verify_reg_nonexist(hkey, "Wine23h"); + verify_reg_nonexist(hkey, "Wine23h"); verify_reg_nonexist(hkey, "Wine23i"); verify_reg_nonexist(hkey, "Wine23j"); verify_reg_nonexist(hkey, "Wine23k"); @@ -878,10 +877,10 @@ static void test_invalid_import(void) "\"Wine24b\"=hex(2):4c,69,6e,65,20\\\n" "[HKEY_CURRENT_USER\\" KEY_BASE "\\Subkey2]\n"); verify_reg_nonexist(hkey, "Wine24b"); - todo_wine verify_key(hkey, "Subkey2"); + verify_key(hkey, "Subkey2"); lr = RegDeleteKeyA(hkey, "Subkey2"); - todo_wine ok(lr == ERROR_SUCCESS, "RegDeleteKey failed: %u\n", lr); + ok(lr == ERROR_SUCCESS, "RegDeleteKey failed: %u\n", lr); exec_import_str("REGEDIT4\n\n" "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" @@ -904,13 +903,13 @@ static void test_invalid_import(void) verify_reg_nonexist(hkey, "Wine25a"); verify_reg_nonexist(hkey, "Wine25b"); verify_reg_nonexist(hkey, "Wine25c"); - todo_wine verify_reg_nonexist(hkey, "Wine25d"); + verify_reg_nonexist(hkey, "Wine25d"); verify_reg_nonexist(hkey, "Wine25e"); - verify_reg(hkey, "Wine25f", REG_SZ, "Test value", 11, 0); + todo_wine verify_reg(hkey, "Wine25f", REG_SZ, "Test value", 11, 0); todo_wine verify_reg_nonexist(hkey, "Wine25g"); todo_wine verify_reg_nonexist(hkey, "Wine25h"); verify_reg_nonexist(hkey, "Wine25i"); - todo_wine verify_reg(hkey, "Wine25j", REG_SZ, "Test value", 11, 0); + verify_reg(hkey, "Wine25j", REG_SZ, "Test value", 11, 0); exec_import_str("REGEDIT4\n\n" "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" @@ -933,13 +932,13 @@ static void test_invalid_import(void) verify_reg_nonexist(hkey, "Wine26a"); verify_reg_nonexist(hkey, "Wine26b"); verify_reg_nonexist(hkey, "Wine26c"); - todo_wine verify_reg_nonexist(hkey, "Wine26d"); + verify_reg_nonexist(hkey, "Wine26d"); verify_reg_nonexist(hkey, "Wine26e"); - verify_reg(hkey, "Wine26f", REG_DWORD, &dword, sizeof(dword), 0); + todo_wine verify_reg(hkey, "Wine26f", REG_DWORD, &dword, sizeof(dword), 0); todo_wine verify_reg_nonexist(hkey, "Wine26g"); todo_wine verify_reg_nonexist(hkey, "Wine26h"); verify_reg_nonexist(hkey, "Wine26i"); - todo_wine verify_reg(hkey, "Wine26j", REG_DWORD, &dword, sizeof(dword), 0); + verify_reg(hkey, "Wine26j", REG_DWORD, &dword, sizeof(dword), 0); exec_import_str("REGEDIT4\n\n" "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" @@ -962,13 +961,13 @@ static void test_invalid_import(void) verify_reg_nonexist(hkey, "Wine27a"); verify_reg_nonexist(hkey, "Wine27b"); verify_reg_nonexist(hkey, "Wine27c"); - todo_wine verify_reg_nonexist(hkey, "Wine27d"); + verify_reg_nonexist(hkey, "Wine27d"); verify_reg_nonexist(hkey, "Wine27e"); - verify_reg(hkey, "Wine27f", REG_EXPAND_SZ, "%PATH%", 7, 0); + todo_wine verify_reg(hkey, "Wine27f", REG_EXPAND_SZ, "%PATH%", 7, 0); todo_wine verify_reg_nonexist(hkey, "Wine27g"); todo_wine verify_reg_nonexist(hkey, "Wine27h"); verify_reg_nonexist(hkey, "Wine27i"); - todo_wine verify_reg(hkey, "Wine27j", REG_EXPAND_SZ, "%PATH%", 7, 0); + verify_reg(hkey, "Wine27j", REG_EXPAND_SZ, "%PATH%", 7, 0); exec_import_str("REGEDIT4\n\n" "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" @@ -983,7 +982,7 @@ static void test_invalid_import(void) ";comment\n" "@=\"Default value 2\"\n\n"); verify_reg_nonexist(hkey, "Wine28b"); - todo_wine verify_reg_nonexist(hkey, NULL); + verify_reg_nonexist(hkey, NULL); exec_import_str("REGEDIT4\n\n" "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" @@ -991,10 +990,10 @@ static void test_invalid_import(void) "#comment\n" "@=\"Default value 3\"\n\n"); verify_reg_nonexist(hkey, "Wine28c"); - verify_reg(hkey, NULL, REG_SZ, "Default value 3", 16, 0); + todo_wine verify_reg(hkey, NULL, REG_SZ, "Default value 3", 16, 0); lr = RegDeleteValueW(hkey, NULL); - ok(lr == ERROR_SUCCESS, "RegDeleteValue failed: %u\n", lr); + todo_wine ok(lr == ERROR_SUCCESS, "RegDeleteValue failed: %u\n", lr); exec_import_str("REGEDIT4\n\n" "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" @@ -1008,7 +1007,7 @@ static void test_invalid_import(void) "\"Wine28e\"=hex(2):4c,69,6e,65,20\\\n" "@=\"Default value 5\"\n\n"); verify_reg_nonexist(hkey, "Wine28e"); - verify_reg(hkey, NULL, REG_SZ, "Default value 5", 16, TODO_REG_DATA); + verify_reg(hkey, NULL, REG_SZ, "Default value 5", 16, 0); exec_import_str("REGEDIT4\n\n" "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" @@ -1116,8 +1115,8 @@ static void test_comments(void) "\"Wine2\"=\"Line 2\"\n\n"); lr = RegOpenKeyExA(HKEY_CURRENT_USER, KEY_BASE, 0, KEY_READ, &hkey); ok(lr == ERROR_SUCCESS, "RegOpenKeyExA failed: %d\n", lr); - todo_wine verify_reg(hkey, "Wine1", REG_SZ, "Line 1", 7, 0); - todo_wine verify_reg(hkey, "Wine2", REG_SZ, "Line 2", 7, 0); + verify_reg(hkey, "Wine1", REG_SZ, "Line 1", 7, 0); + verify_reg(hkey, "Wine2", REG_SZ, "Line 2", 7, 0); exec_import_str("REGEDIT4\n\n" "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" @@ -1143,7 +1142,7 @@ static void test_comments(void) "\"Wine10\"=\"Another valid line\"\n\n"); verify_reg_nonexist(hkey, "Wine7"); verify_reg(hkey, "Wine8", REG_SZ, "A valid line", 13, 0); - todo_wine verify_reg(hkey, "Wine9", REG_MULTI_SZ, "Line concatenation\0", 20, 0); + verify_reg(hkey, "Wine9", REG_MULTI_SZ, "Line concatenation\0", 20, 0); verify_reg(hkey, "Wine10", REG_SZ, "Another valid line", 19, 0); exec_import_str("REGEDIT4\n\n" @@ -1220,7 +1219,7 @@ static void test_comments(void) " 63,6f,6e,\\;comment\n" " 63,61,74,\\;comment\n" " 65,6e,61,74,69,6f,6e,00,00\n\n"); - todo_wine verify_reg(hkey, "Multi-Line1", REG_MULTI_SZ, "Line concatenation\0", 20, 0); + verify_reg(hkey, "Multi-Line1", REG_MULTI_SZ, "Line concatenation\0", 20, 0); exec_import_str("REGEDIT4\n\n" "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" @@ -1237,7 +1236,7 @@ static void test_comments(void) " 63,6f,6e,\\;comment\n" " 63,61,74,\\;comment\n" " 65,6e,61,74,69,6f,6e,00,00\n\n"); - todo_wine verify_reg(hkey, "Multi-Line3", REG_MULTI_SZ, "Line concatenation\0", 20, 0); + verify_reg(hkey, "Multi-Line3", REG_MULTI_SZ, "Line concatenation\0", 20, 0); exec_import_str("REGEDIT4\n\n" "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" @@ -1246,7 +1245,7 @@ static void test_comments(void) " 63,6f,6e,\\;#comment\n" " 63,61,74,\\;#comment\n" " 65,6e,61,74,69,6f,6e,00,00\n\n"); - todo_wine verify_reg(hkey, "Multi-Line4", REG_MULTI_SZ, "Line concatenation\0", 20, 0); + verify_reg(hkey, "Multi-Line4", REG_MULTI_SZ, "Line concatenation\0", 20, 0); exec_import_str("REGEDIT4\n\n" "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" @@ -1264,7 +1263,7 @@ static void test_comments(void) " 63,61,74,\\\n\n" " 65,6e,\\;comment\n\n" " 61,74,69,6f,6e,00,00\n\n"); - todo_wine verify_reg(hkey, "Multi-Line6", REG_MULTI_SZ, "Line concatenation\0", 20, 0); + verify_reg(hkey, "Multi-Line6", REG_MULTI_SZ, "Line concatenation\0", 20, TODO_REG_SIZE); exec_import_str("REGEDIT4\n\n" "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" @@ -1272,8 +1271,8 @@ static void test_comments(void) "\"Wine27b\"=hex(2):25,50,41,54,48,25,00\t;comment\n" "\"Wine27c\"=hex(2):25,50,41,54,48,25,00 #comment\n" "\"Wine27d\"=hex(2):25,50,41,54,48,25,00\t#comment\n\n"); - todo_wine verify_reg(hkey, "Wine27a", REG_EXPAND_SZ, "%PATH%", 7, 0); - todo_wine verify_reg(hkey, "Wine27b", REG_EXPAND_SZ, "%PATH%", 7, 0); + verify_reg(hkey, "Wine27a", REG_EXPAND_SZ, "%PATH%", 7, 0); + verify_reg(hkey, "Wine27b", REG_EXPAND_SZ, "%PATH%", 7, 0); verify_reg_nonexist(hkey, "Wine27c"); verify_reg_nonexist(hkey, "Wine27d"); @@ -1293,9 +1292,9 @@ static void test_comments(void) " 25,50,41,54,48,25,00\n\n"); verify_reg(hkey, "Wine28a", REG_EXPAND_SZ, "%HOME%\\%PATH%", 14, 0); verify_reg_nonexist(hkey, "Wine28b"); - todo_wine verify_reg(hkey, "Wine28c", REG_EXPAND_SZ, "%HOME%\\%PATH%", 14, 0); + verify_reg(hkey, "Wine28c", REG_EXPAND_SZ, "%HOME%\\%PATH%", 14, 0); verify_reg_nonexist(hkey, "Wine28d"); - todo_wine verify_reg(hkey, "Wine28e", REG_EXPAND_SZ, "%HOME%\\%PATH%", 14, 0); + verify_reg(hkey, "Wine28e", REG_EXPAND_SZ, "%HOME%\\%PATH%", 14, 0); verify_reg_nonexist(hkey, "Wine28f"); exec_import_str("REGEDIT4\n\n" @@ -1305,7 +1304,7 @@ static void test_comments(void) ";comment\n" " 65,6e,\\;comment\n" " 61,74,69,6f,6e,00,00\n\n"); - todo_wine verify_reg(hkey, "Wine29a", REG_MULTI_SZ, "Line concatenation\0", 20, 0); + verify_reg(hkey, "Wine29a", REG_MULTI_SZ, "Line concatenation\0", 20, 0); exec_import_str("REGEDIT4\n\n" "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" @@ -1314,7 +1313,7 @@ static void test_comments(void) " ;comment\n" " 65,6e,\\;comment\n" " 61,74,69,6f,6e,00,00\n\n"); - todo_wine verify_reg(hkey, "Wine29b", REG_MULTI_SZ, "Line concatenation\0", 20, 0); + verify_reg(hkey, "Wine29b", REG_MULTI_SZ, "Line concatenation\0", 20, 0); exec_import_str("REGEDIT4\n\n" "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" @@ -1323,7 +1322,7 @@ static void test_comments(void) "#comment\n" " 65,6e,\\;comment\n" " 61,74,69,6f,6e,00,00\n\n"); - verify_reg_nonexist(hkey, "Wine29c"); + todo_wine verify_reg_nonexist(hkey, "Wine29c"); exec_import_str("REGEDIT4\n\n" "[HKEY_CURRENT_USER\\" KEY_BASE "]\n" @@ -1408,7 +1407,7 @@ static void test_import_with_whitespace(void) verify_reg(hkey, "Wine4a", REG_SZ, "Tab and four spaces", 20, 0); dword = 0x112233; verify_reg(hkey, "Wine4b", REG_DWORD, &dword, sizeof(dword), 0); - todo_wine verify_reg(hkey, "Wine4c", REG_MULTI_SZ, "Line concatenation\0", 20, 0); + verify_reg(hkey, "Wine4c", REG_MULTI_SZ, "Line concatenation\0", 20, 0); exec_import_str(" REGEDIT4\n\n" "\t[HKEY_CURRENT_USER\\" KEY_BASE "]\n"