mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 17:27:03 +00:00
[NTOS:CC][NTOS:MM] Try respecting ValidDataLength
This commit is contained in:
parent
bdb73edab7
commit
5949d5095d
6 changed files with 56 additions and 5 deletions
|
@ -504,6 +504,24 @@ CcCopyRead (
|
||||||
CurrentOffset = FileOffset->QuadPart;
|
CurrentOffset = FileOffset->QuadPart;
|
||||||
while(CurrentOffset < ReadEnd)
|
while(CurrentOffset < ReadEnd)
|
||||||
{
|
{
|
||||||
|
if (CurrentOffset >= SharedCacheMap->ValidDataLength.QuadPart)
|
||||||
|
{
|
||||||
|
DPRINT1("Zeroing buffer because we are beyond the VDL.\n");
|
||||||
|
/* We are beyond what is valid. Just zero this out */
|
||||||
|
_SEH2_TRY
|
||||||
|
{
|
||||||
|
RtlZeroMemory(Buffer, Length);
|
||||||
|
}
|
||||||
|
_SEH2_EXCEPT(CcpCheckInvalidUserBuffer(_SEH2_GetExceptionInformation(), Buffer, Length))
|
||||||
|
{
|
||||||
|
ExRaiseStatus(STATUS_INVALID_USER_BUFFER);
|
||||||
|
}
|
||||||
|
_SEH2_END;
|
||||||
|
|
||||||
|
ReadLength += Length;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
Status = CcRosGetVacb(SharedCacheMap, CurrentOffset, &Vacb);
|
Status = CcRosGetVacb(SharedCacheMap, CurrentOffset, &Vacb);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
|
@ -598,7 +616,7 @@ CcCopyWrite (
|
||||||
PROS_SHARED_CACHE_MAP SharedCacheMap = FileObject->SectionObjectPointer->SharedCacheMap;
|
PROS_SHARED_CACHE_MAP SharedCacheMap = FileObject->SectionObjectPointer->SharedCacheMap;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
LONGLONG CurrentOffset;
|
LONGLONG CurrentOffset;
|
||||||
LONGLONG WriteEnd = FileOffset->QuadPart + Length;
|
LONGLONG WriteEnd;
|
||||||
|
|
||||||
CCTRACE(CC_API_DEBUG, "FileObject=%p FileOffset=%I64d Length=%lu Wait=%d Buffer=%p\n",
|
CCTRACE(CC_API_DEBUG, "FileObject=%p FileOffset=%I64d Length=%lu Wait=%d Buffer=%p\n",
|
||||||
FileObject, FileOffset->QuadPart, Length, Wait, Buffer);
|
FileObject, FileOffset->QuadPart, Length, Wait, Buffer);
|
||||||
|
@ -610,7 +628,11 @@ CcCopyWrite (
|
||||||
if (!SharedCacheMap)
|
if (!SharedCacheMap)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
ASSERT((FileOffset->QuadPart + Length) <= SharedCacheMap->SectionSize.QuadPart);
|
Status = RtlLongLongAdd(FileOffset->QuadPart, Length, &WriteEnd);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
ExRaiseStatus(Status);
|
||||||
|
|
||||||
|
ASSERT(WriteEnd <= SharedCacheMap->SectionSize.QuadPart);
|
||||||
|
|
||||||
CurrentOffset = FileOffset->QuadPart;
|
CurrentOffset = FileOffset->QuadPart;
|
||||||
while(CurrentOffset < WriteEnd)
|
while(CurrentOffset < WriteEnd)
|
||||||
|
@ -662,6 +684,10 @@ CcCopyWrite (
|
||||||
if (FileObject->Flags & FO_WRITE_THROUGH)
|
if (FileObject->Flags & FO_WRITE_THROUGH)
|
||||||
CcFlushCache(FileObject->SectionObjectPointer, FileOffset, Length, NULL);
|
CcFlushCache(FileObject->SectionObjectPointer, FileOffset, Length, NULL);
|
||||||
|
|
||||||
|
/* Update VDL */
|
||||||
|
if (WriteEnd > SharedCacheMap->ValidDataLength.QuadPart)
|
||||||
|
SharedCacheMap->ValidDataLength.QuadPart = WriteEnd;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -871,6 +897,14 @@ CcZeroData (
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* See if we should simply truncate the valid data length */
|
||||||
|
if ((StartOffset->QuadPart < SharedCacheMap->ValidDataLength.QuadPart) && (EndOffset->QuadPart > SharedCacheMap->ValidDataLength.QuadPart))
|
||||||
|
{
|
||||||
|
DPRINT1("Truncating VDL.\n");
|
||||||
|
SharedCacheMap->ValidDataLength = *StartOffset;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
ASSERT(EndOffset->QuadPart <= SharedCacheMap->SectionSize.QuadPart);
|
ASSERT(EndOffset->QuadPart <= SharedCacheMap->SectionSize.QuadPart);
|
||||||
|
|
||||||
while(WriteOffset.QuadPart < EndOffset->QuadPart)
|
while(WriteOffset.QuadPart < EndOffset->QuadPart)
|
||||||
|
|
|
@ -297,6 +297,7 @@ CcSetFileSizes (
|
||||||
OldSectionSize = SharedCacheMap->SectionSize;
|
OldSectionSize = SharedCacheMap->SectionSize;
|
||||||
SharedCacheMap->SectionSize = FileSizes->AllocationSize;
|
SharedCacheMap->SectionSize = FileSizes->AllocationSize;
|
||||||
SharedCacheMap->FileSize = FileSizes->FileSize;
|
SharedCacheMap->FileSize = FileSizes->FileSize;
|
||||||
|
SharedCacheMap->ValidDataLength = FileSizes->ValidDataLength;
|
||||||
KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, OldIrql);
|
KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, OldIrql);
|
||||||
|
|
||||||
if (FileSizes->AllocationSize.QuadPart < OldSectionSize.QuadPart)
|
if (FileSizes->AllocationSize.QuadPart < OldSectionSize.QuadPart)
|
||||||
|
|
|
@ -543,6 +543,7 @@ CcSetDirtyPinnedData (
|
||||||
IN PLARGE_INTEGER Lsn)
|
IN PLARGE_INTEGER Lsn)
|
||||||
{
|
{
|
||||||
PINTERNAL_BCB iBcb = CONTAINING_RECORD(Bcb, INTERNAL_BCB, PFCB);
|
PINTERNAL_BCB iBcb = CONTAINING_RECORD(Bcb, INTERNAL_BCB, PFCB);
|
||||||
|
PROS_SHARED_CACHE_MAP SharedCacheMap = iBcb->Vacb->SharedCacheMap;
|
||||||
|
|
||||||
CCTRACE(CC_API_DEBUG, "Bcb=%p Lsn=%p\n", Bcb, Lsn);
|
CCTRACE(CC_API_DEBUG, "Bcb=%p Lsn=%p\n", Bcb, Lsn);
|
||||||
|
|
||||||
|
@ -555,6 +556,10 @@ CcSetDirtyPinnedData (
|
||||||
{
|
{
|
||||||
CcRosMarkDirtyVacb(iBcb->Vacb);
|
CcRosMarkDirtyVacb(iBcb->Vacb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Update VDL */
|
||||||
|
if (SharedCacheMap->ValidDataLength.QuadPart < (iBcb->PFCB.MappedFileOffset.QuadPart + iBcb->PFCB.MappedLength))
|
||||||
|
SharedCacheMap->ValidDataLength.QuadPart = iBcb->PFCB.MappedFileOffset.QuadPart + iBcb->PFCB.MappedLength;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1182,6 +1182,7 @@ CcRosInitializeFileCache (
|
||||||
SharedCacheMap->LazyWriteContext = LazyWriterContext;
|
SharedCacheMap->LazyWriteContext = LazyWriterContext;
|
||||||
SharedCacheMap->SectionSize = FileSizes->AllocationSize;
|
SharedCacheMap->SectionSize = FileSizes->AllocationSize;
|
||||||
SharedCacheMap->FileSize = FileSizes->FileSize;
|
SharedCacheMap->FileSize = FileSizes->FileSize;
|
||||||
|
SharedCacheMap->ValidDataLength = FileSizes->ValidDataLength;
|
||||||
SharedCacheMap->PinAccess = PinAccess;
|
SharedCacheMap->PinAccess = PinAccess;
|
||||||
SharedCacheMap->DirtyPageThreshold = 0;
|
SharedCacheMap->DirtyPageThreshold = 0;
|
||||||
SharedCacheMap->DirtyPages = 0;
|
SharedCacheMap->DirtyPages = 0;
|
||||||
|
|
|
@ -175,6 +175,7 @@ typedef struct _ROS_SHARED_CACHE_MAP
|
||||||
LARGE_INTEGER FileSize;
|
LARGE_INTEGER FileSize;
|
||||||
LIST_ENTRY BcbList;
|
LIST_ENTRY BcbList;
|
||||||
LARGE_INTEGER SectionSize;
|
LARGE_INTEGER SectionSize;
|
||||||
|
LARGE_INTEGER ValidDataLength;
|
||||||
PFILE_OBJECT FileObject;
|
PFILE_OBJECT FileObject;
|
||||||
ULONG DirtyPages;
|
ULONG DirtyPages;
|
||||||
LIST_ENTRY SharedCacheMapLinks;
|
LIST_ENTRY SharedCacheMapLinks;
|
||||||
|
|
|
@ -1167,11 +1167,13 @@ MiCopyFromUserPage(PFN_NUMBER DestPage, const VOID *SrcAddress)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NEWCC
|
#ifndef NEWCC
|
||||||
|
static
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
MiReadPage(PMEMORY_AREA MemoryArea,
|
MiReadPage(PMEMORY_AREA MemoryArea,
|
||||||
LONGLONG SegOffset,
|
LONGLONG SegOffset,
|
||||||
PPFN_NUMBER Page)
|
PPFN_NUMBER Page,
|
||||||
|
BOOLEAN IgnoreSize)
|
||||||
/*
|
/*
|
||||||
* FUNCTION: Read a page for a section backed memory area.
|
* FUNCTION: Read a page for a section backed memory area.
|
||||||
* PARAMETERS:
|
* PARAMETERS:
|
||||||
|
@ -1188,6 +1190,7 @@ MiReadPage(PMEMORY_AREA MemoryArea,
|
||||||
PFILE_OBJECT FileObject = MemoryArea->SectionData.Segment->FileObject;
|
PFILE_OBJECT FileObject = MemoryArea->SectionData.Segment->FileObject;
|
||||||
LARGE_INTEGER FileOffset;
|
LARGE_INTEGER FileOffset;
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
|
PFSRTL_ADVANCED_FCB_HEADER FcbHeader = FileObject->FsContext;
|
||||||
|
|
||||||
FileOffset.QuadPart = MemoryArea->SectionData.Segment->Image.FileOffset + SegOffset;
|
FileOffset.QuadPart = MemoryArea->SectionData.Segment->Image.FileOffset + SegOffset;
|
||||||
|
|
||||||
|
@ -1197,6 +1200,12 @@ MiReadPage(PMEMORY_AREA MemoryArea,
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
return Status;
|
return Status;
|
||||||
|
|
||||||
|
if ((FileOffset.QuadPart > FcbHeader->ValidDataLength.QuadPart) && !IgnoreSize)
|
||||||
|
{
|
||||||
|
/* Quick path : data is not valid; return a zero-page */
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
RtlZeroMemory(MdlBase, sizeof(MdlBase));
|
RtlZeroMemory(MdlBase, sizeof(MdlBase));
|
||||||
MmInitializeMdl(Mdl, NULL, PAGE_SIZE);
|
MmInitializeMdl(Mdl, NULL, PAGE_SIZE);
|
||||||
MmBuildMdlFromPages(Mdl, Page);
|
MmBuildMdlFromPages(Mdl, Page);
|
||||||
|
@ -1616,7 +1625,7 @@ MmNotPresentFaultSectionView(PMMSUPPORT AddressSpace,
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
DPRINT("Getting fresh page for file %wZ at offset %I64d.\n", &Segment->FileObject->FileName, Offset.QuadPart);
|
DPRINT("Getting fresh page for file %wZ at offset %I64d.\n", &Segment->FileObject->FileName, Offset.QuadPart);
|
||||||
Status = MiReadPage(MemoryArea, Offset.QuadPart, &Page);
|
Status = MiReadPage(MemoryArea, Offset.QuadPart, &Page, FALSE);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT1("MiReadPage failed (Status %x)\n", Status);
|
DPRINT1("MiReadPage failed (Status %x)\n", Status);
|
||||||
|
@ -4592,7 +4601,7 @@ MmMakePagesResident(
|
||||||
|
|
||||||
/* FIXME: Read the whole range at once instead of one page at a time */
|
/* FIXME: Read the whole range at once instead of one page at a time */
|
||||||
/* Ignore file size, as Cc already checked on its side. */
|
/* Ignore file size, as Cc already checked on its side. */
|
||||||
Status = MiReadPage(MemoryArea, SegmentOffset.QuadPart, &Page);
|
Status = MiReadPage(MemoryArea, SegmentOffset.QuadPart, &Page, TRUE);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
/* Reset the Segment entry and fail */
|
/* Reset the Segment entry and fail */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue