/*++ Copyright (c) 2024, Quinn Stephens. Provided under the BSD 3-Clause license. Module Name: mm.c Abstract: Provides boot library memory manager routines. --*/ #include #include "bootlib.h" #include "mm.h" #define MAX_STATIC_DESCRIPTOR_COUNT 1024 BOOT_MEMORY_DESCRIPTOR MmStaticMemoryDescriptors[MAX_STATIC_DESCRIPTOR_COUNT]; PBOOT_MEMORY_DESCRIPTOR MmGlobalMemoryDescriptors; ULONG MmGlobalMemoryDescriptorCount; NTSTATUS BlpMmInitialize ( IN PBOOT_MEMORY_INFO MemoryInfo, IN ULONG TranslationType, IN PBOOT_LIBRARY_PARAMETERS LibraryParameters ) /*++ Routine Description: Initializes the boot memory manager. Arguments: MemoryInfo - pointer to the memory info structure. TranslationType - the current translation type being used. LibraryParameters - pointer to the library parameters structure. Return Value: STATUS_SUCCESS if successful, STATUS_INVALID_PARAMETER if TranslationType is invalid, Other NTSTATUS value if an error occurs. --*/ { NTSTATUS Status; DebugPrint(L"Initializing memory manager...\r\n"); // // Check TranslationType. // if ( TranslationType > BOOT_TRANSLATION_TYPE_MAX || LibraryParameters->TranslationType > BOOT_TRANSLATION_TYPE_MAX ) { DebugPrint(L"BlpMmInitialize(): TranslationType is invalid\r\n"); return STATUS_INVALID_PARAMETER; } // // Initialize memory descriptors. // MmGlobalMemoryDescriptors = &MmStaticMemoryDescriptors[0]; MmGlobalMemoryDescriptorCount = MAX_STATIC_DESCRIPTOR_COUNT; RtlZeroMemory(MmGlobalMemoryDescriptors, MAX_STATIC_DESCRIPTOR_COUNT * sizeof(BOOT_MEMORY_DESCRIPTOR)); // // Initialize the page allocator. // Status = MmPaInitialize(MemoryInfo, LibraryParameters->MinimumPageAllocation); if (!NT_SUCCESS(Status)) { return Status; } return STATUS_SUCCESS; }