Filip Navara wrote:
Hartmut Birr wrote:
[cc02.diff] Don't try to map data past the end of file in VFAT.
I think that this patch isn't necessary, because the real problem is in pin.c.
At first I did the same thing as you did in the attached patch. Then I actually followed it by some testing on Windows and _it is possible to map data past the end of file_ with CcMapData. I haven't tried to access the mapped memory though...
I did more testing and the result is the attached patch (comment inside). Does it look ok?
Regards, Filip
Index: section.c =================================================================== --- section.c (revision 13615) +++ section.c (working copy) @@ -866,15 +866,20 @@
FileOffset.QuadPart = SegOffset + SectionData->Segment->FileOffset; Length = PageCount * PAGE_SIZE; - if (SegOffset > SectionData->Segment->RawLength) + + if (SegOffset >= SectionData->Segment->RawLength) { - KEBUGCHECK(0); + /* It is perfectly valid to map area past the end of file with CcMapData + * and then access the pages. In this case the page fault doesn't result + * in I/O request and we get zeroed pages. + */ + return STATUS_SUCCESS; } + if (Length + SegOffset > SectionData->Segment->RawLength) { Length = SectionData->Segment->RawLength - SegOffset; } -
Status = MmspRawReadPages(SectionData->Section->FileObject, SectorSize, @@ -1717,7 +1722,7 @@ Status = MmspReadSectionSegmentPages(SectionData, Offset, PageCount, Pfn); if (!NT_SUCCESS(Status)) { - DPRINT1("MiReadPage failed (Status %x)\n", Status); + DPRINT1("MmspReadSectionSegmentPages failed (Status %x)\n", Status); } MmLockAddressSpace(AddressSpace); if (!NT_SUCCESS(Status))