+static void test_invalid_import_31(void)
+{
+ HKEY hkey;
+ LONG lr;
+
+ lr = RegCreateKeyExA(HKEY_CLASSES_ROOT, KEY_BASE, 0, NULL, REG_OPTION_NON_VOLATILE,
+ KEY_READ, NULL, &hkey, NULL);
+ ok(lr == ERROR_SUCCESS, "RegCreateKeyExA failed: %d\n", lr);
+
+ /* Test character validity at the start of the line */
+ exec_import_str("REGEDIT\r\n"
+ " HKEY_CLASSES_ROOT\\" KEY_BASE " = Value1a\r\n");
+ todo_wine verify_reg_nonexist(hkey, "");
+
+ exec_import_str("REGEDIT\r\n"
+ " HKEY_CLASSES_ROOT\\" KEY_BASE " = Value1b\r\n");
+ todo_wine verify_reg_nonexist(hkey, "");
+
+ exec_import_str("REGEDIT\r\n"
+ "\tHKEY_CLASSES_ROOT\\" KEY_BASE " = Value1c\r\n");
+ todo_wine verify_reg_nonexist(hkey, "");
+
+ exec_import_str("REGEDIT\r\n"
+ ";HKEY_CLASSES_ROOT\\" KEY_BASE " = Value2a\r\n");
+ todo_wine verify_reg_nonexist(hkey, "");
+
+ exec_import_str("REGEDIT\r\n"
+ "#HKEY_CLASSES_ROOT\\" KEY_BASE " = Value2b\r\n");
+ todo_wine verify_reg_nonexist(hkey, "");
+
+ /* Test case sensitivity */
+ exec_import_str("REGEDIT\r\n"
+ "hkey_classes_root\\" KEY_BASE " = Value3a\r\n");
+ todo_wine verify_reg_nonexist(hkey, "");
+
+ exec_import_str("REGEDIT\r\n"
+ "hKEY_CLASSES_ROOT\\" KEY_BASE " = Value3b\r\n");
+ todo_wine verify_reg_nonexist(hkey, "");
+
+ exec_import_str("REGEDIT\r\n"
+ "Hkey_Classes_Root\\" KEY_BASE " = Value3c\r\n");
+ todo_wine verify_reg_nonexist(hkey, "");
+
+ RegCloseKey(hkey);
+
+ lr = RegDeleteKeyA(HKEY_CLASSES_ROOT, KEY_BASE);
+ ok(lr == ERROR_SUCCESS, "RegDeleteKeyA failed: %d\n", lr);
+}
+
+static void test_comments(void)
+{
+ LONG lr;
+ HKEY hkey;
+ DWORD dword;
+
+ lr = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
+ ok(lr == ERROR_SUCCESS || lr == ERROR_FILE_NOT_FOUND, "RegDeleteKeyA failed: %d\n", lr);
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "#comment\\\n"
+ "\"Wine1\"=\"Line 1\"\n"
+ ";comment\\\n"
+ "\"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);
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\"Wine3\"=\"Value 1\"#comment\n"
+ "\"Wine4\"=\"Value 2\";comment\n"
+ "\"Wine5\"=dword:01020304 #comment\n"
+ "\"Wine6\"=dword:02040608 ;comment\n\n");
+ verify_reg_nonexist(hkey, "Wine3");
+ verify_reg(hkey, "Wine4", REG_SZ, "Value 2", 8, 0);
+ verify_reg_nonexist(hkey, "Wine5");
+ dword = 0x2040608;
+ verify_reg(hkey, "Wine6", REG_DWORD, &dword, sizeof(dword), 0);
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\"Wine7\"=hex(7):4c,69,6e,65,20,\\\n"
+ " #comment\n"
+ " 63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n"
+ "\"Wine8\"=\"A valid line\"\n"
+ "\"Wine9\"=hex(7):4c,69,6e,65,20,\\\n"
+ " ;comment\n"
+ " 63,6f,6e,63,61,74,65,6e,61,74,69,6f,6e,00,00\n"
+ "\"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, "Wine10", REG_SZ, "Another valid line", 19, 0);
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "#\"Comment1\"=\"Value 1\"\n"
+ ";\"Comment2\"=\"Value 2\"\n"
+ " #\"Comment3\"=\"Value 3\"\n"
+ " ;\"Comment4\"=\"Value 4\"\n"
+ "\"Wine11\"=\"Value 6\"#\"Comment5\"=\"Value 5\"\n"
+ "\"Wine12\"=\"Value 7\";\"Comment6\"=\"Value 6\"\n\n");
+ verify_reg_nonexist(hkey, "Comment1");
+ verify_reg_nonexist(hkey, "Comment2");
+ verify_reg_nonexist(hkey, "Comment3");
+ verify_reg_nonexist(hkey, "Comment4");
+ verify_reg_nonexist(hkey, "Wine11");
+ verify_reg_nonexist(hkey, "Comment5");
+ verify_reg(hkey, "Wine12", REG_SZ, "Value 7", 8, 0);
+ verify_reg_nonexist(hkey, "Comment6");
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\"Wine13\"=#\"Value 8\"\n"
+ "\"Wine14\"=;\"Value 9\"\n"
+ "\"Wine15\"=\"#comment1\"\n"
+ "\"Wine16\"=\";comment2\"\n"
+ "\"Wine17\"=\"Value#comment3\"\n"
+ "\"Wine18\"=\"Value;comment4\"\n"
+ "\"Wine19\"=\"Value #comment5\"\n"
+ "\"Wine20\"=\"Value ;comment6\"\n"
+ "\"Wine21\"=#dword:00000001\n"
+ "\"Wine22\"=;dword:00000002\n"
+ "\"Wine23\"=dword:00000003#comment\n"
+ "\"Wine24\"=dword:00000004;comment\n\n");
+ verify_reg_nonexist(hkey, "Wine13");
+ verify_reg_nonexist(hkey, "Wine14");
+ verify_reg(hkey, "Wine15", REG_SZ, "#comment1", 10, 0);
+ verify_reg(hkey, "Wine16", REG_SZ, ";comment2", 10, 0);
+ verify_reg(hkey, "Wine17", REG_SZ, "Value#comment3", 15, 0);
+ verify_reg(hkey, "Wine18", REG_SZ, "Value;comment4", 15, 0);
+ verify_reg(hkey, "Wine19", REG_SZ, "Value #comment5", 16, 0);
+ verify_reg(hkey, "Wine20", REG_SZ, "Value ;comment6", 16, 0);
+ verify_reg_nonexist(hkey, "Wine21");
+ verify_reg_nonexist(hkey, "Wine22");
+ verify_reg_nonexist(hkey, "Wine23");
+ dword = 0x00000004;
+ verify_reg(hkey, "Wine24", REG_DWORD, &dword, sizeof(dword), 0);
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\"Wine25a\"=dword:1234;5678\n"
+ "\"Wine25b\"=dword:1234 ;5678\n"
+ "\"Wine25c\"=dword:1234#5678\n"
+ "\"Wine25d\"=dword:1234 #5678\n\n");
+ dword = 0x1234;
+ verify_reg(hkey, "Wine25a", REG_DWORD, &dword, sizeof(dword), 0);
+ verify_reg(hkey, "Wine25b", REG_DWORD, &dword, sizeof(dword), 0);
+ verify_reg_nonexist(hkey, "Wine25c");
+ verify_reg_nonexist(hkey, "Wine25d");
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\"Wine26a\"=\"Value1\" ;comment\n"
+ "\"Wine26b\"=\"Value2\"\t\t;comment\n"
+ "\"Wine26c\"=\"Value3\" #comment\n"
+ "\"Wine26d\"=\"Value4\"\t\t#comment\n\n");
+ verify_reg(hkey, "Wine26a", REG_SZ, "Value1", 7, 0);
+ verify_reg(hkey, "Wine26b", REG_SZ, "Value2", 7, 0);
+ verify_reg_nonexist(hkey, "Wine26c");
+ verify_reg_nonexist(hkey, "Wine26d");
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\"Multi-Line1\"=hex(7):4c,69,6e,65,20,\\\n"
+ " 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);
+
+ 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,\\;comment\n"
+ " 63,61,74,;comment\n"
+ " 65,6e,61,74,69,6f,6e,00,00\n\n");
+ todo_wine verify_reg(hkey, "Multi-Line2", REG_MULTI_SZ, "Line concat", 12, 0);
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\"Multi-Line3\"=hex(7):4c,69,6e,\\;comment\n"
+ " 65,20,\\;comment\n"
+ " 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);
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\"Multi-Line4\"=hex(7):4c,69,6e,\\;#comment\n"
+ " 65,20,\\;#comment\n"
+ " 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);
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\"Multi-Line5\"=hex(7):4c,69,6e,\\;comment\n"
+ " 65,20,\\;comment\n"
+ " 63,6f,6e,\\;comment\n"
+ " 63,61,74,\\#comment\n"
+ " 65,6e,61,74,69,6f,6e,00,00\n\n");
+ verify_reg_nonexist(hkey, "Multi-Line5");
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\"Multi-Line6\"=hex(7):4c,69,6e,65,20,\\\n"
+ " 63,6f,6e,\\;comment\n"
+ " 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);
+
+ RegCloseKey(hkey);
+
+ lr = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
+ ok(lr == ERROR_SUCCESS, "RegDeleteKeyA failed: %d\n", lr);
+}
+
+static void test_import_with_whitespace(void)
+{
+ HKEY hkey;
+ LONG lr;
+ DWORD dword;
+
+ exec_import_str(" REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n\n");
+
+ lr = RegOpenKeyExA(HKEY_CURRENT_USER, KEY_BASE, 0, KEY_READ, &hkey);
+ ok(lr == ERROR_SUCCESS, "RegOpenKeyExA failed: got %d, expected 0\n", lr);
+
+ exec_import_str(" REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\"Wine1a\"=\"Value\"\n\n");
+ verify_reg(hkey, "Wine1a", REG_SZ, "Value", 6, 0);
+
+ exec_import_str("\tREGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\"Wine1b\"=\"Value\"\n\n");
+ verify_reg(hkey, "Wine1b", REG_SZ, "Value", 6, 0);
+
+ exec_import_str(" \t REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\"Wine1c\"=\"Value\"\n\n");
+ verify_reg(hkey, "Wine1c", REG_SZ, "Value", 6, 0);
+
+ exec_import_str("REGEDIT4\n\n"
+ " [HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\"Wine2a\"=\"Value\"\n\n");
+ verify_reg(hkey, "Wine2a", REG_SZ, "Value", 6, 0);
+
+ exec_import_str("REGEDIT4\n\n"
+ "\t[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\"Wine2b\"=\"Value\"\n\n");
+ verify_reg(hkey, "Wine2b", REG_SZ, "Value", 6, 0);
+
+ exec_import_str("REGEDIT4\n\n"
+ " \t [HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\"Wine2c\"=\"Value\"\n\n");
+ verify_reg(hkey, "Wine2c", REG_SZ, "Value", 6, 0);
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ " \"Wine3a\"=\"Two leading spaces\"\n\n");
+ verify_reg(hkey, "Wine3a", REG_SZ, "Two leading spaces", 19, 0);
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\t\"Wine3b\"=\"One leading tab\"\n\n");
+ verify_reg(hkey, "Wine3b", REG_SZ, "One leading tab", 16, 0);
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ " \t \"Wine3c\"=\"Space, tab, space\"\n\n");
+ verify_reg(hkey, "Wine3c", REG_SZ, "Space, tab, space", 18, 0);
+
+ exec_import_str(" REGEDIT4\n\n"
+ "\t\t\t[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\t \"Wine4a\"=\"Tab and four spaces\"\n"
+ " \"Wine4b\"=dword:00112233\n"
+ "\t \t \t \t \t \t \"Wine4c\"=hex(7):4c,69,6e,65,20,\\\n"
+ " 63,6f,6e,\\;comment\n"
+ "\t\t\t\t63,61,74,\\;comment\n"
+ " \t65,6e,61,74,69,6f,6e,00,00\n\n");
+ 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);
+
+ exec_import_str(" REGEDIT4\n\n"
+ "\t[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ " \"Wine5a\"=\"Leading spaces\"\n"
+ "\t\t\"Wine5b\"\t\t=\"Leading tabs\"\n"
+ "\t \"Wine5c\"=\t \"Tabs and spaces\"\n"
+ " \"Wine5d\" \t = \t \"More whitespace\"\n\n");
+ verify_reg(hkey, "Wine5a", REG_SZ, "Leading spaces", 15, 0);
+ verify_reg(hkey, "Wine5b", REG_SZ, "Leading tabs", 13, 0);
+ verify_reg(hkey, "Wine5c", REG_SZ, "Tabs and spaces", 16, 0);
+ verify_reg(hkey, "Wine5d", REG_SZ, "More whitespace", 16, 0);
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\" Wine6a\"=\"Leading spaces\"\n"
+ "\"\t\tWine6b\"=\"Leading tabs\"\n"
+ " \" Wine6c \" = \" Spaces everywhere \" \n\n");
+ verify_reg(hkey, " Wine6a", REG_SZ, "Leading spaces", 15, 0);
+ verify_reg(hkey, "\t\tWine6b", REG_SZ, "Leading tabs", 13, 0);
+ verify_reg(hkey, " Wine6c ", REG_SZ, " Spaces everywhere ", 22, 0);
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\"Wine7a\"=\" Four spaces in the data\"\n"
+ "\"Wine7b\"=\"\t\tTwo tabs in the data\"\n\n");
+ verify_reg(hkey, "Wine7a", REG_SZ, " Four spaces in the data", 28, 0);
+ verify_reg(hkey, "Wine7b", REG_SZ, "\t\tTwo tabs in the data", 23, 0);
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\"Wine8a\"=\"Trailing spaces\" \n"
+ "\"Wine8b\"=\"Trailing tabs and spaces\"\t \t\n\n");
+ verify_reg(hkey, "Wine8a", REG_SZ, "Trailing spaces", 16, 0);
+ verify_reg(hkey, "Wine8b", REG_SZ, "Trailing tabs and spaces", 25, 0);
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\"Wine9a\"=dword: 00000008\n"
+ "\"Wine9b\"=dword:\t\t00000008\n\n");
+ dword = 0x00000008;
+ verify_reg(hkey, "Wine9a", REG_DWORD, &dword, sizeof(dword), 0);
+ verify_reg(hkey, "Wine9b", REG_DWORD, &dword, sizeof(dword), 0);
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "@ = \"Test Value\"\n\n");
+ verify_reg(hkey, "", REG_SZ, "Test Value", 11, 0);
+
+ exec_import_str("REGEDIT4\n\n"
+ "[HKEY_CURRENT_USER\\" KEY_BASE "]\n"
+ "\t@\t=\tdword:\t00000008\t\n\n");
+ verify_reg(hkey, "", REG_DWORD, &dword, sizeof(DWORD), 0);
+
+ lr = RegCloseKey(hkey);
+ ok(lr == ERROR_SUCCESS, "RegCloseKey failed: got %d, expected 0\n", lr);
+
+ lr = RegDeleteKeyA(HKEY_CURRENT_USER, KEY_BASE);
+ ok(lr == ERROR_SUCCESS, "RegDeleteKeyA failed: got %d, expected 0\n", lr);
+}
+