diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index 308a596c3cb..228cb94e9c6 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -1971,21 +1971,6 @@ void WINAPI LdrInitializeThunk( HANDLE main_file, ULONG unknown2, ULONG unknown3 if (main_file) NtClose( main_file ); /* we no longer need it */ - if (TRACE_ON(relay) || TRACE_ON(snoop)) - { - RELAY_InitDebugLists(); - - if (TRACE_ON(relay)) /* setup relay for already loaded dlls */ - { - LIST_ENTRY *entry, *mark = &peb->LdrData->InLoadOrderModuleList; - for (entry = mark->Flink; entry != mark; entry = entry->Flink) - { - LDR_MODULE *mod = CONTAINING_RECORD(entry, LDR_MODULE, InLoadOrderModuleList); - if (mod->Flags & LDR_WINE_INTERNAL) RELAY_SetupDLL( mod->BaseAddress ); - } - } - } - RtlEnterCriticalSection( &loader_section ); load_path = NtCurrentTeb()->Peb->ProcessParameters->DllPath.Buffer; diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h index 5696bad05aa..99b59cbb1f3 100644 --- a/dlls/ntdll/ntdll_misc.h +++ b/dlls/ntdll/ntdll_misc.h @@ -59,7 +59,6 @@ extern void DECLSPEC_NORETURN server_protocol_perror( const char *err ); extern void DECLSPEC_NORETURN server_abort_thread( int status ); /* module handling */ -extern void RELAY_InitDebugLists(void); extern FARPROC RELAY_GetProcAddress( HMODULE module, const IMAGE_EXPORT_DIRECTORY *exports, DWORD exp_size, FARPROC proc, const WCHAR *user ); extern FARPROC SNOOP_GetProcAddress( HMODULE hmod, const IMAGE_EXPORT_DIRECTORY *exports, DWORD exp_size, diff --git a/dlls/ntdll/relay.c b/dlls/ntdll/relay.c index 8c2cad010bb..dcf9b29a091 100644 --- a/dlls/ntdll/relay.c +++ b/dlls/ntdll/relay.c @@ -39,6 +39,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(relay); WINE_DECLARE_DEBUG_CHANNEL(snoop); WINE_DECLARE_DEBUG_CHANNEL(seh); +#ifdef __i386__ + static const WCHAR **debug_relay_excludelist; static const WCHAR **debug_relay_includelist; static const WCHAR **debug_snoop_excludelist; @@ -48,6 +50,8 @@ static const WCHAR **debug_from_relay_includelist; static const WCHAR **debug_from_snoop_excludelist; static const WCHAR **debug_from_snoop_includelist; +static BOOL init_done; + /* compare an ASCII and a Unicode string without depending on the current codepage */ inline static int strcmpAW( const char *strA, const WCHAR *strW ) { @@ -102,11 +106,11 @@ static const WCHAR **build_list( const WCHAR *buffer ) /*********************************************************************** - * RELAY_InitDebugLists + * init_debug_lists * * Build the relay include/exclude function lists. */ -void RELAY_InitDebugLists(void) +static void init_debug_lists(void) { OBJECT_ATTRIBUTES attr; UNICODE_STRING name; @@ -126,6 +130,9 @@ void RELAY_InitDebugLists(void) static const WCHAR SnoopFromIncludeW[] = {'S','n','o','o','p','F','r','o','m','I','n','c','l','u','d','e',0}; static const WCHAR SnoopFromExcludeW[] = {'S','n','o','o','p','F','r','o','m','E','x','c','l','u','d','e',0}; + if (init_done) return; + init_done = TRUE; + RtlOpenCurrentUser( KEY_ALL_ACCESS, &root ); attr.Length = sizeof(attr); attr.RootDirectory = root; @@ -201,8 +208,6 @@ void RELAY_InitDebugLists(void) } -#ifdef __i386__ - #include "pshpack1.h" typedef struct @@ -768,6 +773,8 @@ void RELAY_SetupDLL( HMODULE module ) char *p, dllname[80]; DWORD size; + if (!init_done) init_debug_lists(); + exports = RtlImageDirectoryEntryToData( module, TRUE, IMAGE_DIRECTORY_ENTRY_EXPORT, &size ); if (!exports) return; debug = (DEBUG_ENTRY_POINT *)((char *)exports + size); @@ -833,6 +840,8 @@ void SNOOP_SetupDLL(HMODULE hmod) SIZE_T size; IMAGE_EXPORT_DIRECTORY *exports; + if (!init_done) init_debug_lists(); + exports = RtlImageDirectoryEntryToData( hmod, TRUE, IMAGE_DIRECTORY_ENTRY_EXPORT, &size ); if (!exports) return; name = (char *)hmod + exports->Name;