From: Jinoh Kang jinoh.kang.kr@gmail.com
--- dlls/kernel32/tests/loader.c | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-)
diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c index 2c7cc784be4..c7872bd3522 100644 --- a/dlls/kernel32/tests/loader.c +++ b/dlls/kernel32/tests/loader.c @@ -2669,7 +2669,8 @@ static HANDLE gen_forward_chain_testdll( char testdll_path[MAX_PATH],
static void subtest_export_forwarder_dep_chain( size_t num_chained_export_modules, size_t exporter_index, - BOOL test_static_import ) + BOOL test_static_import, + ULONG first_module_load_flags ) { size_t num_modules = num_chained_export_modules + !!test_static_import; size_t importer_index = test_static_import ? num_modules - 1 : 0; @@ -2711,7 +2712,7 @@ static void subtest_export_forwarder_dep_chain( size_t num_chained_export_module ok( !GetModuleHandleA( temp_paths[i] ), "%s already loaded\n", wine_dbgstr_a( temp_paths[i] ) );
- modules[i] = LoadLibraryA( temp_paths[i] ); + modules[i] = LoadLibraryExA( temp_paths[i], 0, i == 0 ? first_module_load_flags : 0 ); ok( !!modules[i], "LoadLibraryA(temp_paths[%Iu] = %s) err=%lu\n", i, wine_dbgstr_a( temp_paths[i] ), GetLastError() );
@@ -2765,6 +2766,17 @@ static void subtest_export_forwarder_dep_chain( size_t num_chained_export_module ultimate_depender_index = max( ultimate_depender_index, exporter_index ); }
+ if (first_module_load_flags & DONT_RESOLVE_DLL_REFERENCES) + { + LDR_DATA_TABLE_ENTRY *mod; + NTSTATUS status; + + status = LdrFindEntryForAddress( modules[0], &mod ); + ok( !status, "LdrFindEntryForAddress returned %#lx", status ); + todo_wine_if(importer_index == 1) + ok( !(mod->Flags & LDR_PROCESS_ATTACHED), "expected LDR_PROCESS_ATTACHED to be unset (Flags=%#lx)\n", mod->Flags ); + } + if (winetest_debug > 1) trace( "Unreference modules except the ultimate dependant DLL\n" );
@@ -2828,23 +2840,31 @@ static void test_export_forwarder_dep_chain(void) { winetest_push_context( "no import" ); /* export forwarder does not introduce a dependency on its own */ - subtest_export_forwarder_dep_chain( 2, 0, FALSE ); + subtest_export_forwarder_dep_chain( 2, 0, FALSE, 0 ); winetest_pop_context();
winetest_push_context( "static import of export forwarder" ); - subtest_export_forwarder_dep_chain( 2, 0, TRUE ); + subtest_export_forwarder_dep_chain( 2, 0, TRUE, 0 ); winetest_pop_context();
winetest_push_context( "static import of chained export forwarder" ); - subtest_export_forwarder_dep_chain( 3, 0, TRUE ); + subtest_export_forwarder_dep_chain( 3, 0, TRUE, 0 ); winetest_pop_context();
winetest_push_context( "dynamic import of export forwarder" ); - subtest_export_forwarder_dep_chain( 2, 1, FALSE ); + subtest_export_forwarder_dep_chain( 2, 1, FALSE, 0 ); winetest_pop_context();
winetest_push_context( "dynamic import of chained export forwarder" ); - subtest_export_forwarder_dep_chain( 3, 2, FALSE ); + subtest_export_forwarder_dep_chain( 3, 2, FALSE, 0 ); + winetest_pop_context(); + + winetest_push_context( "static import of dll already loaded with DONT_RESOLVE_DLL_REFERENCES" ); + subtest_export_forwarder_dep_chain( 1, 0, TRUE, DONT_RESOLVE_DLL_REFERENCES ); + winetest_pop_context(); + + winetest_push_context( "dynamic import of dll already loaded with DONT_RESOLVE_DLL_REFERENCES" ); + subtest_export_forwarder_dep_chain( 2, 1, FALSE, DONT_RESOLVE_DLL_REFERENCES ); winetest_pop_context(); }