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
|
#include <stdint.h>
#include <stddef.h>
#include <string.h>
#include <stdbool.h>
#include <search.h>
#include <stdlib.h>
#include <assert.h>
#include <malloc.h>
#include "winnt_types.h"
#include "pe_linker.h"
#include "ntoskernel.h"
#include "log.h"
#include "winexports.h"
#include "util.h"
#define HEAP_ZERO_MEMORY 8
STATIC HANDLE WINAPI GetProcessHeap(void)
{
return (HANDLE) 'HEAP';
}
STATIC HANDLE WINAPI HeapCreate(DWORD flOptions, SIZE_T dwInitialSize, SIZE_T dwMaximumSize)
{
DebugLog("%#x, %u, %u", flOptions, dwInitialSize, dwMaximumSize);
return (HANDLE) 'HEAP';
}
STATIC PVOID WINAPI HeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes)
{
PVOID Buffer;
// DebugLog("%p, %#x, %u", hHeap, dwFlags, dwBytes);
if (dwFlags & HEAP_ZERO_MEMORY) {
Buffer = calloc(dwBytes, 1);
} else {
Buffer = malloc(dwBytes);
}
return Buffer;
}
STATIC BOOL WINAPI HeapFree(HANDLE hHeap, DWORD dwFlags, PVOID lpMem)
{
// DebugLog("%p, %#x, %p", hHeap, dwFlags, lpMem);
free(lpMem);
return TRUE;
}
STATIC SIZE_T WINAPI HeapSize(HANDLE hHeap, DWORD dwFlags, PVOID lpMem)
{
return malloc_usable_size(lpMem);
}
STATIC PVOID WINAPI HeapReAlloc(HANDLE hHeap, DWORD dwFlags, PVOID lpMem, SIZE_T dwBytes)
{
return realloc(lpMem, dwBytes);
}
STATIC PVOID WINAPI LocalAlloc(UINT uFlags, SIZE_T uBytes)
{
PVOID Buffer = malloc(uBytes);
assert(uFlags == 0);
DebugLog("%#x, %u => %p", uFlags, uBytes, Buffer);
return Buffer;
}
STATIC PVOID WINAPI LocalFree(PVOID hMem)
{
DebugLog("%p", hMem);
free(hMem);
return NULL;
}
STATIC PVOID WINAPI RtlCreateHeap(ULONG Flags,
PVOID HeapBase,
SIZE_T ReserveSize,
SIZE_T CommitSize,
PVOID Lock,
PVOID Parameters)
{
DebugLog("%#x, %p, %#x, %#x, %p, %p",
Flags,
HeapBase,
ReserveSize,
CommitSize,
Lock,
Parameters);
return (HANDLE) 'HEAP';
}
STATIC PVOID WINAPI RtlAllocateHeap(PVOID HeapHandle,
ULONG Flags,
SIZE_T Size)
{
DebugLog("%p, %#x, %u", HeapHandle, Flags, Size);
return malloc(Size);
}
DECLARE_CRT_EXPORT("HeapCreate", HeapCreate);
DECLARE_CRT_EXPORT("GetProcessHeap", GetProcessHeap);
DECLARE_CRT_EXPORT("HeapAlloc", HeapAlloc);
DECLARE_CRT_EXPORT("HeapFree", HeapFree);
DECLARE_CRT_EXPORT("HeapSize", HeapSize);
DECLARE_CRT_EXPORT("HeapReAlloc", HeapReAlloc);
DECLARE_CRT_EXPORT("LocalAlloc", LocalAlloc);
DECLARE_CRT_EXPORT("LocalFree", LocalFree);
DECLARE_CRT_EXPORT("RtlCreateHeap", RtlCreateHeap);
DECLARE_CRT_EXPORT("RtlAllocateHeap", RtlAllocateHeap);
|