Commit c307f499 authored by Alexandre Julliard's avatar Alexandre Julliard

ntdll: Added a DLL_WINE_PREATTACH call to DllMain for builtins.

By returning FALSE from this call, a builtin dll can specify that we should try to load the native one instead.
parent 8b3e4268
...@@ -58,7 +58,9 @@ static const char * const reason_names[] = ...@@ -58,7 +58,9 @@ static const char * const reason_names[] =
"PROCESS_DETACH", "PROCESS_DETACH",
"PROCESS_ATTACH", "PROCESS_ATTACH",
"THREAD_ATTACH", "THREAD_ATTACH",
"THREAD_DETACH" "THREAD_DETACH",
NULL, NULL, NULL, NULL,
"WINE_PREATTACH"
}; };
static const WCHAR dllW[] = {'.','d','l','l',0}; static const WCHAR dllW[] = {'.','d','l','l',0};
...@@ -1749,10 +1751,18 @@ static NTSTATUS load_dll( LPCWSTR load_path, LPCWSTR libname, DWORD flags, WINE_ ...@@ -1749,10 +1751,18 @@ static NTSTATUS load_dll( LPCWSTR load_path, LPCWSTR libname, DWORD flags, WINE_
case LO_BUILTIN_NATIVE: case LO_BUILTIN_NATIVE:
case LO_DEFAULT: /* default is builtin,native */ case LO_DEFAULT: /* default is builtin,native */
nts = load_builtin_dll( load_path, filename, handle, flags, pwm ); nts = load_builtin_dll( load_path, filename, handle, flags, pwm );
if (nts == STATUS_SUCCESS) break;
if (!handle) break; /* nothing else we can try */ if (!handle) break; /* nothing else we can try */
/* file is not a builtin library, try without using the specified file */ /* file is not a builtin library, try without using the specified file */
nts = load_builtin_dll( load_path, filename, 0, flags, pwm ); if (nts != STATUS_SUCCESS)
nts = load_builtin_dll( load_path, filename, 0, flags, pwm );
if (nts == STATUS_SUCCESS && loadorder == LO_DEFAULT &&
!MODULE_InitDLL( *pwm, DLL_WINE_PREATTACH, NULL ))
{
/* stub-only dll, try native */
TRACE( "%s pre-attach returned FALSE, preferring native\n", debugstr_w(filename) );
LdrUnloadDll( (*pwm)->ldr.BaseAddress );
nts = STATUS_DLL_NOT_FOUND;
}
if (nts == STATUS_DLL_NOT_FOUND && loadorder != LO_BUILTIN) if (nts == STATUS_DLL_NOT_FOUND && loadorder != LO_BUILTIN)
nts = load_native_dll( load_path, filename, handle, flags, pwm ); nts = load_native_dll( load_path, filename, handle, flags, pwm );
break; break;
......
...@@ -469,7 +469,9 @@ typedef DWORD FLONG; ...@@ -469,7 +469,9 @@ typedef DWORD FLONG;
#define DLL_PROCESS_ATTACH 1 /* attach process (load library) */ #define DLL_PROCESS_ATTACH 1 /* attach process (load library) */
#define DLL_THREAD_ATTACH 2 /* attach new thread */ #define DLL_THREAD_ATTACH 2 /* attach new thread */
#define DLL_THREAD_DETACH 3 /* detach thread */ #define DLL_THREAD_DETACH 3 /* detach thread */
#ifdef __WINESRC__
#define DLL_WINE_PREATTACH 8 /* called before process attach for Wine builtins */
#endif
/* u.x.wProcessorArchitecture (NT) */ /* u.x.wProcessorArchitecture (NT) */
#define PROCESSOR_ARCHITECTURE_INTEL 0 #define PROCESSOR_ARCHITECTURE_INTEL 0
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment