Author: ros-arm-bringup
Date: Fri Jul 24 17:49:27 2009
New Revision: 42175
URL:
http://svn.reactos.org/svn/reactos?rev=42175&view=rev
Log:
- Remove deprecated/old/buggy/unused code.
- Make MxGetNextPage return the lowest free physical page, not the highest.
- This way we fragment the address space less.
- Also makes calculation of "forgotten" pages when we build the PFN database
earlier.
- Remove MmAllocEarlyPage and use MxGetNextPage instead.
Modified:
trunk/reactos/ntoskrnl/ke/bug.c
trunk/reactos/ntoskrnl/mm/ARM3/i386/init.c
trunk/reactos/ntoskrnl/mm/freelist.c
trunk/reactos/ntoskrnl/mm/pagefile.c
Modified: trunk/reactos/ntoskrnl/ke/bug.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ke/bug.c?rev=4217…
==============================================================================
--- trunk/reactos/ntoskrnl/ke/bug.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/ke/bug.c [iso-8859-1] Fri Jul 24 17:49:27 2009
@@ -1162,13 +1162,7 @@
/* FIXME: Support Triage Dump */
- /* Write the crash dump */
- MmDumpToPagingFile(KiBugCheckData[4],
- KiBugCheckData[0],
- KiBugCheckData[1],
- KiBugCheckData[2],
- KiBugCheckData[3],
- TrapFrame);
+ /* FIXME: Write the crash dump */
}
else
{
Modified: trunk/reactos/ntoskrnl/mm/ARM3/i386/init.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/ARM3/i386/init…
==============================================================================
--- trunk/reactos/ntoskrnl/mm/ARM3/i386/init.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/ARM3/i386/init.c [iso-8859-1] Fri Jul 24 17:49:27 2009
@@ -250,9 +250,10 @@
}
//
- // Use our highest usable free pages
- //
- Pfn = MxFreeDescriptor->BasePage + MxFreeDescriptor->PageCount - PageCount;
+ // Use our lowest usable free pages
+ //
+ Pfn = MxFreeDescriptor->BasePage;
+ MxFreeDescriptor->BasePage += PageCount;
MxFreeDescriptor->PageCount -= PageCount;
return Pfn;
}
Modified: trunk/reactos/ntoskrnl/mm/freelist.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/freelist.c?rev…
==============================================================================
--- trunk/reactos/ntoskrnl/mm/freelist.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/freelist.c [iso-8859-1] Fri Jul 24 17:49:27 2009
@@ -133,110 +133,6 @@
MmRemoveLRUUserPage(PFN_TYPE Page)
{
RemoveEntryList(&MiGetPfnEntry(Page)->ListEntry);
-}
-
-PFN_TYPE
-NTAPI
-MmGetContinuousPages(ULONG NumberOfBytes,
- PHYSICAL_ADDRESS LowestAcceptableAddress,
- PHYSICAL_ADDRESS HighestAcceptableAddress,
- PHYSICAL_ADDRESS BoundaryAddressMultiple,
- BOOLEAN ZeroPages)
-{
- ULONG NrPages;
- ULONG i, j;
- ULONG start;
- ULONG last;
- ULONG length;
- ULONG boundary;
- KIRQL oldIrql;
-
- NrPages = PAGE_ROUND_UP(NumberOfBytes) / PAGE_SIZE;
-
- oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
-
- last = min(HighestAcceptableAddress.LowPart / PAGE_SIZE, MmHighestPhysicalPage - 1);
- boundary = BoundaryAddressMultiple.LowPart / PAGE_SIZE;
-
- for (j = 0; j < 2; j++)
- {
- start = -1;
- length = 0;
- /* First try to allocate the pages above the 16MB area. This may fail
- * because there are not enough continuous pages or we cannot allocate
- * pages above the 16MB area because the caller has specify an upper limit.
- * The second try uses the specified lower limit.
- */
- for (i = j == 0 ? 0x100000 / PAGE_SIZE : LowestAcceptableAddress.LowPart /
PAGE_SIZE; i <= last; )
- {
- if (MiGetPfnEntry(i)->Flags.Type == MM_PHYSICAL_PAGE_FREE)
- {
- if (start == (ULONG)-1)
- {
- start = i;
- length = 1;
- }
- else
- {
- length++;
- if (boundary)
- {
- if (start / boundary != i / boundary)
- {
- start = i;
- length = 1;
- }
- }
- }
- if (length == NrPages)
- {
- break;
- }
- }
- else
- {
- start = (ULONG)-1;
- }
- i++;
- }
-
- if (start != (ULONG)-1 && length == NrPages)
- {
- for (i = start; i < (start + length); i++)
- {
- PPHYSICAL_PAGE Page;
- Page = MiGetPfnEntry(i);
- RemoveEntryList(&Page->ListEntry);
- if (MmPfnDatabase[i].Flags.Zero == 0)
- {
- UnzeroedPageCount--;
- }
- MmStats.NrFreePages--;
- MmStats.NrSystemPages++;
- Page->Flags.Type = MM_PHYSICAL_PAGE_USED;
- Page->Flags.Consumer = MC_NPPOOL;
- Page->ReferenceCount = 1;
- Page->LockCount = 0;
- Page->MapCount = 0;
- Page->SavedSwapEntry = 0;
- }
- KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
- for (i = start; i < (start + length); i++)
- {
- if (MiGetPfnEntry(i)->Flags.Zero == 0)
- {
- if (ZeroPages) MiZeroPage(i);
- }
- else
- {
- MiGetPfnEntry(i)->Flags.Zero = 0;
- }
- }
- return start;
- }
- }
- KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
- return 0;
}
PFN_NUMBER
@@ -706,20 +602,6 @@
return Mdl;
}
-PFN_TYPE
-NTAPI
-MmAllocEarlyPage(VOID)
-{
- PFN_TYPE Pfn;
-
- /* Use one of our highest usable pages */
- Pfn = MxFreeDescriptor->BasePage + MxFreeDescriptor->PageCount - 1;
- MxFreeDescriptor->PageCount--;
-
- /* Return it */
- return Pfn;
-}
-
VOID
NTAPI
MmDumpPfnDatabase(VOID)
@@ -820,6 +702,10 @@
KeLowerIrql(OldIrql);
}
+PFN_NUMBER
+NTAPI
+MxGetNextPage(IN PFN_NUMBER PageCount);
+
VOID
NTAPI
MmInitializePageList(VOID)
@@ -845,7 +731,7 @@
if (!MmIsPagePresent(NULL, Address))
{
/* Use one of our highest usable pages */
- Pfn = MmAllocEarlyPage();
+ Pfn = MxGetNextPage(1);
/* Set the PFN */
Status = MmCreateVirtualMappingForKernel(Address,
@@ -934,9 +820,7 @@
}
/* Finally handle the pages describing the PFN database themselves */
- for (i = (MxFreeDescriptor->BasePage + MxFreeDescriptor->PageCount);
- i < (MxOldFreeDescriptor.BasePage + MxOldFreeDescriptor.PageCount);
- i++)
+ for (i = MxOldFreeDescriptor.BasePage; i < MxFreeDescriptor->BasePage; i++)
{
/* Ensure this page was not added previously */
ASSERT(MmPfnDatabase[i].Flags.Type == 0);
@@ -945,9 +829,8 @@
MmPfnDatabase[i] = UsedPage;
MmStats.NrSystemPages++;
}
-
+
KeInitializeEvent(&ZeroPageThreadEvent, NotificationEvent, TRUE);
-
DPRINT("Pages: %x %x\n", MmStats.NrFreePages, MmStats.NrSystemPages);
MmStats.NrTotalPages = MmStats.NrFreePages + MmStats.NrSystemPages +
MmStats.NrUserPages;
MmInitializeBalancer(MmStats.NrFreePages, MmStats.NrSystemPages);
@@ -1290,11 +1173,7 @@
/* Check if this allocation is for the PFN DB itself */
if (MmStats.NrTotalPages == 0)
{
- /* Allocate an early page -- we'll account for it later */
- KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
- PfnOffset = MmAllocEarlyPage();
- if (Consumer != MC_SYSTEM) MiZeroPage(PfnOffset);
- return PfnOffset;
+ MxGetNextPage(1);
}
DPRINT1("MmAllocPage(): Out of memory\n");
@@ -1353,154 +1232,6 @@
KeBugCheck(MEMORY_MANAGEMENT);
}
return PfnOffset;
-}
-
-LONG
-NTAPI
-MmAllocPagesSpecifyRange(ULONG Consumer,
- PHYSICAL_ADDRESS LowestAddress,
- PHYSICAL_ADDRESS HighestAddress,
- ULONG NumberOfPages,
- PPFN_TYPE Pages)
-{
- PPHYSICAL_PAGE PageDescriptor;
- KIRQL oldIrql;
- PFN_TYPE LowestPage, HighestPage;
- PFN_TYPE pfn;
- ULONG NumberOfPagesFound = 0;
- ULONG i;
-
- DPRINT("MmAllocPagesSpecifyRange()\n"
- " LowestAddress = 0x%08x%08x\n"
- " HighestAddress = 0x%08x%08x\n"
- " NumberOfPages = %d\n",
- LowestAddress.u.HighPart, LowestAddress.u.LowPart,
- HighestAddress.u.HighPart, HighestAddress.u.LowPart,
- NumberOfPages);
-
- if (NumberOfPages == 0)
- return 0;
-
- LowestPage = LowestAddress.LowPart / PAGE_SIZE;
- HighestPage = HighestAddress.LowPart / PAGE_SIZE;
- if ((HighestAddress.u.LowPart % PAGE_SIZE) != 0)
- HighestPage++;
-
- if (LowestPage >= MmHighestPhysicalPage)
- {
- DPRINT1("MmAllocPagesSpecifyRange(): Out of memory\n");
- return -1;
- }
- if (HighestPage > MmHighestPhysicalPage)
- HighestPage = MmHighestPhysicalPage;
-
- oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock);
- if (LowestPage == 0 && HighestPage == MmHighestPhysicalPage)
- {
- PLIST_ENTRY ListEntry;
- while (NumberOfPagesFound < NumberOfPages)
- {
- if (!IsListEmpty(&FreeZeroedPageListHead))
- {
- ListEntry = RemoveTailList(&FreeZeroedPageListHead);
- }
- else if (!IsListEmpty(&FreeUnzeroedPageListHead))
- {
- ListEntry = RemoveTailList(&FreeUnzeroedPageListHead);
- UnzeroedPageCount--;
- }
- else
- {
- if (NumberOfPagesFound == 0)
- {
- KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
- DPRINT1("MmAllocPagesSpecifyRange(): Out of memory\n");
- return -1;
- }
- else
- {
- break;
- }
- }
- PageDescriptor = CONTAINING_RECORD(ListEntry, PHYSICAL_PAGE, ListEntry);
-
- ASSERT(PageDescriptor->Flags.Type == MM_PHYSICAL_PAGE_FREE);
- ASSERT(PageDescriptor->MapCount == 0);
- ASSERT(PageDescriptor->ReferenceCount == 0);
-
- /* Allocate the page */
- PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED;
- PageDescriptor->Flags.Consumer = Consumer;
- PageDescriptor->ReferenceCount = 1;
- PageDescriptor->LockCount = 0;
- PageDescriptor->MapCount = 0;
- PageDescriptor->SavedSwapEntry = 0; /* FIXME: Do we need swap entries? */
-
- MmStats.NrSystemPages++;
- MmStats.NrFreePages--;
-
- /* Remember the page */
- pfn = PageDescriptor - MmPfnDatabase;
- Pages[NumberOfPagesFound++] = pfn;
- if(Consumer == MC_USER) MmInsertLRULastUserPage(pfn);
- }
- }
- else
- {
- INT LookForZeroedPages;
- for (LookForZeroedPages = 1; LookForZeroedPages >= 0; LookForZeroedPages--)
- {
- for (pfn = LowestPage; pfn < HighestPage; pfn++)
- {
- PageDescriptor = MmPfnDatabase + pfn;
-
- if (PageDescriptor->Flags.Type != MM_PHYSICAL_PAGE_FREE)
- continue;
- if (PageDescriptor->Flags.Zero != LookForZeroedPages)
- continue;
-
- ASSERT(PageDescriptor->MapCount == 0);
- ASSERT(PageDescriptor->ReferenceCount == 0);
-
- /* Allocate the page */
- PageDescriptor->Flags.Type = MM_PHYSICAL_PAGE_USED;
- PageDescriptor->Flags.Consumer = Consumer;
- PageDescriptor->ReferenceCount = 1;
- PageDescriptor->LockCount = 0;
- PageDescriptor->MapCount = 0;
- PageDescriptor->SavedSwapEntry = 0; /* FIXME: Do we need swap entries? */
-
- if (!PageDescriptor->Flags.Zero)
- UnzeroedPageCount--;
- MmStats.NrSystemPages++;
- MmStats.NrFreePages--;
-
- /* Remember the page */
- Pages[NumberOfPagesFound++] = pfn;
- if (NumberOfPagesFound == NumberOfPages)
- break;
- }
- if (NumberOfPagesFound == NumberOfPages)
- break;
- }
- }
- KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql);
-
- /* Zero unzero-ed pages */
- for (i = 0; i < NumberOfPagesFound; i++)
- {
- pfn = Pages[i];
- if (MiGetPfnEntry(pfn)->Flags.Zero == 0)
- {
- MiZeroPage(pfn);
- }
- else
- {
- MiGetPfnEntry(pfn)->Flags.Zero = 0;
- }
- }
-
- return NumberOfPagesFound;
}
NTSTATUS
Modified: trunk/reactos/ntoskrnl/mm/pagefile.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/pagefile.c?rev…
==============================================================================
--- trunk/reactos/ntoskrnl/mm/pagefile.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/mm/pagefile.c [iso-8859-1] Fri Jul 24 17:49:27 2009
@@ -105,15 +105,6 @@
*/
#define MM_PAGEFILE_COMMIT_GRACE (256)
-static PVOID MmCoreDumpPageFrame = NULL;
-static ULONG MmCoreDumpSize;
-static DUMP_POINTERS MmCoreDumpPointers;
-static PMM_CORE_DUMP_FUNCTIONS MmCoreDumpFunctions;
-static ULONG MmCoreDumpPageFile = 0xFFFFFFFF;
-static ROS_QUERY_LCN_MAPPING MmCoreDumpLcnMapping;
-
-ULONG MmCoreDumpType = MM_CORE_DUMP_TYPE_NONE;
-
/*
* Translate between a swap entry and a file and offset pair.
*/
@@ -360,22 +351,6 @@
PagingFileList[i] = NULL;
}
MiPagingFileCount = 0;
-
- /*
- * Initialize the crash dump support.
- */
- if (MmCoreDumpType != MM_CORE_DUMP_TYPE_NONE)
- {
- MmCoreDumpPageFrame = MmAllocateSection(PAGE_SIZE, NULL);
- if (MmCoreDumpType == MM_CORE_DUMP_TYPE_FULL)
- {
- MmCoreDumpSize = MmStats.NrTotalPages * 4096 + 1024 * 1024;
- }
- else
- {
- MmCoreDumpSize = 1024 * 1024;
- }
- }
}
BOOLEAN
@@ -536,263 +511,6 @@
}
return RetDescList;
-}
-
-NTSTATUS NTAPI
-MmDumpToPagingFile(ULONG BugCode,
- ULONG BugCodeParameter1,
- ULONG BugCodeParameter2,
- ULONG BugCodeParameter3,
- ULONG BugCodeParameter4,
- PKTRAP_FRAME TrapFrame)
-{
- PMM_CORE_DUMP_HEADER Headers;
- NTSTATUS Status;
- UCHAR MdlBase[sizeof(MDL) + sizeof(ULONG)];
- PMDL Mdl = (PMDL)MdlBase;
- PETHREAD Thread = PsGetCurrentThread();
- ULONG_PTR StackSize;
- PULONG MdlMap;
- LONGLONG NextOffset = 0;
- ULONG i;
- PRETRIEVAL_POINTERS_BUFFER RetrievalPointers;
- LARGE_INTEGER DiskOffset;
-
- if (MmCoreDumpPageFile == 0xFFFFFFFF)
- {
- return(STATUS_UNSUCCESSFUL);
- }
-
- DbgPrint("\nMM: Dumping core: ");
-
- /* Prepare the dump headers. */
- Headers = (PMM_CORE_DUMP_HEADER)MmCoreDumpPageFrame;
- Headers->Magic = MM_CORE_DUMP_HEADER_MAGIC;
- Headers->Version = MM_CORE_DUMP_HEADER_VERSION;
- Headers->Type = MmCoreDumpType;
- if (TrapFrame != NULL)
- {
-#ifdef _M_IX86
- if (!(TrapFrame->EFlags & (1 << 17)))
- {
- memcpy(&Headers->TrapFrame, TrapFrame,
- sizeof(KTRAP_FRAME) - (4 * sizeof(ULONG)));
- }
- else
-#endif
- {
- memcpy(&Headers->TrapFrame, TrapFrame, sizeof(KTRAP_FRAME));
- }
- }
- Headers->BugCheckCode = BugCode;
- Headers->BugCheckParameters[0] = BugCodeParameter1;
- Headers->BugCheckParameters[1] = BugCodeParameter2;
- Headers->BugCheckParameters[2] = BugCodeParameter3;
- Headers->BugCheckParameters[3] = BugCodeParameter4;
- Headers->FaultingStackBase = (PVOID)Thread->Tcb.StackLimit;
- Headers->FaultingStackSize =
- StackSize = (ULONG_PTR)Thread->Tcb.StackBase -
(ULONG_PTR)Thread->Tcb.StackLimit;
- Headers->PhysicalMemorySize = MmStats.NrTotalPages * PAGE_SIZE;
-
- /* Initialize the dump device. */
- Status = MmCoreDumpFunctions->DumpInit();
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("MM: Failed to initialize core dump device.\n");
- return(Status);
- }
-
- /* Initialize the MDL. */
- MmInitializeMdl(Mdl, MmCoreDumpPageFrame, PAGE_SIZE);
- Mdl->MdlFlags = MDL_PAGES_LOCKED|MDL_IO_PAGE_READ|MDL_SOURCE_IS_NONPAGED_POOL;
- MdlMap = (PULONG)(Mdl + 1);
-
-
- /* Initialize the retrieval offsets. */
- RetrievalPointers = PagingFileList[MmCoreDumpPageFile]->RetrievalPointers;
-
- /* Dump the header. */
- MdlMap[0] = (ULONG)(MmGetPhysicalAddress(MmCoreDumpPageFrame).QuadPart >>
PAGE_SHIFT);
-#if defined(__GNUC__)
-
- DiskOffset = MmGetOffsetPageFile(RetrievalPointers, (LARGE_INTEGER)0LL);
-#else
-
- {
- const LARGE_INTEGER dummy =
- {
- 0
- };
- DiskOffset = MmGetOffsetPageFile(RetrievalPointers, dummy);
- }
-#endif
- DiskOffset.QuadPart += MmCoreDumpLcnMapping.LcnDiskOffset.QuadPart;
- Status = MmCoreDumpFunctions->DumpWrite(DiskOffset, Mdl);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("MM: Failed to write core dump header\n.");
- return(Status);
- }
- NextOffset += PAGE_SIZE;
- ;
- DbgPrint("00");
-
-
- /* Write out the contents of physical memory. */
- if (MmCoreDumpType == MM_CORE_DUMP_TYPE_FULL)
- {
- for (i = 0; i < MmStats.NrTotalPages; i++)
- {
- MdlMap[0] = i;
- MmCreateVirtualMappingForKernel(MmCoreDumpPageFrame,
- PAGE_READWRITE,
- MdlMap,
- 1);
-#if defined(__GNUC__)
-
- DiskOffset = MmGetOffsetPageFile(RetrievalPointers,
- (LARGE_INTEGER)NextOffset);
-#else
-
- {
- LARGE_INTEGER dummy;
- dummy.QuadPart = NextOffset;
- DiskOffset = MmGetOffsetPageFile(RetrievalPointers, dummy);
- }
-#endif
- DiskOffset.QuadPart += MmCoreDumpLcnMapping.LcnDiskOffset.QuadPart;
- Status = MmCoreDumpFunctions->DumpWrite(DiskOffset, Mdl);
- MmRawDeleteVirtualMapping(MmCoreDumpPageFrame);
- if (!NT_SUCCESS(Status))
- {
- DPRINT1("MM: Failed to write page to core dump.\n");
- return(Status);
- }
- if ((i % ((1024*1024) / PAGE_SIZE)) == 0)
- {
- DbgPrint("\b\b%.2d", i / ((1024*1024)/PAGE_SIZE));
- }
- NextOffset += PAGE_SIZE;
- }
- }
-
- DbgPrint("\n");
- MmCoreDumpFunctions->DumpFinish();
- return(STATUS_SUCCESS);
-}
-
-NTSTATUS NTAPI
-MmInitializeCrashDump(HANDLE PageFileHandle, ULONG PageFileNum)
-{
- PFILE_OBJECT PageFile;
- PDEVICE_OBJECT PageFileDevice;
- NTSTATUS Status;
- PIRP Irp;
- KEVENT Event;
- IO_STATUS_BLOCK Iosb;
- UNICODE_STRING DiskDumpName = RTL_CONSTANT_STRING(L"DiskDump");
- ANSI_STRING ProcName;
- PIO_STACK_LOCATION StackPtr;
- PLDR_DATA_TABLE_ENTRY ModuleObject = NULL;
- PVOID BaseAddress;
-
- Status = ZwFsControlFile(PageFileHandle,
- 0,
- NULL,
- NULL,
- &Iosb,
- FSCTL_ROS_QUERY_LCN_MAPPING,
- NULL,
- 0,
- &MmCoreDumpLcnMapping,
- sizeof(ROS_QUERY_LCN_MAPPING));
- if (!NT_SUCCESS(Status) ||
- Iosb.Information != sizeof(ROS_QUERY_LCN_MAPPING))
- {
- return(Status);
- }
-
- /* Get the underlying storage device. */
- Status =
- ObReferenceObjectByHandle(PageFileHandle,
- FILE_ALL_ACCESS,
- NULL,
- KernelMode,
- (PVOID*)&PageFile,
- NULL);
- if (!NT_SUCCESS(Status))
- {
- return(Status);
- }
-
- PageFileDevice = PageFile->Vpb->RealDevice;
-
- /* Get the dump pointers. */
- KeInitializeEvent(&Event, NotificationEvent, FALSE);
- Irp = IoBuildDeviceIoControlRequest(IOCTL_SCSI_GET_DUMP_POINTERS,
- PageFileDevice,
- NULL,
- 0,
- &MmCoreDumpPointers,
- sizeof(MmCoreDumpPointers),
- FALSE,
- &Event,
- &Iosb);
- if(Irp == NULL)
- {
- ObDereferenceObject(PageFile);
- return(STATUS_NO_MEMORY);// tMk - is this correct return code ???
- }
-
- StackPtr = IoGetNextIrpStackLocation(Irp);
- StackPtr->FileObject = PageFile;
- StackPtr->DeviceObject = PageFileDevice;
- StackPtr->Parameters.DeviceIoControl.InputBufferLength = 0;
- StackPtr->Parameters.DeviceIoControl.OutputBufferLength =
sizeof(MmCoreDumpPointers);
-
- Status = IoCallDriver(PageFileDevice,Irp);
- if (Status == STATUS_PENDING)
- {
- Status = KeWaitForSingleObject(&Event,
- Executive,
- KernelMode,
- FALSE,
- NULL);
- }
- if (Status != STATUS_SUCCESS ||
- Iosb.Information != sizeof(MmCoreDumpPointers))
- {
- ObDereferenceObject(PageFile);
- return(Status);
- }
-
- /* Load the diskdump driver. */
- Status = MmLoadSystemImage(&DiskDumpName, NULL, NULL, 0, (PVOID)&ModuleObject,
&BaseAddress);
- if (ModuleObject == NULL)
- {
- return(STATUS_OBJECT_NAME_NOT_FOUND);
- }
- RtlInitAnsiString(&ProcName, "DiskDumpFunctions");
- MmCoreDumpFunctions = MiFindExportedRoutineByName(BaseAddress,
- &ProcName);
- if (!NT_SUCCESS(Status))
- {
- ObDereferenceObject(PageFile);
- return(Status);
- }
-
- /* Prepare for disk dumping. */
- Status = MmCoreDumpFunctions->DumpPrepare(PageFileDevice,
- &MmCoreDumpPointers);
- if (!NT_SUCCESS(Status))
- {
- ObDereferenceObject(PageFile);
- return(Status);
- }
-
- MmCoreDumpPageFile = PageFileNum;
- ObDereferenceObject(PageFile);
- return(STATUS_SUCCESS);
}
NTSTATUS NTAPI
@@ -1135,13 +853,6 @@
MiPagingFileCount++;
KeReleaseSpinLock(&PagingFileListLock, oldIrql);
- /* Check whether this pagefile can be a crash dump target. */
- if (MmCoreDumpType != MM_CORE_DUMP_TYPE_NONE &&
- PagingFile->CurrentSize.QuadPart >= MmCoreDumpSize &&
- MmCoreDumpPageFile == 0xFFFFFFFF)
- {
- MmInitializeCrashDump(FileHandle, i);
- }
ZwClose(FileHandle);
MmSwapSpaceMessage = FALSE;