/* * PROJECT: Alcyone System Kernel * LICENSE: BSD Clause 3 * PURPOSE: Cache Controller:: Lazy Writer * NT KERNEL: 5.11.9360 * COPYRIGHT: 2023-2029 Dibymartanda Samanta <> */ #include "debug.hpp" #include BOOL NTAPI IsGoToNextMap(IN PSHARED_CACHE_MAP SharedMap, IN ULONG TargetPages) { BOOLEAN Skip = FALSE; if (SharedMap->Flags & (0x20 | 0x800)) return TRUE; if ((SharedMap->OpenCount || SharedMap->DirtyPages) && SharedMap->FileSize.QuadPart) { Skip = TRUE; } if (!SharedMap->DirtyPages && Skip) return TRUE; if (SharedMap->Flags & SHARE_FL_WAITING_TEARDOWN) return FALSE; if (!TargetPages && Skip) return TRUE; SharedMap->LazyWritePassCount++; if ((SharedMap->LazyWritePassCount & 0xF) && (SharedMap->Flags & SHARE_FL_MODIFIED_NO_WRITE) && CcCapturedSystemSize != MmSmallSystem && SharedMap->DirtyPages < 0x40 && Skip) { return TRUE; } if ((SharedMap->FileObject->Flags & 0x8000) && SharedMap->OpenCount && CcCanIWrite(SharedMap->FileObject, 0x40000, 0, 0xFF) && Skip) { return TRUE; } return FALSE; } /* Later Move it to XDK */ class SpinLockSharedGuard { public: SpinLockSharedGuard(PEX_SPIN_LOCK SpinLock) : m_SpinLock(SpinLock) { m_OldIrql = ExAcquireSpinLockShared(m_SpinLock); } ~SpinLockSharedGuard() { ExReleaseSpinLockShared(m_SpinLock, m_OldIrql); } SpinLockSharedGuard(const SpinLockSharedGuard&) = delete; SpinLockSharedGuard& operator=(const SpinLockSharedGuard&) = delete; private: PEX_SPIN_LOCK m_SpinLock; KIRQL m_OldIrql; };