Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / mini / mini-windows-dlldac.c
1 #include <config.h>
2
3 #ifdef HOST_WIN32
4 #include <winsock2.h>
5 #include <windows.h>
6 #include <winnt.h>
7
8 #if defined(TARGET_AMD64) && !defined(DISABLE_JIT)
9 #include "mono/mini/mini.h"
10 #include "mono/mini/mini-amd64.h"
11 #include "mono/utils/mono-publib.h"
12
13 typedef enum _FUNCTION_TABLE_TYPE {
14     RF_SORTED,
15     RF_UNSORTED,
16     RF_CALLBACK
17 } FUNCTION_TABLE_TYPE;
18
19 typedef struct _DYNAMIC_FUNCTION_TABLE {
20     LIST_ENTRY Links;
21     PRUNTIME_FUNCTION FunctionTable;
22     LARGE_INTEGER TimeStamp;
23     ULONG64 MinimumAddress;
24     ULONG64 MaximumAddress;
25     ULONG64 BaseAddress;
26     PGET_RUNTIME_FUNCTION_CALLBACK Callback;
27     PVOID Context;
28     PWSTR OutOfProcessCallbackDll;
29     FUNCTION_TABLE_TYPE Type;
30     ULONG EntryCount;
31 } DYNAMIC_FUNCTION_TABLE, *PDYNAMIC_FUNCTION_TABLE;
32
33 typedef BOOL (ReadMemoryFunction)(PVOID user_context, LPCVOID base_address, PVOID buffer, SIZE_T size, SIZE_T *read);
34
35 BOOL
36 read_memory(PVOID user_context, LPCVOID base_address, PVOID buffer, SIZE_T size, SIZE_T* read)
37 {
38     return ReadProcessMemory ((HANDLE)user_context, base_address, buffer, size, read);
39 }
40
41 MONO_API_EXPORT DWORD
42 OutOfProcessFunctionTableCallbackEx (ReadMemoryFunction read_memory, PVOID user_context, PVOID table_address, PDWORD entries, PRUNTIME_FUNCTION *functions)
43 {
44         DYNAMIC_FUNCTION_TABLE func_table = { 0 };
45         DynamicFunctionTableEntry func_table_entry = { 0 };
46         PRUNTIME_FUNCTION rt_funcs = NULL;
47         size_t reads = 0;
48         DWORD result = 0xC0000001;
49
50         if (read_memory (user_context, table_address, &func_table, sizeof (func_table), &reads)) {
51                 if (func_table.Context != NULL && read_memory (user_context, func_table.Context, &func_table_entry, sizeof (func_table_entry), &reads)) {
52                         if (func_table_entry.rt_funcs_current_count != 0) {
53                                 rt_funcs = HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, func_table_entry.rt_funcs_current_count * sizeof (RUNTIME_FUNCTION));
54                                 if (rt_funcs) {
55                                         if (read_memory (user_context, func_table_entry.rt_funcs, rt_funcs, func_table_entry.rt_funcs_current_count * sizeof (RUNTIME_FUNCTION), &reads)) {
56                                                 *entries = func_table_entry.rt_funcs_current_count;
57                                                 *functions = rt_funcs;
58                                                 result = 0x00000000;
59                                         }
60                                 }
61                         }
62                 }
63         }
64
65         return result;
66 }
67
68 MONO_API_EXPORT DWORD
69 OutOfProcessFunctionTableCallback (HANDLE process, PVOID table_address, PDWORD entries, PRUNTIME_FUNCTION *functions)
70 {
71         return OutOfProcessFunctionTableCallbackEx (&read_memory, process, table_address, entries, functions);
72 }
73 #endif /* defined(TARGET_AMD64) && !defined(DISABLE_JIT) */
74
75 #ifdef _MSC_VER
76 BOOL APIENTRY
77 DllMain (HMODULE module_handle, DWORD reason, LPVOID reserved)
78 {
79         return TRUE;
80 }
81 #endif
82
83 #else
84
85 MONO_EMPTY_SOURCE_FILE (mini_windows_dlldac);
86 #endif /* HOST_WIN32 */