-
Notifications
You must be signed in to change notification settings - Fork 72
Expand file tree
/
Copy pathmemory.h
More file actions
239 lines (179 loc) · 3.33 KB
/
Copy pathmemory.h
File metadata and controls
239 lines (179 loc) · 3.33 KB
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
/*
* Copyright (c) 2008 Arab Team 4 Reverse Engineering. All rights reserved.
*
* Module Name:
*
* memory.h
*
* Abstract:
*
* This module defines various routines used to manage memory such as read/write .
*
* Author:
*
* GamingMasteR
*
*/
#include "KeDetective.h"
#ifdef __cplusplus
extern "C" {
#endif
extern POBJECT_TYPE *MmSectionObjectType;
BOOLEAN
__fastcall
ExAcquireRundownProtection(
IN PEX_RUNDOWN_REF RunRef
);
VOID
__fastcall
ExReleaseRundownProtection(
IN PEX_RUNDOWN_REF RunRef
);
NTSTATUS
KiReadProcessMemory(
PEPROCESS Process,
PVOID lpBaseAddress,
PVOID lpBuffer,
ULONG nSize,
PULONG lpNumberOfBytesRead
);
NTSTATUS
KiWriteProcessMemory(
PEPROCESS Process,
PVOID lpBaseAddress,
PVOID lpBuffer,
ULONG nSize,
PULONG lpNumberOfBytesWritten
);
NTSTATUS
MmCommitUserBuffer(
HANDLE hProcess,
PVOID *BaseAddress,
ULONG Size);
NTSTATUS
MmFreeUserBuffer(
HANDLE hProcess,
PVOID BaseAddress,
ULONG Size,
ULONG Release);
VOID
MemOpen(
);
VOID
MemClose(
);
ULONG
GetSystemBufferSize(
PVOID Address,
ULONG Size
);
BOOLEAN
IsValidSystemAddress(
PVOID Address
);
ULONGLONG
GetSystemPagesSize(
);
ULONG
ReadUlong(
PEPROCESS eProcess,
PVOID lpAddress
);
VOID
WriteUlong(
PEPROCESS eProcess,
PVOID lpAddress,
ULONG Value
);
PVOID
MapVirtualAddress(
PVOID VirtualAddress,
ULONG Size,
PMDL *MemoryDescriptorList,
CSHORT Flags = 0
);
VOID
UnmapVirtualAddress(
PVOID VirtualAddress,
PMDL MemoryDescriptorList
);
NTSTATUS
MmReadPhysicalPages(PLARGE_INTEGER PhysicalAddress,
PVOID Buffer,
SIZE_T szBuffer);
NTSTATUS
MmWritePhysicalPages(PLARGE_INTEGER PhysicalAddress,
PVOID Buffer,
SIZE_T Size);
#ifdef _REPORT_
struct __MemoryRef {
ULONGLONG Counter;
ULONGLONG Mount;
};
extern __MemoryRef MemoryRef;
#endif
#ifdef __cplusplus
}
#endif
#define MEMORY_TAG 'abiS'
PVOID FORCEINLINE MmAlloc(SIZE_T Size)
{
PVOID Block = ExAllocatePoolWithTag(NonPagedPool, Size + sizeof(SIZE_T), MEMORY_TAG);
if (Block)
{
RtlZeroMemory(Block, Size + sizeof(SIZE_T));
*(PSIZE_T)Block = Size;
#ifdef _REPORT_
MemoryRef.Counter ++;
MemoryRef.Mount += Size;
#endif
return (PVOID)((PSIZE_T)Block + 1);
}
return NULL;
}
VOID FORCEINLINE MmFree(PVOID MemoryBlock)
{
if (MemoryBlock)
{
PVOID Block = (PVOID)((PSIZE_T)MemoryBlock - 1);
#ifdef _REPORT_
MemoryRef.Counter --;
MemoryRef.Mount -= *((PSIZE_T)Block);
#endif
ExFreePoolWithTag(Block, MEMORY_TAG);
}
}
PVOID FORCEINLINE MmRealloc(PVOID MemoryBlock, SIZE_T Size)
{
PVOID Block;
SIZE_T PrevSize;
if (!MemoryBlock)
{
return MmAlloc(Size);
}
else
{
PrevSize = *((PSIZE_T)MemoryBlock - 1);
Block = MmAlloc(Size);
if (Block)
{
RtlCopyMemory(Block, MemoryBlock, min(PrevSize, Size));
MmFree(MemoryBlock);
}
return Block;
}
}
SIZE_T FORCEINLINE MmGetSize(PVOID MemoryBlock)
{
PVOID Block = (PVOID)((SIZE_T *)MemoryBlock - 1);
if (Block == NULL || MemoryBlock == NULL)
return 0;
if (!MemoryBlock || !Block)
{
return 0;
}
else
{
return (*(SIZE_T *)Block);
}
}