From 73fd52a164ac9f2cc50462295ec2f5eb23450a25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Wed, 10 Feb 2021 11:06:44 +0100 Subject: [PATCH] [NTOS:MM] Flush dirty pages after closing the page files. CORE-17462 --- ntoskrnl/mm/shutdown.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/ntoskrnl/mm/shutdown.c b/ntoskrnl/mm/shutdown.c index 89beca88fac..1d08a4f4166 100644 --- a/ntoskrnl/mm/shutdown.c +++ b/ntoskrnl/mm/shutdown.c @@ -24,8 +24,20 @@ MiShutdownSystem(VOID) PFN_NUMBER Page; BOOLEAN Dirty; + /* Loop through all the paging files */ + for (i = 0; i < MmNumberOfPagingFiles; i++) + { + /* Free page file name */ + ASSERT(MmPagingFile[i]->PageFileName.Buffer != NULL); + ExFreePoolWithTag(MmPagingFile[i]->PageFileName.Buffer, TAG_MM); + MmPagingFile[i]->PageFileName.Buffer = NULL; + + /* And close them */ + ZwClose(MmPagingFile[i]->FileHandle); + } + /* Loop through all the pages owned by the legacy Mm and page them out, if needed. */ - /* We do it twice, since flushing can cause the FS to dirtify new pages */ + /* We do it as long as there are dirty pages, since flushing can cause the FS to dirtify new ones. */ do { Dirty = FALSE; @@ -59,20 +71,6 @@ MiShutdownSystem(VOID) Page = MmGetLRUNextUserPage(Page, FALSE); } } while (Dirty); - - /* Loop through all the paging files */ - for (i = 0; i < MmNumberOfPagingFiles; i++) - { - /* Free page file name */ - ASSERT(MmPagingFile[i]->PageFileName.Buffer != NULL); - ExFreePoolWithTag(MmPagingFile[i]->PageFileName.Buffer, TAG_MM); - MmPagingFile[i]->PageFileName.Buffer = NULL; - - /* And close them */ - ZwClose(MmPagingFile[i]->FileHandle); - } - - UNIMPLEMENTED; } VOID