70 lines
1.6 KiB
C++
70 lines
1.6 KiB
C++
/*
|
|
* 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 <ntoskrnl.hpp>
|
|
|
|
|
|
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;
|
|
}; |