[PATCH 2/2] mscoree: call native DllEntryPoint when it is defined in COR header.

Paul Gofman gofmanp at gmail.com
Tue Jan 26 16:57:31 CST 2016


Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
 dlls/mscoree/assembly.c        | 14 ++++++++++++++
 dlls/mscoree/corruntimehost.c  | 22 ++++++++++++++--------
 dlls/mscoree/mscoree_private.h |  3 +++
 include/winnt.h                |  1 +
 4 files changed, 32 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..1fd48b3 100644
--- a/dlls/mscoree/corruntimehost.c
+++ b/dlls/mscoree/corruntimehost.c
@@ -1254,18 +1254,24 @@ __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)
+            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