diff options
Diffstat (limited to 'src/ToolBox/superpmi/superpmi-shim-counter/coreclrcallbacks.cpp')
-rw-r--r-- | src/ToolBox/superpmi/superpmi-shim-counter/coreclrcallbacks.cpp | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/ToolBox/superpmi/superpmi-shim-counter/coreclrcallbacks.cpp b/src/ToolBox/superpmi/superpmi-shim-counter/coreclrcallbacks.cpp new file mode 100644 index 0000000000..5b764f2fa5 --- /dev/null +++ b/src/ToolBox/superpmi/superpmi-shim-counter/coreclrcallbacks.cpp @@ -0,0 +1,62 @@ +// +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +// + +#include "standardpch.h" +#include "coreclrcallbacks.h" +#include "iexecutionengine.h" + +typedef LPVOID (__stdcall * pfnEEHeapAllocInProcessHeap)(DWORD dwFlags, SIZE_T dwBytes); +typedef BOOL (__stdcall * pfnEEHeapFreeInProcessHeap)(DWORD dwFlags, LPVOID lpMem); + +CoreClrCallbacks *original_CoreClrCallbacks = nullptr; +pfnEEHeapAllocInProcessHeap original_EEHeapAllocInProcessHeap = nullptr; +pfnEEHeapFreeInProcessHeap original_EEHeapFreeInProcessHeap = nullptr; + +IExecutionEngine* STDMETHODCALLTYPE IEE_t() +{ + interceptor_IEE *iee = new interceptor_IEE(); + iee->original_IEE = original_CoreClrCallbacks->m_pfnIEE(); + return iee; +} + +/*#pragma warning( suppress :4996 ) //deprecated +HRESULT STDMETHODCALLTYPE GetCORSystemDirectory(LPWSTR pbuffer, DWORD cchBuffer, DWORD* pdwlength) +{ + DebugBreakorAV(131); + return 0; +} +*/ + +LPVOID STDMETHODCALLTYPE EEHeapAllocInProcessHeap (DWORD dwFlags, SIZE_T dwBytes) +{ + if(original_EEHeapAllocInProcessHeap == nullptr) + __debugbreak(); + return original_EEHeapAllocInProcessHeap(dwFlags, dwBytes); +} + +BOOL STDMETHODCALLTYPE EEHeapFreeInProcessHeap (DWORD dwFlags, LPVOID lpMem) +{ + if(original_EEHeapFreeInProcessHeap == nullptr) + __debugbreak(); + return original_EEHeapFreeInProcessHeap(dwFlags, lpMem); +} + +void* STDMETHODCALLTYPE GetCLRFunction(LPCSTR functionName) +{ + if(strcmp(functionName, "EEHeapAllocInProcessHeap")==0) + { + original_EEHeapAllocInProcessHeap = + (pfnEEHeapAllocInProcessHeap)original_CoreClrCallbacks->m_pfnGetCLRFunction("EEHeapAllocInProcessHeap"); + return (void*)EEHeapAllocInProcessHeap; + } + if(strcmp(functionName, "EEHeapFreeInProcessHeap")==0) + { + original_EEHeapFreeInProcessHeap = + (pfnEEHeapFreeInProcessHeap)original_CoreClrCallbacks->m_pfnGetCLRFunction("EEHeapFreeInProcessHeap"); + return (void*)EEHeapFreeInProcessHeap; + } + return original_CoreClrCallbacks->m_pfnGetCLRFunction(functionName); +} + |