diff --git a/reactos/ntoskrnl/ex/shutdown.c b/reactos/ntoskrnl/ex/shutdown.c index 08ac17819d8..fc278b49193 100644 --- a/reactos/ntoskrnl/ex/shutdown.c +++ b/reactos/ntoskrnl/ex/shutdown.c @@ -167,13 +167,12 @@ ShutdownThreadMain(PVOID Context) } PspShutdownProcessManager(); - + CmShutdownSystem(); + MiShutdownMemoryManager(); IoShutdownRegisteredFileSystems(); IoShutdownRegisteredDevices(); - MiShutdownMemoryManager(); - if (Action == ShutdownNoReboot) { HalDisplayString("\nYou can switch off your computer now\n"); diff --git a/reactos/ntoskrnl/mm/mminit.c b/reactos/ntoskrnl/mm/mminit.c index 42f829fc9e7..07f4ac6cb6b 100644 --- a/reactos/ntoskrnl/mm/mminit.c +++ b/reactos/ntoskrnl/mm/mminit.c @@ -57,6 +57,9 @@ ULONG_PTR MmPfnDatabaseEnd; PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor; MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg; extern KMUTANT MmSystemLoadLock; +extern HANDLE MpwThreadHandle; +extern BOOLEAN MpwThreadShouldTerminate; +extern KEVENT MpwThreadEvent; BOOLEAN MiDbgEnableMdDump = #ifdef _ARM_ TRUE; @@ -70,7 +73,33 @@ VOID NTAPI MiShutdownMemoryManager(VOID) { + ULONG PagesWritten; + PETHREAD Thread; + /* Ask MPW thread to shutdown */ + MpwThreadShouldTerminate = TRUE; + KeSetEvent(&MpwThreadEvent, IO_NO_INCREMENT, FALSE); + + /* Wait for it */ + ObReferenceObjectByHandle(MpwThreadHandle, + THREAD_ALL_ACCESS, + PsThreadType, + KernelMode, + (PVOID*)&Thread, + NULL); + + KeWaitForSingleObject(Thread, + Executive, + KernelMode, + FALSE, + NULL); + + ObDereferenceObject(Thread); + + /* Check if there are any dirty pages, and flush them. + There will be no other chance to do this later, since filesystems + are going to be shut down. */ + CcRosFlushDirtyPages(128, &PagesWritten); } VOID @@ -401,13 +430,10 @@ MmInit1(VOID) MmPagedPoolBase = (PVOID)PAGE_ROUND_UP((ULONG_PTR)MiNonPagedPoolStart + MiNonPagedPoolLength); MmPagedPoolSize = MM_PAGED_POOL_SIZE; - /* Dump kernel memory layout */ MiDbgKernelLayout(); - /* Initialize the page list */ MmInitializePageList(); - /* Unmap low memory */ MmDeletePageTable(NULL, 0); diff --git a/reactos/ntoskrnl/mm/mpw.c b/reactos/ntoskrnl/mm/mpw.c index 95c04535016..93ff145cc6d 100644 --- a/reactos/ntoskrnl/mm/mpw.c +++ b/reactos/ntoskrnl/mm/mpw.c @@ -17,10 +17,10 @@ /* GLOBALS *******************************************************************/ -static HANDLE MpwThreadHandle; +HANDLE MpwThreadHandle; static CLIENT_ID MpwThreadId; -static KEVENT MpwThreadEvent; -static volatile BOOLEAN MpwThreadShouldTerminate; +KEVENT MpwThreadEvent; +BOOLEAN MpwThreadShouldTerminate; /* FUNCTIONS *****************************************************************/