mirror of
https://github.com/reactos/reactos.git
synced 2025-06-12 02:08:30 +00:00
[NEWCC]
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:
parent
4d698f45aa
commit
bd9aa57445
1 changed files with 33 additions and 31 deletions
58
reactos/ntoskrnl/cache/section/reqtools.c
vendored
58
reactos/ntoskrnl/cache/section/reqtools.c
vendored
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue