Author: pschweitzer
Date: Fri Sep 15 11:49:55 2017
New Revision: 75844

URL: http://svn.reactos.org/svn/reactos?rev=75844&view=rev
Log:
[NTOSKRNL]
Fix the way the paging IO MDLs are issued by Cc on read.
Similar to r75834.
Fixes tests from r75842.

Modified:
    trunk/reactos/ntoskrnl/cc/copy.c

Modified: trunk/reactos/ntoskrnl/cc/copy.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cc/copy.c?rev=75844&r1=75843&r2=75844&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/cc/copy.c    [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/cc/copy.c    [iso-8859-1] Fri Sep 15 11:49:55 2017
@@ -86,14 +86,29 @@
         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)
-    {
-        KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
-        Status = IoStatus.Status;
+    Status = STATUS_SUCCESS;
+    _SEH2_TRY
+    {
+        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);


Reply via email to