mirror of
https://github.com/reactos/reactos.git
synced 2025-04-05 13:11:22 +00:00
[NTOS:MM] Improve MmCanFileBeTruncated
This commit is contained in:
parent
3e43aa1305
commit
91a4e62376
1 changed files with 12 additions and 30 deletions
|
@ -4077,54 +4077,36 @@ BOOLEAN NTAPI
|
|||
MmCanFileBeTruncated (IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
|
||||
IN PLARGE_INTEGER NewFileSize)
|
||||
{
|
||||
KIRQL OldIrql = MiAcquirePfnLock();
|
||||
BOOLEAN Ret;
|
||||
PMM_SECTION_SEGMENT Segment;
|
||||
|
||||
CheckSectionPointer:
|
||||
/* Check whether an ImageSectionObject exists */
|
||||
if (SectionObjectPointer->ImageSectionObject != NULL)
|
||||
{
|
||||
DPRINT1("ERROR: File can't be truncated because it has an image section\n");
|
||||
MiReleasePfnLock(OldIrql);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Segment = (PMM_SECTION_SEGMENT)SectionObjectPointer->DataSectionObject;
|
||||
/* Wait for it to be created/deleted properly */
|
||||
while (Segment && (Segment->SegFlags & (MM_SEGMENT_INCREATE | MM_SEGMENT_INDELETE)))
|
||||
Segment = MiGrabDataSection(SectionObjectPointer);
|
||||
if (!Segment)
|
||||
{
|
||||
LARGE_INTEGER ShortTime;
|
||||
|
||||
ShortTime.QuadPart = -10 * 100 * 1000;
|
||||
|
||||
/* Bad luck. Wait a bit for the operation to finish */
|
||||
MiReleasePfnLock(OldIrql);
|
||||
KeDelayExecutionThread(KernelMode, FALSE, &ShortTime);
|
||||
OldIrql = MiAcquirePfnLock();
|
||||
goto CheckSectionPointer;
|
||||
/* There is no data section. It's fine to do anything. */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (Segment)
|
||||
MmLockSectionSegment(Segment);
|
||||
if ((Segment->SectionCount == 1) && (SectionObjectPointer->SharedCacheMap != NULL))
|
||||
{
|
||||
if ((Segment->SectionCount == 1) && (SectionObjectPointer->SharedCacheMap != NULL))
|
||||
{
|
||||
/* If the cache is the only one holding a reference to the segment, then it's fine to resize */
|
||||
Ret = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* We can't shrink, but we can extend */
|
||||
Ret = NewFileSize->QuadPart >= Segment->RawLength.QuadPart;
|
||||
}
|
||||
/* If the cache is the only one holding a reference to the segment, then it's fine to resize */
|
||||
Ret = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
Ret = TRUE;
|
||||
/* We can't shrink, but we can extend */
|
||||
Ret = NewFileSize->QuadPart >= Segment->RawLength.QuadPart;
|
||||
}
|
||||
|
||||
MiReleasePfnLock(OldIrql);
|
||||
MmUnlockSectionSegment(Segment);
|
||||
MmDereferenceSegment(Segment);
|
||||
|
||||
DPRINT("FIXME: didn't check for outstanding write probes\n");
|
||||
|
||||
|
|
Loading…
Reference in a new issue