[NTOS:CC] Honor FO_WRITE_THROUGH flag in CcCopyWrite and fix it in CcZeroData

This commit is contained in:
Jérôme Gardou
2020-12-04 15:45:04 +01:00
parent f8aa14ce4e
commit cd23d6e19a

View File

@@ -556,16 +556,13 @@ CcCopyWrite (
if (!SharedCacheMap)
return FALSE;
/* FIXME: Honor FileObject FO_WRITE_THROUGH flag */
ASSERT((FileOffset->QuadPart + Length) <= SharedCacheMap->SectionSize.QuadPart);
ASSERT((FileObject->Flags & FO_WRITE_THROUGH) == 0);
CurrentOffset = FileOffset->QuadPart;
while(CurrentOffset < WriteEnd)
{
ULONG VacbOffset = CurrentOffset % VACB_MAPPING_GRANULARITY;
ULONG VacbLength = min(Length, VACB_MAPPING_GRANULARITY - VacbOffset);
ULONG VacbLength = min(WriteEnd - CurrentOffset, VACB_MAPPING_GRANULARITY - VacbOffset);
Status = CcRosGetVacb(SharedCacheMap, CurrentOffset, &Vacb);
if (!NT_SUCCESS(Status))
@@ -585,7 +582,6 @@ CcCopyWrite (
Buffer = (PVOID)((ULONG_PTR)Buffer + VacbLength);
CurrentOffset += VacbLength;
Length -= VacbLength;
/* Tell Mm */
Status = MmMakePagesDirty(NULL, Add2Ptr(Vacb->BaseAddress, VacbOffset), VacbLength);
@@ -600,6 +596,10 @@ CcCopyWrite (
_SEH2_END;
}
/* Flush if needed */
if (FileObject->Flags & FO_WRITE_THROUGH)
CcFlushCache(FileObject->SectionObjectPointer, FileOffset, Length, NULL);
return TRUE;
}
@@ -757,7 +757,7 @@ CcZeroData (
Length = EndOffset->QuadPart - StartOffset->QuadPart;
WriteOffset.QuadPart = StartOffset->QuadPart;
if (!SharedCacheMap || (FileObject->Flags & FO_WRITE_THROUGH))
if (!SharedCacheMap)
{
/* Make this a non-cached write */
IO_STATUS_BLOCK Iosb;
@@ -848,5 +848,9 @@ CcZeroData (
_SEH2_END;
}
/* Flush if needed */
if (FileObject->Flags & FO_WRITE_THROUGH)
CcFlushCache(FileObject->SectionObjectPointer, StartOffset, EndOffset->QuadPart - StartOffset->QuadPart, NULL);
return TRUE;
}