From 662241cc752f68e01ead0b4aa8304196841601b4 Mon Sep 17 00:00:00 2001 From: Pierre Schweitzer Date: Wed, 13 Sep 2017 16:13:21 +0000 Subject: [PATCH] [NTOSKRNL] Don't call MmBuildMdlForNonPagedPool in CcWriteVirtualAddress(): - BaseAddress comes from PagedPood - Windows returns a locked MDL from paged pool - See tests from r75833 that are getting fixed with that revision This fixes assertions failures on BtrFS write. CORE-13763 CORE-13769 svn path=/trunk/; revision=75834 --- reactos/ntoskrnl/cc/copy.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/reactos/ntoskrnl/cc/copy.c b/reactos/ntoskrnl/cc/copy.c index 7575991fe36..2e2f9624464 100644 --- a/reactos/ntoskrnl/cc/copy.c +++ b/reactos/ntoskrnl/cc/copy.c @@ -147,14 +147,30 @@ CcWriteVirtualAddress ( { return STATUS_INSUFFICIENT_RESOURCES; } - MmBuildMdlForNonPagedPool(Mdl); - Mdl->MdlFlags |= MDL_IO_PAGE_READ; - KeInitializeEvent(&Event, NotificationEvent, FALSE); - Status = IoSynchronousPageWrite(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, IoReadAccess); + } + _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 = IoSynchronousPageWrite(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); if (!NT_SUCCESS(Status) && (Status != STATUS_END_OF_FILE))