Alexandre Julliard : ntdll:
Added a DLL_WINE_PREATTACH call to DllMain for builtins.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Mar 21 13:21:12 CST 2006
Module: wine
Branch: refs/heads/master
Commit: c307f4990fe89b4a958efcc9107bf25aef6c01d0
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=c307f4990fe89b4a958efcc9107bf25aef6c01d0
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Mar 21 15:10:22 2006 +0100
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.
---
dlls/ntdll/loader.c | 16 +++++++++++++---
include/winnt.h | 4 +++-
2 files changed, 16 insertions(+), 4 deletions(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 967c298..88878c4 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -58,7 +58,9 @@ static const char * const reason_names[]
"PROCESS_DETACH",
"PROCESS_ATTACH",
"THREAD_ATTACH",
- "THREAD_DETACH"
+ "THREAD_DETACH",
+ NULL, NULL, NULL, NULL,
+ "WINE_PREATTACH"
};
static const WCHAR dllW[] = {'.','d','l','l',0};
@@ -1749,10 +1751,18 @@ static NTSTATUS load_dll( LPCWSTR load_p
case LO_BUILTIN_NATIVE:
case LO_DEFAULT: /* default is builtin,native */
nts = load_builtin_dll( load_path, filename, handle, flags, pwm );
- if (nts == STATUS_SUCCESS) break;
if (!handle) break; /* nothing else we can try */
/* 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)
nts = load_native_dll( load_path, filename, handle, flags, pwm );
break;
diff --git a/include/winnt.h b/include/winnt.h
index 199383b..053f014 100644
--- a/include/winnt.h
+++ b/include/winnt.h
@@ -469,7 +469,9 @@ typedef DWORD FLONG;
#define DLL_PROCESS_ATTACH 1 /* attach process (load library) */
#define DLL_THREAD_ATTACH 2 /* attach new 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) */
#define PROCESSOR_ARCHITECTURE_INTEL 0
More information about the wine-cvs
mailing list