Use the same method pagefile.c does to read in a page without mapping it.

svn path=/trunk/; revision=56025
This commit is contained in:
Art Yerkes 2012-03-05 04:34:06 +00:00
parent 4d698f45aa
commit bd9aa57445

View file

@ -51,6 +51,10 @@
#define DPRINTC DPRINT #define DPRINTC DPRINT
VOID
NTAPI
MmBuildMdlFromPages(PMDL Mdl, PPFN_NUMBER Pages);
NTSTATUS NTSTATUS
NTAPI NTAPI
MiGetOnePage MiGetOnePage
@ -91,13 +95,11 @@ MiReadFilePage
PLARGE_INTEGER FileOffset = &RequiredResources->FileOffset; PLARGE_INTEGER FileOffset = &RequiredResources->FileOffset;
NTSTATUS Status; NTSTATUS Status;
PVOID PageBuf = NULL; PVOID PageBuf = NULL;
KEVENT Event;
IO_STATUS_BLOCK IOSB; IO_STATUS_BLOCK IOSB;
PHYSICAL_ADDRESS BoundaryAddressMultiple; UCHAR MdlBase[sizeof(MDL) + sizeof(ULONG)];
PPFN_NUMBER Pages; PMDL Mdl = (PMDL)MdlBase;
PMDL Mdl; KIRQL OldIrql;
PVOID HyperMap;
BoundaryAddressMultiple.QuadPart = 0;
DPRINTC DPRINTC
("Pulling page %08x%08x from %wZ to %x\n", ("Pulling page %08x%08x from %wZ to %x\n",
@ -112,37 +114,37 @@ MiReadFilePage
return Status; return Status;
} }
HyperMap = MmCreateHyperspaceMapping(*Page); MmInitializeMdl(Mdl, NULL, PAGE_SIZE);
MmBuildMdlFromPages(Mdl, Page);
Mdl->MdlFlags |= MDL_PAGES_LOCKED;
Mdl = IoAllocateMdl(HyperMap, PAGE_SIZE, FALSE, FALSE, NULL); KeInitializeEvent(&Event, NotificationEvent, FALSE);
if (!Mdl) { Status = IoPageRead
MmReleasePageMemoryConsumer(RequiredResources->Consumer, *Page); (FileObject,
return STATUS_NO_MEMORY; 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);
} }
MmInitializeMdl(Mdl, HyperMap, PAGE_SIZE); OldIrql = KfRaiseIrql(DISPATCH_LEVEL);
Pages = (PPFN_NUMBER)(Mdl + 1); PageBuf = MmCreateHyperspaceMapping(*Page);
Pages[0] = *Page;
MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess);
PageBuf = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
MmDeleteHyperspaceMapping(HyperMap);
Status = MiSimpleRead
(FileObject,
FileOffset,
PageBuf,
RequiredResources->Amount,
TRUE,
&IOSB);
RtlZeroMemory RtlZeroMemory
((PCHAR)PageBuf+RequiredResources->Amount, ((PCHAR)PageBuf+RequiredResources->Amount,
PAGE_SIZE-RequiredResources->Amount); PAGE_SIZE-RequiredResources->Amount);
MmDeleteHyperspaceMapping(PageBuf);
KfLowerIrql(OldIrql);
DPRINT("Read Status %x (Page %x)\n", Status, *Page); DPRINT("Read Status %x (Page %x)\n", Status, *Page);
MmUnlockPages(Mdl);
IoFreeMdl(Mdl);
if (!NT_SUCCESS(Status)) if (!NT_SUCCESS(Status))
{ {
MmReleasePageMemoryConsumer(RequiredResources->Consumer, *Page); MmReleasePageMemoryConsumer(RequiredResources->Consumer, *Page);