summaryrefslogtreecommitdiff
path: root/src/ToolBox/superpmi/superpmi/ieememorymanager.cpp
blob: b8d5f152af766b240f163470b33d1e219368d9c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
//
// 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 "spmiutil.h"
#include "ieememorymanager.h"

IEEMemoryManager* pIEEMM      = nullptr;
HANDLE            processHeap = INVALID_HANDLE_VALUE;

//***************************************************************************
// IUnknown methods
//***************************************************************************

HRESULT STDMETHODCALLTYPE MyIEEMM::QueryInterface(REFIID id, void** pInterface)
{
    DebugBreakorAV(133);
    return 0;
}
ULONG STDMETHODCALLTYPE MyIEEMM::AddRef()
{
    DebugBreakorAV(134);
    return 0;
}
ULONG STDMETHODCALLTYPE MyIEEMM::Release()
{
    DebugBreakorAV(135);
    return 0;
}

HANDLE virtHeap = INVALID_HANDLE_VALUE;

//***************************************************************************
// IEEMemoryManager methods for locking
//***************************************************************************
LPVOID STDMETHODCALLTYPE MyIEEMM::ClrVirtualAlloc(LPVOID lpAddress,
                                                  SIZE_T dwSize,
                                                  DWORD  flAllocationType,
                                                  DWORD  flProtect)
{
    if (virtHeap == INVALID_HANDLE_VALUE)
        virtHeap = HeapCreate(0, 0xFFFF, 0);
    if (virtHeap != INVALID_HANDLE_VALUE)
        return HeapAlloc(virtHeap, HEAP_ZERO_MEMORY, dwSize);
    return nullptr;
}
BOOL STDMETHODCALLTYPE MyIEEMM::ClrVirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType)
{
    return HeapFree(virtHeap, 0, lpAddress);
}
SIZE_T STDMETHODCALLTYPE MyIEEMM::ClrVirtualQuery(LPCVOID                   lpAddress,
                                                  PMEMORY_BASIC_INFORMATION lpBuffer,
                                                  SIZE_T                    dwLength)
{
    DebugBreakorAV(136);
    return 0;
}
BOOL STDMETHODCALLTYPE MyIEEMM::ClrVirtualProtect(LPVOID lpAddress,
                                                  SIZE_T dwSize,
                                                  DWORD  flNewProtect,
                                                  PDWORD lpflOldProtect)
{
    DebugBreakorAV(137);
    return 0;
}
HANDLE STDMETHODCALLTYPE MyIEEMM::ClrGetProcessHeap()
{
    DebugBreakorAV(138);
    return 0;
}
HANDLE STDMETHODCALLTYPE MyIEEMM::ClrHeapCreate(DWORD flOptions, SIZE_T dwInitialSize, SIZE_T dwMaximumSize)
{
    DebugBreakorAV(139);
    return 0;
}
BOOL STDMETHODCALLTYPE MyIEEMM::ClrHeapDestroy(HANDLE hHeap)
{
    DebugBreakorAV(140);
    return 0;
}
LPVOID STDMETHODCALLTYPE MyIEEMM::ClrHeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes)
{
    return HeapAlloc(hHeap, dwFlags, dwBytes);
}
BOOL STDMETHODCALLTYPE MyIEEMM::ClrHeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem)
{
    return HeapFree(hHeap, dwFlags, lpMem);
}
BOOL STDMETHODCALLTYPE MyIEEMM::ClrHeapValidate(HANDLE hHeap, DWORD dwFlags, LPCVOID lpMem)
{
    DebugBreakorAV(141);
    return 0;
}
HANDLE STDMETHODCALLTYPE MyIEEMM::ClrGetProcessExecutableHeap()
{
    if (processHeap == INVALID_HANDLE_VALUE)
    {
        DWORD flOptions = 0;
#ifndef FEATURE_PAL // TODO-Review: PAL doesn't have HEAP_CREATE_ENABLE_EXECUTE. Is this ok?
        flOptions = HEAP_CREATE_ENABLE_EXECUTE;
#endif // !FEATURE_PAL
        processHeap = HeapCreate(flOptions, 10000, 0);
    }
    return processHeap;
}

IEEMemoryManager* InitIEEMemoryManager(JitInstance* jitInstance)
{
    if (pIEEMM == nullptr)
    {
        MyIEEMM* ieemm     = new MyIEEMM();
        ieemm->jitInstance = jitInstance;
        pIEEMM             = ieemm;
    }
    return pIEEMM;
}