Esme Povirk : mscoree: Implement GetTokenForVTableEntry.
Alexandre Julliard
julliard at winehq.org
Tue Oct 20 15:57:17 CDT 2020
Module: wine
Branch: master
Commit: d5711a8151a0c5ed370a0b73c720de8aec3e4fd2
URL: https://source.winehq.org/git/wine.git/?a=commit;h=d5711a8151a0c5ed370a0b73c720de8aec3e4fd2
Author: Esme Povirk <esme at codeweavers.com>
Date: Tue Oct 20 08:23:34 2020 -0500
mscoree: Implement GetTokenForVTableEntry.
Signed-off-by: Esme Povirk <esme at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mscoree/corruntimehost.c | 40 ++++++++++++++++++++++++++++++++++++++++
dlls/mscoree/mscoree.spec | 2 +-
2 files changed, 41 insertions(+), 1 deletion(-)
diff --git a/dlls/mscoree/corruntimehost.c b/dlls/mscoree/corruntimehost.c
index a5b378b9251..f50eb5a0cd7 100644
--- a/dlls/mscoree/corruntimehost.c
+++ b/dlls/mscoree/corruntimehost.c
@@ -56,6 +56,16 @@ struct DomainEntry
static HANDLE dll_fixup_heap; /* using a separate heap so we can have execute permission */
+static CRITICAL_SECTION fixup_list_cs;
+static CRITICAL_SECTION_DEBUG fixup_list_cs_debug =
+{
+ 0, 0, &fixup_list_cs,
+ { &fixup_list_cs_debug.ProcessLocksList,
+ &fixup_list_cs_debug.ProcessLocksList },
+ 0, 0, { (DWORD_PTR)(__FILE__ ": fixup_list_cs") }
+};
+static CRITICAL_SECTION fixup_list_cs = { &fixup_list_cs_debug, -1, 0, 0, 0, 0 };
+
static struct list dll_fixups;
WCHAR **private_path = NULL;
@@ -1222,6 +1232,34 @@ static const struct vtable_fixup_thunk thunk_template = {0};
#endif
+DWORD WINAPI GetTokenForVTableEntry(HINSTANCE hinst, BYTE **ppVTEntry)
+{
+ struct dll_fixup *fixup;
+ DWORD result = 0;
+ DWORD rva;
+ int i;
+
+ TRACE("%p,%p\n", hinst, ppVTEntry);
+
+ rva = (BYTE*)ppVTEntry - (BYTE*)hinst;
+
+ EnterCriticalSection(&fixup_list_cs);
+ LIST_FOR_EACH_ENTRY(fixup, &dll_fixups, struct dll_fixup, entry)
+ {
+ if (fixup->dll != hinst)
+ continue;
+ if (rva < fixup->fixup->rva || (rva - fixup->fixup->rva >= fixup->fixup->count * sizeof(ULONG_PTR)))
+ continue;
+ i = (rva - fixup->fixup->rva) / sizeof(ULONG_PTR);
+ result = ((ULONG_PTR*)fixup->tokens)[i];
+ break;
+ }
+ LeaveCriticalSection(&fixup_list_cs);
+
+ TRACE("<-- %x\n", result);
+ return result;
+}
+
static void CDECL ReallyFixupVTable(struct dll_fixup *fixup)
{
HRESULT hr=S_OK;
@@ -1356,7 +1394,9 @@ static void FixupVTableEntry(HMODULE hmodule, VTableFixup *vtable_fixup)
return;
}
+ EnterCriticalSection(&fixup_list_cs);
list_add_tail(&dll_fixups, &fixup->entry);
+ LeaveCriticalSection(&fixup_list_cs);
}
static void FixupVTable_Assembly(HMODULE hmodule, ASSEMBLY *assembly)
diff --git a/dlls/mscoree/mscoree.spec b/dlls/mscoree/mscoree.spec
index 7fa68bf8b13..92dcfd89677 100644
--- a/dlls/mscoree/mscoree.spec
+++ b/dlls/mscoree/mscoree.spec
@@ -64,7 +64,7 @@
@ stub GetRequestedRuntimeVersionForCLSID
@ stub GetStartupFlags
@ stub GetTargetForVTableEntry
-@ stub GetTokenForVTableEntry
+@ stdcall GetTokenForVTableEntry(ptr ptr)
@ stdcall GetVersionFromProcess(ptr ptr long ptr)
@ stub GetXMLElement
@ stub GetXMLElementAttribute
More information about the wine-cvs
mailing list