[PATCH v4 1/2] kernel32: add tests for LdrGetDllPath with LOAD_WITH_ALTERED_SEARCH_PATH

Nick Fox nick at foxsec.net
Thu Oct 14 15:09:20 CDT 2021


Add tests for various paths and undefined behavior with regards to LdrGetDllPath
with LOAD_ALTERED_SEARCH_PATH and relative module names.

Signed-off-by: Nick Fox <nick at foxsec.net>
---
v4: add another test case and fix todo_wine usage
---
 dlls/kernel32/tests/path.c | 101 +++++++++++++++++++++++++++++++++++++
 1 file changed, 101 insertions(+)

diff --git a/dlls/kernel32/tests/path.c b/dlls/kernel32/tests/path.c
index f49af6d5bfe..b2a6d5acbda 100644
--- a/dlls/kernel32/tests/path.c
+++ b/dlls/kernel32/tests/path.c
@@ -2654,6 +2654,107 @@ static void test_LdrGetDllPath(void)
     ok( !lstrcmpW( path, L"\\\\?\\c:" ), "got %s expected \\\\?\\c:\n", wine_dbgstr_w(path));
     pRtlReleasePath( path );

+    lstrcpyW( buffer, fooW );
+    ret = pLdrGetDllPath( buffer, LOAD_WITH_ALTERED_SEARCH_PATH, &path, &unknown_ptr );
+    ok( !ret, "LdrGetDllPath failed %x\n", ret );
+    ok( !unknown_ptr, "unknown ptr %p\n", unknown_ptr );
+    build_search_path( buffer, ARRAY_SIZE(buffer), NULL, TRUE );
+    todo_wine
+    ok( path_equal( path, buffer ), "got %s expected %s\n", wine_dbgstr_w(path), wine_dbgstr_w(buffer));
+    pRtlReleasePath( path );
+
+    lstrcpyW( buffer, L"temp" );
+    p = buffer + lstrlenW( buffer );
+    *p++ = '/';
+    lstrcpyW( p, fooW );
+    ret = pLdrGetDllPath( buffer, LOAD_WITH_ALTERED_SEARCH_PATH, &path, &unknown_ptr );
+    ok( !ret, "LdrGetDllPath failed %x\n", ret );
+    ok( !unknown_ptr, "unknown ptr %p\n", unknown_ptr );
+    build_search_path( buffer, ARRAY_SIZE(buffer), NULL, TRUE );
+    todo_wine
+    ok( path_equal( path, buffer ), "got %s expected %s\n", wine_dbgstr_w(path), wine_dbgstr_w(buffer));
+    pRtlReleasePath( path );
+
+    lstrcpyW( buffer, L".\\foo\\foooo" );
+    ret = pLdrGetDllPath( buffer, LOAD_WITH_ALTERED_SEARCH_PATH, &path, &unknown_ptr );
+    ok( !ret, "LdrGetDllPath failed %x\n", ret );
+    ok( !unknown_ptr, "unknown ptr %p\n", unknown_ptr );
+    lstrcpyW( buffer, L".\\foo" );
+    p = buffer + lstrlenW( buffer );
+    *p++ = ';';
+    GetSystemDirectoryW( p, buffer + ARRAY_SIZE(buffer) - p );
+    p = buffer + lstrlenW(buffer);
+    *p++ = ';';
+    GetSystemDirectoryW( p, buffer + ARRAY_SIZE(buffer) - p );
+    p = buffer + lstrlenW(buffer) - 2;  /* remove "32" */
+    *p++ = ';';
+    GetWindowsDirectoryW( p, buffer + ARRAY_SIZE(buffer) - p );
+    p = buffer + lstrlenW(buffer);
+    *p++ = ';';
+    *p++ = '.';
+    *p++ = ';';
+    GetEnvironmentVariableW( pathW, p, buffer + ARRAY_SIZE(buffer) - p );
+    ok( path_equal( path, buffer ), "got %s expected %s\n", wine_dbgstr_w(path), wine_dbgstr_w(buffer));
+    pRtlReleasePath( path );
+
+    lstrcpyW( buffer, L"temp" );
+    p = buffer + lstrlenW( buffer );
+    *p++ = '\\';
+    lstrcpyW( p, fooW );
+    ret = pLdrGetDllPath( buffer, LOAD_WITH_ALTERED_SEARCH_PATH, &path, &unknown_ptr );
+    ok( !ret, "LdrGetDllPath failed %x\n", ret );
+    ok( !unknown_ptr, "unknown ptr %p\n", unknown_ptr );
+    lstrcpyW( buffer, L"temp" );
+    p = buffer + lstrlenW( buffer );
+    *p++ = '\\';
+    *p++ = ';';
+    GetSystemDirectoryW( p, buffer + ARRAY_SIZE(buffer) - p );
+    p = buffer + lstrlenW(buffer);
+    *p++ = ';';
+    GetSystemDirectoryW( p, buffer + ARRAY_SIZE(buffer) - p );
+    p = buffer + lstrlenW(buffer) - 2;  /* remove "32" */
+    *p++ = ';';
+    GetWindowsDirectoryW( p, buffer + ARRAY_SIZE(buffer) - p );
+    p = buffer + lstrlenW(buffer);
+    *p++ = ';';
+    *p++ = '.';
+    *p++ = ';';
+    GetEnvironmentVariableW( pathW, p, buffer + ARRAY_SIZE(buffer) - p );
+    ok( path_equal( path, buffer ), "got %s expected %s\n", wine_dbgstr_w(path), wine_dbgstr_w(buffer));
+    pRtlReleasePath( path );
+
+    lstrcpyW( buffer, L"c:\\temp" );
+    p = buffer + lstrlenW(buffer);
+    *p++ = '\\';
+    lstrcpyW( p, fooW );
+    ret = pLdrGetDllPath( buffer, LOAD_WITH_ALTERED_SEARCH_PATH, &path, &unknown_ptr );
+    ok( !ret, "LdrGetDllPath failed %x\n", ret );
+    ok( !unknown_ptr, "unknown ptr %p\n", unknown_ptr );
+    lstrcpyW( buffer, L"c:\\temp" );
+    p = buffer + lstrlenW( buffer );
+    *p++ = '\\';
+    *p++ = ';';
+    GetSystemDirectoryW( p, buffer + ARRAY_SIZE(buffer) - p );
+    p = buffer + lstrlenW(buffer);
+    *p++ = ';';
+    GetSystemDirectoryW( p, buffer + ARRAY_SIZE(buffer) - p );
+    p = buffer + lstrlenW(buffer) - 2;  /* remove "32" */
+    *p++ = ';';
+    GetWindowsDirectoryW( p, buffer + ARRAY_SIZE(buffer) - p );
+    p = buffer + lstrlenW(buffer);
+    *p++ = ';';
+    *p++ = '.';
+    *p++ = ';';
+    GetEnvironmentVariableW( pathW, p, buffer + ARRAY_SIZE(buffer) - p );
+    ok( path_equal( path, buffer ), "got %s expected %s\n", wine_dbgstr_w(path), wine_dbgstr_w(buffer));
+    pRtlReleasePath( path );
+
+    lstrcpyW( buffer, fooW );
+    ret = pLdrGetDllPath( buffer, LOAD_WITH_ALTERED_SEARCH_PATH | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR, &path, &unknown_ptr );
+    ok( ret == STATUS_INVALID_PARAMETER, "got %x expected %x\n", ret, STATUS_INVALID_PARAMETER );
+    ok( !unknown_ptr, "unknown ptr %p\n", unknown_ptr );
+    pRtlReleasePath( path );
+
     lstrcpyW( buffer, dlldir );
     p = buffer + lstrlenW(buffer);
     *p++ = '\\';
--
2.33.0





More information about the wine-devel mailing list