[ros-diffs] [arty] 56025: [NEWCC] Use the same method pagefile.c does to read in a page without mapping it.

arty at svn.reactos.org arty at svn.reactos.org
Mon Mar 5 04:34:07 UTC 2012


Author: arty
Date: Mon Mar  5 04:34:06 2012
New Revision: 56025

URL: http://svn.reactos.org/svn/reactos?rev=56025&view=rev
Log:
[NEWCC]
Use the same method pagefile.c does to read in a page without mapping it.

Modified:
    trunk/reactos/ntoskrnl/cache/section/reqtools.c

Modified: trunk/reactos/ntoskrnl/cache/section/reqtools.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/cache/section/reqtools.c?rev=56025&r1=56024&r2=56025&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/cache/section/reqtools.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/cache/section/reqtools.c [iso-8859-1] Mon Mar  5 04:34:06 2012
@@ -51,6 +51,10 @@
 
 #define DPRINTC DPRINT
 
+VOID
+NTAPI
+MmBuildMdlFromPages(PMDL Mdl, PPFN_NUMBER Pages);
+
 NTSTATUS
 NTAPI
 MiGetOnePage
@@ -90,14 +94,12 @@
 	PPFN_NUMBER Page = &RequiredResources->Page[RequiredResources->Offset];
 	PLARGE_INTEGER FileOffset = &RequiredResources->FileOffset;
 	NTSTATUS Status;
-	PVOID PageBuf = NULL;
+    PVOID PageBuf = NULL;
+    KEVENT Event;
 	IO_STATUS_BLOCK IOSB;
-	PHYSICAL_ADDRESS BoundaryAddressMultiple;
-	PPFN_NUMBER Pages;
-	PMDL Mdl;
-	PVOID HyperMap;
-
-	BoundaryAddressMultiple.QuadPart = 0;
+    UCHAR MdlBase[sizeof(MDL) + sizeof(ULONG)];
+    PMDL Mdl = (PMDL)MdlBase;
+    KIRQL OldIrql;
 
 	DPRINTC
 		("Pulling page %08x%08x from %wZ to %x\n", 
@@ -112,36 +114,36 @@
 		return Status;
 	}
 
-	HyperMap = MmCreateHyperspaceMapping(*Page);
-
-	Mdl = IoAllocateMdl(HyperMap, PAGE_SIZE, FALSE, FALSE, NULL);
-	if (!Mdl) {
-		MmReleasePageMemoryConsumer(RequiredResources->Consumer, *Page);
-		return STATUS_NO_MEMORY;
-	}
-
-	MmInitializeMdl(Mdl, HyperMap, PAGE_SIZE);
-	Pages = (PPFN_NUMBER)(Mdl + 1);
-	Pages[0] = *Page;
-	MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess);
-	PageBuf = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
-	MmDeleteHyperspaceMapping(HyperMap);
+    MmInitializeMdl(Mdl, NULL, PAGE_SIZE);
+    MmBuildMdlFromPages(Mdl, Page);
+    Mdl->MdlFlags |= MDL_PAGES_LOCKED;
 		 
-	Status = MiSimpleRead
-		(FileObject, 
-		 FileOffset,
-		 PageBuf,
-		 RequiredResources->Amount,
-		 TRUE,
-		 &IOSB);
+    KeInitializeEvent(&Event, NotificationEvent, FALSE);
+    Status = IoPageRead
+        (FileObject,
+         Mdl,
+         FileOffset,
+         &Event,
+         &IOSB);
+    if (Status == STATUS_PENDING)
+    {
+        KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL);
+        Status = IOSB.Status;
+    }
+    if (Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA)
+    {
+        MmUnmapLockedPages (Mdl->MappedSystemVa, Mdl);
+    }
+
+    OldIrql = KfRaiseIrql(DISPATCH_LEVEL);
+    PageBuf = MmCreateHyperspaceMapping(*Page);
 	RtlZeroMemory
 		((PCHAR)PageBuf+RequiredResources->Amount,
 		 PAGE_SIZE-RequiredResources->Amount);
+    MmDeleteHyperspaceMapping(PageBuf);
+    KfLowerIrql(OldIrql);
 	
 	DPRINT("Read Status %x (Page %x)\n", Status, *Page);
-
-	MmUnlockPages(Mdl);
-	IoFreeMdl(Mdl);
 
 	if (!NT_SUCCESS(Status))
 	{




More information about the Ros-diffs mailing list