From f62d7e0c24d6420604cd6d367567fa272311ce7a Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Fri, 15 Sep 2017 11:49:55 +0000 Subject: [PATCH] [NTOSKRNL] Fix the way the paging IO MDLs are issued by Cc on read. Similar to r75834. Fixes tests from r75842. svn path=/trunk/; revision=75844 --- reactos/ntoskrnl/cc/copy.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/reactos/ntoskrnl/cc/copy.c b/reactos/ntoskrnl/cc/copy.c index 2e2f9624464..3b0e34d7801 100644 --- a/reactos/ntoskrnl/cc/copy.c +++ b/reactos/ntoskrnl/cc/copy.c @@ -86,14 +86,29 @@ CcReadVirtualAddress ( return STATUS_INSUFFICIENT_RESOURCES; } - MmBuildMdlForNonPagedPool(Mdl); - Mdl->MdlFlags |= MDL_IO_PAGE_READ; - KeInitializeEvent(&Event, NotificationEvent, FALSE); - Status = IoPageRead(Vacb->SharedCacheMap->FileObject, Mdl, &Vacb->FileOffset, &Event, &IoStatus); - if (Status == STATUS_PENDING) + Status = STATUS_SUCCESS; + _SEH2_TRY { - KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); - Status = IoStatus.Status; + MmProbeAndLockPages(Mdl, KernelMode, IoWriteAccess); + } + _SEH2_EXCEPT (EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + KeBugCheck(CACHE_MANAGER); + } _SEH2_END; + + if (NT_SUCCESS(Status)) + { + Mdl->MdlFlags |= MDL_IO_PAGE_READ; + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Status = IoPageRead(Vacb->SharedCacheMap->FileObject, Mdl, &Vacb->FileOffset, &Event, &IoStatus); + if (Status == STATUS_PENDING) + { + KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); + Status = IoStatus.Status; + } + + MmUnlockPages(Mdl); } IoFreeMdl(Mdl);