[PATCH v2 1/2] kernel32/tests: Add new test for passing NULL filename argument.
Carlos Rivera
carlos at superkaos.org
Sat Sep 5 15:11:22 CDT 2020
In Windows, when invoked with filename = NULL, these functions:
WritePrivateProfileStringW,
WritePrivateProfileSectionW,
GetPrivateProfileSectionNamesW,
GetPrivateProfileStringW
Behave as if filename is "win.ini". Then if a map to "win.ini" (and the section if applicable) exists
in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\IniFileMapping it gets used.
Since in a freshly installed Wine and Windows a map to "win.ini" exists this test only verifies
that default mapping behavior. It does not verify actual writting/reading to C:\windows\win.ini.
Signed-off-by: Carlos Rivera <carlos at superkaos.org>
---
v2: fixed broken tests, fixed the wording of the commit.
dlls/kernel32/tests/profile.c | 93 +++++++++++++++++++++++++++++++++++
1 file changed, 93 insertions(+)
diff --git a/dlls/kernel32/tests/profile.c b/dlls/kernel32/tests/profile.c
index f981558548..b7d239043b 100644
--- a/dlls/kernel32/tests/profile.c
+++ b/dlls/kernel32/tests/profile.c
@@ -1588,6 +1588,98 @@ static void test_registry_mapping(void)
ok(ret, "got error %u\n", GetLastError());
}
+static void test_null_filename(void)
+{
+ /* Some profile functions assume filename is win.ini if filename is passed as NULL
+ then if a map for win.ini exists in IniFileMapping they use it */
+
+ HKEY mapping_key, mapped_key;
+ char buffer[1024];
+ char* p;
+ int found = 0;
+ LSTATUS ret;
+
+ if (GetFileAttributesA("C:/windows/win.ini") != INVALID_FILE_ATTRIBUTES)
+ {
+ ret = MoveFileA("C:/windows/win.ini", "C:/windows/winini.bak");
+
+ if (!ret)
+ {
+ skip("Failed to move C:/windows/win.ini out of the way to prevent possibly destructive tests.\n");
+ return;
+ }
+ }
+
+ ret = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
+ "Software\\Microsoft\\Windows NT\\CurrentVersion\\IniFileMapping\\win.ini",
+ 0, KEY_READ | KEY_WRITE | KEY_WOW64_64KEY, &mapping_key);
+
+ if (ret)
+ {
+ skip("Failed to find a win.ini IniFileMapping registry entry\n");
+ return;
+ }
+
+ ret = RegSetValueExA(mapping_key, "section1", 0, REG_SZ, (BYTE *)"USR:section1_map", sizeof("USR:section1_map"));
+ ok(!ret, "got error %u\n", ret);
+ ret = WritePrivateProfileStringA(NULL, NULL, NULL, "win.ini");
+ todo_wine ok(ret, "got error %u\n", GetLastError());
+
+ ret = WritePrivateProfileStringA("section1", "name1", "42", NULL);
+ ok(ret, "got error %u\n", ret);
+
+ ret = DeleteFileA("C:/windows/win.ini");
+ ok(!ret, "expected failure\n");
+
+ ret = RegOpenKeyExA(HKEY_CURRENT_USER, "section1_map", 0, KEY_READ | KEY_WRITE, &mapped_key);
+ check_registry_value(mapped_key, "name1", "42");
+
+ check_profile_string("section1", "name1", NULL, "42");
+
+ memset(buffer, 0xc, sizeof(buffer));
+ ret = GetPrivateProfileSectionNamesA(buffer, sizeof(buffer), NULL);
+ ok(ret, "got error %u\n", ret);
+
+ if (ret)
+ {
+ p = buffer;
+ while (p < (buffer + sizeof(buffer) - 1))
+ {
+ int len = sizeof(buffer) - (p - buffer);
+
+ if (!strncmp("section1", p, len))
+ {
+ found = 1;
+ break;
+ }
+ while (*p++ && p < (buffer + sizeof(buffer) - 1));
+ }
+ }
+
+ ok(found,
+ "Expected \"section1\" in buffer, but buffer is %s\n",
+ debugstr_an(buffer, (ret + 2 >= sizeof(buffer) ? sizeof(buffer) : ret + 1)));
+
+ ret = WritePrivateProfileSectionA("section1", "name2=mango\0", NULL);
+ ok(ret, "got error %u\n", ret);
+
+ check_registry_value(mapped_key, "name2", "mango");
+
+ ret = DeleteFileA("C:/windows/win.ini");
+ ok(!ret, "expected failure\n");
+
+ MoveFileA("C:/windows/winini.bak", "C:/windows/win.ini");
+
+ ret = RegDeleteValueA(mapping_key, "section1");
+ ok(!ret, "got error %u\n", ret);
+
+ ret = RegDeleteKeyA(HKEY_CURRENT_USER, "section1_map");
+ ok(!ret, "got error %u\n", ret);
+
+ RegCloseKey(mapped_key);
+ RegCloseKey(mapping_key);
+};
+
START_TEST(profile)
{
test_profile_int();
@@ -1617,4 +1709,5 @@ START_TEST(profile)
test_WritePrivateProfileString();
test_profile_struct();
test_registry_mapping();
+ test_null_filename();
}
--
2.28.0
More information about the wine-devel
mailing list