ReactOS 0.4.15-dev-7958-gcd0bb1a
mm.h
Go to the documentation of this file.
1/*
2 * FreeLoader
3 * Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20#pragma once
21
22extern char __ImageBase;
23#ifdef __GNUC__
24 #ifdef _M_AMD64
25 /* .text/.data/.rdata, and .bss */
26 #define FREELDR_SECTION_COUNT 2
27 #else
28 /* .text/.data/.rdata, .edata and .bss */
29 #define FREELDR_SECTION_COUNT 3
30 #endif
31#else
32#ifdef _M_AMD64
33/* .text, .rdata/.edata, .pdata and .data/.bss */
34#define FREELDR_SECTION_COUNT 4
35#else
36/* .text, .rdata/.edata and .data/.bss */
37#define FREELDR_SECTION_COUNT 3
38#endif
39#endif
40
42{
47
48
49#if defined(__i386__) || defined(_PPC_) || defined(_MIPS_) || defined(_ARM_)
50
51#define MM_PAGE_SIZE 4096
52#define MM_PAGE_MASK 0xFFF
53#define MM_PAGE_SHIFT 12
54#if defined(_X86PAE_)
55#define MM_MAX_PAGE 0x3FFFFFF /* 26 bits for the PFN */
56#else
57#define MM_MAX_PAGE 0xFFFFF /* 20 bits for the PFN */
58#endif
59#define MM_MAX_PAGE_LOADER 0xFFFFF /* 4 GB flat address range */
60
61#define MM_SIZE_TO_PAGES(a) \
62 ( ((a) >> MM_PAGE_SHIFT) + ((a) & MM_PAGE_MASK ? 1 : 0) )
63
64#endif // defined __i386__ or _PPC_ or _MIPS_
65
66#if defined (_AMD64_)
67
68#define MM_PAGE_SIZE 4096
69#define MM_PAGE_MASK 0xFFF
70#define MM_PAGE_SHIFT 12
71#define MM_MAX_PAGE 0xFFFFFFFFF /* 36 bits for the PFN */
72#define MM_MAX_PAGE_LOADER 0x3FFFF /* on x64 freeldr only maps 1 GB */
73
74#define MM_SIZE_TO_PAGES(a) \
75 ( ((a) >> MM_PAGE_SHIFT) + ((a) & MM_PAGE_MASK ? 1 : 0) )
76
77#endif
78
79// HEAP and STACK size
80#define HEAP_PAGES 0x400
81#define STACK_PAGES 0x00
82
83#include <pshpack1.h>
84typedef struct
85{
86 TYPE_OF_MEMORY PageAllocated; // Type of allocated memory (LoaderFree if this memory is free)
87 PFN_NUMBER PageAllocationLength; // Number of pages allocated (or zero if this isn't the first page in the chain)
89#include <poppack.h>
90
91//
92// Define this to 1 if you want the entire contents
93// of the memory allocation bitmap displayed
94// when a chunk is allocated or freed
95//
96#define DUMP_MEM_MAP_ON_VERIFY 0
97
102
103#if DBG
104PCSTR MmGetSystemMemoryMapTypeString(TYPE_OF_MEMORY Type);
105#endif
106
107PFN_NUMBER MmGetPageNumberFromAddress(PVOID Address); // Returns the page number that contains a linear address
108PFN_NUMBER MmGetAddressablePageCountIncludingHoles(VOID); // Returns the count of addressable pages from address zero including any memory holes and reserved memory regions
109PVOID MmFindLocationForPageLookupTable(PFN_NUMBER TotalPageCount); // Returns the address for a memory chunk big enough to hold the page lookup table (starts search from end of memory)
110VOID MmInitPageLookupTable(PVOID PageLookupTable, PFN_NUMBER TotalPageCount); // Inits the page lookup table according to the memory types in the memory map
111VOID MmMarkPagesInLookupTable(PVOID PageLookupTable, PFN_NUMBER StartPage, PFN_NUMBER PageCount, TYPE_OF_MEMORY PageAllocated); // Marks the specified pages as allocated or free in the lookup table
112VOID MmAllocatePagesInLookupTable(PVOID PageLookupTable, PFN_NUMBER StartPage, PFN_NUMBER PageCount, TYPE_OF_MEMORY MemoryType); // Allocates the specified pages in the lookup table
113PFN_NUMBER MmCountFreePagesInLookupTable(PVOID PageLookupTable, PFN_NUMBER TotalPageCount); // Returns the number of free pages in the lookup table
114PFN_NUMBER MmFindAvailablePages(PVOID PageLookupTable, PFN_NUMBER TotalPageCount, PFN_NUMBER PagesNeeded, BOOLEAN FromEnd); // Returns the page number of the first available page range from the beginning or end of memory
115PFN_NUMBER MmFindAvailablePagesBeforePage(PVOID PageLookupTable, PFN_NUMBER TotalPageCount, PFN_NUMBER PagesNeeded, PFN_NUMBER LastPage); // Returns the page number of the first available page range before the specified page
116VOID MmUpdateLastFreePageHint(PVOID PageLookupTable, PFN_NUMBER TotalPageCount); // Sets the LastFreePageHint to the last usable page of memory
117BOOLEAN MmAreMemoryPagesAvailable(PVOID PageLookupTable, PFN_NUMBER TotalPageCount, PVOID PageAddress, PFN_NUMBER PageCount); // Returns TRUE if the specified pages of memory are available, otherwise FALSE
118VOID MmSetMemoryType(PVOID MemoryAddress, SIZE_T MemorySize, TYPE_OF_MEMORY NewType); // Use with EXTREME caution!
119
120PPAGE_LOOKUP_TABLE_ITEM MmGetMemoryMap(PFN_NUMBER *NoEntries); // Returns a pointer to the memory mapping table and a number of entries in it
121
122
123//BOOLEAN MmInitializeMemoryManager(ULONG LowMemoryStart, ULONG LowMemoryLength);
125VOID MmInitializeHeap(PVOID PageLookupTable);
128VOID MmFreeMemory(PVOID MemoryPointer);
131
132/* Heap */
133#define DEFAULT_HEAP_SIZE (1024 * 1024)
134#define TEMP_HEAP_SIZE (32 * 1024 * 1024)
135
137extern PVOID FrLdrTempHeap;
139
140PVOID
143 TYPE_OF_MEMORY MemoryType);
144
145VOID
147 PVOID HeapHandle);
148
149VOID
151 PVOID HeapHandle);
152
153VOID
155 PVOID HeapHandle);
156
157VOID
159
160PVOID
162 PVOID HeapHandle,
164 ULONG Tag);
165
166VOID
168 PVOID HeapHandle,
169 PVOID Pointer,
170 ULONG Tag);
171
173PVOID
175{
177}
178
180VOID
182{
183 FrLdrHeapFreeEx(FrLdrDefaultHeap, MemoryPointer, Tag);
184}
185
187PVOID
190 _In_ ULONG Tag)
191{
193}
194
196VOID
199{
201}
202
unsigned char BOOLEAN
Type
Definition: Type.h:7
char __ImageBase
PVOID PageLookupTableAddress
Definition: meminit.c:26
VOID FrLdrHeapDestroy(PVOID HeapHandle)
Definition: heap.c:138
PVOID MmAllocateMemoryAtAddress(SIZE_T MemorySize, PVOID DesiredAddress, TYPE_OF_MEMORY MemoryType)
Definition: mm.c:85
struct _FREELDR_MEMORY_DESCRIPTOR * PFREELDR_MEMORY_DESCRIPTOR
PVOID MmAllocateMemory(SIZE_T MemorySize)
PFN_NUMBER MmGetAddressablePageCountIncludingHoles(VOID)
Definition: meminit.c:376
VOID MmFreeMemory(PVOID MemoryPointer)
Definition: mm.c:215
VOID FrLdrHeapFreeEx(PVOID HeapHandle, PVOID Pointer, ULONG Tag)
Definition: heap.c:439
SIZE_T FrLdrImageSize
Definition: meminit.c:35
VOID MmSetMemoryType(PVOID MemoryAddress, SIZE_T MemorySize, TYPE_OF_MEMORY NewType)
Definition: mm.c:144
PVOID MmAllocateMemoryWithType(SIZE_T MemorySize, TYPE_OF_MEMORY MemoryType)
Definition: mm.c:31
struct PAGE_LOOKUP_TABLE_ITEM * PPAGE_LOOKUP_TABLE_ITEM
PFN_NUMBER TotalPagesInLookupTable
Definition: meminit.c:27
PVOID FrLdrHeapAllocateEx(PVOID HeapHandle, SIZE_T ByteSize, ULONG Tag)
Definition: heap.c:321
PFN_NUMBER MmGetPageNumberFromAddress(PVOID Address)
Definition: meminit.c:371
FORCEINLINE VOID FrLdrHeapFree(PVOID MemoryPointer, ULONG Tag)
Definition: mm.h:181
VOID MmMarkPagesInLookupTable(PVOID PageLookupTable, PFN_NUMBER StartPage, PFN_NUMBER PageCount, TYPE_OF_MEMORY PageAllocated)
Definition: meminit.c:506
FORCEINLINE PVOID FrLdrTempAlloc(_In_ SIZE_T Size, _In_ ULONG Tag)
Definition: mm.h:188
PFN_NUMBER MmFindAvailablePages(PVOID PageLookupTable, PFN_NUMBER TotalPageCount, PFN_NUMBER PagesNeeded, BOOLEAN FromEnd)
Definition: meminit.c:567
PVOID FrLdrDefaultHeap
Definition: heap.c:34
BOOLEAN MmInitializeMemoryManager(VOID)
Definition: meminit.c:315
VOID MmInitPageLookupTable(PVOID PageLookupTable, PFN_NUMBER TotalPageCount)
Definition: meminit.c:463
PFN_NUMBER MmCountFreePagesInLookupTable(PVOID PageLookupTable, PFN_NUMBER TotalPageCount)
Definition: meminit.c:549
VOID MmInitializeHeap(PVOID PageLookupTable)
Definition: heap.c:536
VOID FrLdrHeapRelease(PVOID HeapHandle)
Definition: heap.c:182
PVOID FrLdrTempHeap
Definition: heap.c:35
PFN_NUMBER FreePagesInLookupTable
Definition: meminit.c:28
PFN_NUMBER MmFindAvailablePagesBeforePage(PVOID PageLookupTable, PFN_NUMBER TotalPageCount, PFN_NUMBER PagesNeeded, PFN_NUMBER LastPage)
Definition: meminit.c:626
VOID MmUpdateLastFreePageHint(PVOID PageLookupTable, PFN_NUMBER TotalPageCount)
Definition: meminit.c:659
FORCEINLINE VOID FrLdrTempFree(PVOID Allocation, ULONG Tag)
Definition: mm.h:197
PVOID MmFindLocationForPageLookupTable(PFN_NUMBER TotalPageCount)
Definition: meminit.c:416
PFN_NUMBER LastFreePageHint
Definition: meminit.c:29
PPAGE_LOOKUP_TABLE_ITEM MmGetMemoryMap(PFN_NUMBER *NoEntries)
Definition: mm.c:297
FORCEINLINE PVOID FrLdrHeapAlloc(SIZE_T MemorySize, ULONG Tag)
Definition: mm.h:174
PVOID FrLdrHeapCreate(SIZE_T MaximumSize, TYPE_OF_MEMORY MemoryType)
Definition: heap.c:66
VOID MmAllocatePagesInLookupTable(PVOID PageLookupTable, PFN_NUMBER StartPage, PFN_NUMBER PageCount, TYPE_OF_MEMORY MemoryType)
Definition: meminit.c:536
BOOLEAN MmAreMemoryPagesAvailable(PVOID PageLookupTable, PFN_NUMBER TotalPageCount, PVOID PageAddress, PFN_NUMBER PageCount)
Definition: meminit.c:674
VOID FrLdrHeapVerify(PVOID HeapHandle)
Definition: heap.c:157
PVOID MmAllocateHighestMemoryBelowAddress(SIZE_T MemorySize, PVOID DesiredAddress, TYPE_OF_MEMORY MemoryType)
Definition: mm.c:160
VOID FrLdrHeapCleanupAll(VOID)
Definition: heap.c:249
struct _FREELDR_MEMORY_DESCRIPTOR FREELDR_MEMORY_DESCRIPTOR
#define _In_
Definition: ms_sal.h:308
_In_ ACCESS_MASK _In_opt_ POBJECT_ATTRIBUTES _In_opt_ PLARGE_INTEGER MaximumSize
Definition: mmfuncs.h:362
static WCHAR Address[46]
Definition: ping.c:68
enum _TYPE_OF_MEMORY TYPE_OF_MEMORY
ULONG PFN_NUMBER
Definition: ke.h:9
PFN_NUMBER PageAllocationLength
Definition: mm.h:87
TYPE_OF_MEMORY PageAllocated
Definition: mm.h:86
TYPE_OF_MEMORY MemoryType
Definition: mm.h:43
PFN_NUMBER PageCount
Definition: mm.h:45
PFN_NUMBER BasePage
Definition: mm.h:44
static CONST DWORD MemorySize[]
Definition: svga.c:32
ULONG_PTR SIZE_T
Definition: typedefs.h:80
const char * PCSTR
Definition: typedefs.h:52
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFDEVICE _In_ BOOLEAN _In_opt_ PVOID Tag
Definition: wdfdevice.h:4065
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
#define FORCEINLINE
Definition: wdftypes.h:67
int WINAPI StartPage(_In_ HDC)
Allocation
Definition: exfuncs.h:598
_Must_inspect_result_ _In_ SIZE_T _In_ PVOID PageAddress
Definition: mmfuncs.h:472
_IRQL_requires_same_ _In_ CLONG ByteSize
Definition: rtltypes.h:399