+VOID
+NTAPI
+ExBurnMemory(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
+ IN ULONG PagesToDestroy,
+ IN TYPE_OF_MEMORY MemoryType)
+{
+ PLIST_ENTRY ListEntry;
+ PMEMORY_ALLOCATION_DESCRIPTOR MemDescriptor;
+
+ DPRINT1("Burn RAM amount: %d pages\n", PagesToDestroy);
+
+ /* Loop the memory descriptors, beginning at the end */
+ for (ListEntry = LoaderBlock->MemoryDescriptorListHead.Blink;
+ ListEntry != &LoaderBlock->MemoryDescriptorListHead;
+ ListEntry = ListEntry->Blink)
+ {
+ /* Get the memory descriptor structure */
+ MemDescriptor = CONTAINING_RECORD(ListEntry,
+ MEMORY_ALLOCATION_DESCRIPTOR,
+ ListEntry);
+
+ /* Is memory free there or is it temporary? */
+ if (MemDescriptor->MemoryType == LoaderFree ||
+ MemDescriptor->MemoryType == LoaderFirmwareTemporary)
+ {
+ /* Check if the descriptor has more pages than we want */
+ if (MemDescriptor->PageCount > PagesToDestroy)
+ {
+ /* Change block's page count, ntoskrnl doesn't care much */
+ MemDescriptor->PageCount -= PagesToDestroy;
+ break;
+ }
+ else
+ {
+ /* Change block type */
+ MemDescriptor->MemoryType = MemoryType;
+ PagesToDestroy -= MemDescriptor->PageCount;
+
+ /* Check if we are done */
+ if (PagesToDestroy == 0) break;
+ }
+ }
+ }
+}
+