Alexandre Julliard : kernel32/tests: Add test for loading a dll under different names.

Alexandre Julliard julliard at winehq.org
Tue Feb 27 17:29:34 CST 2018


Module: wine
Branch: master
Commit: bab3a3d59d674be6a1cf66b27fff4a287c12c075
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=bab3a3d59d674be6a1cf66b27fff4a287c12c075

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Feb 27 18:20:41 2018 +0100

kernel32/tests: Add test for loading a dll under different names.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/kernel32/tests/loader.c | 89 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 89 insertions(+)

diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c
index 25d3bf5..484b602 100644
--- a/dlls/kernel32/tests/loader.c
+++ b/dlls/kernel32/tests/loader.c
@@ -1252,6 +1252,94 @@ static void test_Loader(void)
     section.Characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ;
 }
 
+static void test_filenames(void)
+{
+    IMAGE_NT_HEADERS nt_header = nt_header_template;
+    char dll_name[MAX_PATH], long_path[MAX_PATH], short_path[MAX_PATH], buffer[MAX_PATH];
+    HMODULE mod, mod2;
+    BOOL ret;
+
+    nt_header.FileHeader.NumberOfSections = 1;
+    nt_header.FileHeader.SizeOfOptionalHeader = sizeof(IMAGE_OPTIONAL_HEADER);
+
+    nt_header.OptionalHeader.SectionAlignment = page_size;
+    nt_header.OptionalHeader.DllCharacteristics = IMAGE_DLLCHARACTERISTICS_NX_COMPAT;
+    nt_header.OptionalHeader.FileAlignment = page_size;
+    nt_header.OptionalHeader.SizeOfHeaders = sizeof(dos_header) + sizeof(nt_header) + sizeof(IMAGE_SECTION_HEADER);
+    nt_header.OptionalHeader.SizeOfImage = sizeof(dos_header) + sizeof(nt_header) + sizeof(IMAGE_SECTION_HEADER) + page_size;
+
+    create_test_dll( &dos_header, sizeof(dos_header), &nt_header, dll_name );
+    strcpy( long_path, dll_name );
+    strcpy( strrchr( long_path, '\\' ), "\\this-is-a-long-name.dll" );
+    ret = MoveFileA( dll_name, long_path );
+    ok( ret, "MoveFileA failed err %u\n", GetLastError() );
+    GetShortPathNameA( long_path, short_path, MAX_PATH );
+
+    mod = LoadLibraryA( short_path );
+    ok( mod != NULL, "loading failed err %u\n", GetLastError() );
+    GetModuleFileNameA( mod, buffer, MAX_PATH );
+    ok( !lstrcmpiA( buffer, short_path ), "got wrong path %s / %s\n", buffer, short_path );
+    mod2 = GetModuleHandleA( short_path );
+    ok( mod == mod2, "wrong module %p for %s\n", mod2, short_path );
+    mod2 = GetModuleHandleA( long_path );
+    todo_wine
+    ok( mod == mod2, "wrong module %p for %s\n", mod2, long_path );
+    mod2 = LoadLibraryA( long_path );
+    ok( mod2 != NULL, "loading failed err %u\n", GetLastError() );
+    todo_wine
+    ok( mod == mod2, "library loaded twice\n" );
+    GetModuleFileNameA( mod2, buffer, MAX_PATH );
+    todo_wine
+    ok( !lstrcmpiA( buffer, short_path ), "got wrong path %s / %s\n", buffer, short_path );
+    FreeLibrary( mod2 );
+    FreeLibrary( mod );
+
+    mod = LoadLibraryA( long_path );
+    ok( mod != NULL, "loading failed err %u\n", GetLastError() );
+    GetModuleFileNameA( mod, buffer, MAX_PATH );
+    ok( !lstrcmpiA( buffer, long_path ), "got wrong path %s / %s\n", buffer, long_path );
+    mod2 = GetModuleHandleA( short_path );
+    todo_wine
+    ok( mod == mod2, "wrong module %p for %s\n", mod2, short_path );
+    mod2 = GetModuleHandleA( long_path );
+    ok( mod == mod2, "wrong module %p for %s\n", mod2, long_path );
+    mod2 = LoadLibraryA( short_path );
+    ok( mod2 != NULL, "loading failed err %u\n", GetLastError() );
+    todo_wine
+    ok( mod == mod2, "library loaded twice\n" );
+    GetModuleFileNameA( mod2, buffer, MAX_PATH );
+    todo_wine
+    ok( !lstrcmpiA( buffer, long_path ), "got wrong path %s / %s\n", buffer, long_path );
+    FreeLibrary( mod2 );
+    FreeLibrary( mod );
+
+    strcpy( dll_name, long_path );
+    strcpy( strrchr( dll_name, '\\' ), "\\this-is-another-name.dll" );
+    ret = CreateHardLinkA( dll_name, long_path, NULL );
+    ok( ret, "CreateHardLinkA failed err %u\n", GetLastError() );
+    if (ret)
+    {
+        mod = LoadLibraryA( dll_name );
+        ok( mod != NULL, "loading failed err %u\n", GetLastError() );
+        GetModuleFileNameA( mod, buffer, MAX_PATH );
+        ok( !lstrcmpiA( buffer, dll_name ), "got wrong path %s / %s\n", buffer, dll_name );
+        mod2 = GetModuleHandleA( long_path );
+        todo_wine
+        ok( mod == mod2, "wrong module %p for %s\n", mod2, long_path );
+        mod2 = LoadLibraryA( long_path );
+        ok( mod2 != NULL, "loading failed err %u\n", GetLastError() );
+        todo_wine
+        ok( mod == mod2, "library loaded twice\n" );
+        GetModuleFileNameA( mod2, buffer, MAX_PATH );
+        todo_wine
+        ok( !lstrcmpiA( buffer, dll_name ), "got wrong path %s / %s\n", buffer, short_path );
+        FreeLibrary( mod2 );
+        FreeLibrary( mod );
+        DeleteFileA( dll_name );
+    }
+    DeleteFileA( long_path );
+}
+
 /* Verify linking style of import descriptors */
 static void test_ImportDescriptors(void)
 {
@@ -3488,6 +3576,7 @@ START_TEST(loader)
     }
 
     test_Loader();
+    test_filenames();
     test_ResolveDelayLoadedAPI();
     test_ImportDescriptors();
     test_section_access();




More information about the wine-cvs mailing list