extern char __ImageBase;
#ifdef __GNUC__
+/* .text, .edata and .bss */
#define FREELDR_SECTION_COUNT 3
#else
#ifdef _M_AMD64
/* .text and .pdata */
#define FREELDR_SECTION_COUNT 2
#else
-#define FREELDR_SECTION_COUNT 1
+/* .text and .edata */
+#define FREELDR_SECTION_COUNT 2
#endif
#endif
PVOID MmAllocateMemoryAtAddress(SIZE_T MemorySize, PVOID DesiredAddress, TYPE_OF_MEMORY MemoryType);
PVOID MmAllocateHighestMemoryBelowAddress(SIZE_T MemorySize, PVOID DesiredAddress, TYPE_OF_MEMORY MemoryType);
-PVOID MmHeapAlloc(SIZE_T MemorySize);
-VOID MmHeapFree(PVOID MemoryPointer);
-
/* Heap */
+#define DEFAULT_HEAP_SIZE (1024 * 1024)
+#define TEMP_HEAP_SIZE (32 * 1024 * 1024)
+
extern PVOID FrLdrDefaultHeap;
extern PVOID FrLdrTempHeap;
+extern SIZE_T FrLdrImageSize;
PVOID
-HeapCreate(
+FrLdrHeapCreate(
SIZE_T MaximumSize,
TYPE_OF_MEMORY MemoryType);
VOID
-HeapDestroy(
+FrLdrHeapDestroy(
PVOID HeapHandle);
VOID
-HeapRelease(
+FrLdrHeapRelease(
PVOID HeapHandle);
VOID
-HeapVerify(
+FrLdrHeapVerify(
PVOID HeapHandle);
VOID
-HeapCleanupAll(VOID);
+FrLdrHeapCleanupAll(VOID);
PVOID
-HeapAllocate(
+FrLdrHeapAllocateEx(
PVOID HeapHandle,
SIZE_T ByteSize,
ULONG Tag);
VOID
-HeapFree(
+FrLdrHeapFreeEx(
PVOID HeapHandle,
PVOID Pointer,
ULONG Tag);
+FORCEINLINE
+PVOID
+FrLdrHeapAlloc(SIZE_T MemorySize, ULONG Tag)
+{
+ return FrLdrHeapAllocateEx(FrLdrDefaultHeap, MemorySize, Tag);
+}
+
+FORCEINLINE
+VOID
+FrLdrHeapFree(PVOID MemoryPointer, ULONG Tag)
+{
+ FrLdrHeapFreeEx(FrLdrDefaultHeap, MemoryPointer, Tag);
+}
+
+FORCEINLINE
+PVOID
+FrLdrTempAlloc(
+ _In_ SIZE_T Size,
+ _In_ ULONG Tag)
+{
+ return FrLdrHeapAllocateEx(FrLdrTempHeap, Size, Tag);
+}
+
+FORCEINLINE
+VOID
+FrLdrTempFree(
+ PVOID Allocation, ULONG Tag)
+{
+ FrLdrHeapFreeEx(FrLdrTempHeap, Allocation, Tag);
+}
+