[v2 2/2] mscoree: call native DllEntryPoint when it is defined in COR header.
Paul Gofman
gofmanp at gmail.com
Fri Jan 29 19:36:49 CST 2016
Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
dlls/mscoree/assembly.c | 14 ++++++++++++++
dlls/mscoree/corruntimehost.c | 29 +++++++++++++++++++++--------
dlls/mscoree/mscoree_private.h | 3 +++
include/winnt.h | 1 +
4 files changed, 39 insertions(+), 8 deletions(-)
diff --git a/dlls/mscoree/assembly.c b/dlls/mscoree/assembly.c
index 7cfc359..4af6f28 100644
--- a/dlls/mscoree/assembly.c
+++ b/dlls/mscoree/assembly.c
@@ -314,3 +314,17 @@ HRESULT assembly_get_vtable_fixups(ASSEMBLY *assembly, VTableFixup **fixups, DWO
return S_OK;
}
+
+HRESULT assembly_get_native_entrypoint(ASSEMBLY *assembly, NativeEntryPointFunc *func)
+{
+ if (assembly->corhdr->Flags & COMIMAGE_FLAGS_NATIVE_ENTRYPOINT)
+ {
+ *func = assembly_rva_to_va(assembly, assembly->corhdr->EntryPointRVA);
+ return S_OK;
+ }
+ else
+ {
+ *func = NULL;
+ return S_FALSE;
+ }
+}
diff --git a/dlls/mscoree/corruntimehost.c b/dlls/mscoree/corruntimehost.c
index 7998da9..8c03875 100644
--- a/dlls/mscoree/corruntimehost.c
+++ b/dlls/mscoree/corruntimehost.c
@@ -1254,18 +1254,31 @@ __int32 WINAPI _CorExeMain(void)
BOOL WINAPI _CorDllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
+ ASSEMBLY *assembly=NULL;
+ HRESULT hr;
+
TRACE("(%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved);
- switch (fdwReason)
+ hr = assembly_from_hmodule(&assembly, hinstDLL);
+ if (SUCCEEDED(hr))
{
- case DLL_PROCESS_ATTACH:
- DisableThreadLibraryCalls(hinstDLL);
- FixupVTable(hinstDLL);
- break;
- case DLL_PROCESS_DETACH:
- /* FIXME: clean up the vtables */
- break;
+ NativeEntryPointFunc NativeEntryPoint=NULL;
+
+ assembly_get_native_entrypoint(assembly, &NativeEntryPoint);
+ if (fdwReason == DLL_PROCESS_ATTACH)
+ {
+ if (!NativeEntryPoint)
+ DisableThreadLibraryCalls(hinstDLL);
+ FixupVTable_Assembly(hinstDLL,assembly);
+ }
+ assembly_release(assembly);
+ /* FIXME: clean up the vtables on DLL_PROCESS_DETACH */
+ if (NativeEntryPoint)
+ return NativeEntryPoint(hinstDLL, fdwReason, lpvReserved);
}
+ else
+ ERR("failed to read CLR headers, hr=%x\n", hr);
+
return TRUE;
}
diff --git a/dlls/mscoree/mscoree_private.h b/dlls/mscoree/mscoree_private.h
index 7843407..8226463 100644
--- a/dlls/mscoree/mscoree_private.h
+++ b/dlls/mscoree/mscoree_private.h
@@ -36,11 +36,14 @@ typedef struct _VTableFixup {
typedef struct tagASSEMBLY ASSEMBLY;
+typedef BOOL (WINAPI *NativeEntryPointFunc)(HINSTANCE, DWORD, LPVOID);
+
extern HRESULT assembly_create(ASSEMBLY **out, LPCWSTR file) DECLSPEC_HIDDEN;
extern HRESULT assembly_from_hmodule(ASSEMBLY **out, HMODULE hmodule) DECLSPEC_HIDDEN;
extern HRESULT assembly_release(ASSEMBLY *assembly) DECLSPEC_HIDDEN;
extern HRESULT assembly_get_runtime_version(ASSEMBLY *assembly, LPSTR *version) DECLSPEC_HIDDEN;
extern HRESULT assembly_get_vtable_fixups(ASSEMBLY *assembly, VTableFixup **fixups, DWORD *count) DECLSPEC_HIDDEN;
+extern HRESULT assembly_get_native_entrypoint(ASSEMBLY *assembly, NativeEntryPointFunc *func) DECLSPEC_HIDDEN;
/* Mono embedding */
typedef struct _MonoDomain MonoDomain;
diff --git a/include/winnt.h b/include/winnt.h
index c7874dd..2309ae3 100644
--- a/include/winnt.h
+++ b/include/winnt.h
@@ -3549,6 +3549,7 @@ typedef enum ReplacesCorHdrNumericDefines
COMIMAGE_FLAGS_32BITREQUIRED = 0x00000002,
COMIMAGE_FLAGS_IL_LIBRARY = 0x00000004,
COMIMAGE_FLAGS_STRONGNAMESIGNED = 0x00000008,
+ COMIMAGE_FLAGS_NATIVE_ENTRYPOINT= 0x00000010,
COMIMAGE_FLAGS_TRACKDEBUGDATA = 0x00010000,
COR_VERSION_MAJOR_V2 = 2,
--
2.5.0
More information about the wine-patches
mailing list