78 DPRINT1(
"Tried to release page zero.\n");
99 ULONG NrFreedPages = 0;
106 return InitialTarget;
125 DPRINT(
"Trimming consumer %lu: Freed %lu pages with a target of %lu pages\n", Consumer, NrFreedPages,
Target);
134 return (InitialTarget > NrFreedPages) ? (InitialTarget - NrFreedPages) : 0;
145 DPRINT(
"MM BALANCER: %s\n",
Priority ?
"Paging out!" :
"Removing access bit!");
148 CurrentPage = FirstPage;
149 while (CurrentPage != 0 &&
Target > 0)
159 if (CurrentPage == FirstPage)
254 if (CurrentPage == FirstPage)
269 FirstPage = CurrentPage;
271 else if (CurrentPage == FirstPage)
273 DPRINT1(
"We are back at the start, abort!\n");
338 *AllocatedPage =
Page;
356 PVOID WaitObjects[2];
376 ULONG InitialTarget = 0;
382 ULONG OldTarget = InitialTarget;
395 InitialTarget -=
min(NrFreedPages, InitialTarget);
399 if (InitialTarget != 0 &&
400 InitialTarget == OldTarget)
406 while (InitialTarget != 0);
417 DPRINT1(
"KeWaitForMultipleObjects failed, status = %x\n",
Status);
#define InterlockedExchange
DECLSPEC_NORETURN VOID NTAPI KeBugCheck(ULONG BugCheckCode)
#define NT_SUCCESS(StatCode)
#define PsGetCurrentThread()
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeSetEvent(pEvt, foo, foo2)
#define KeGetCurrentIrql()
#define KeDelayExecutionThread(mode, foo, t)
LONG NTAPI KeResetEvent(IN PKEVENT Event)
#define InterlockedDecrementUL(Addend)
#define ExReleaseRundownProtection
#define InterlockedIncrementUL(Addend)
#define ExAcquireRundownProtection
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define KeGetCurrentThread
#define LOW_REALTIME_PRIORITY
#define InterlockedCompareExchange
FORCEINLINE VOID MiUnlockProcessWorkingSet(IN PEPROCESS Process, IN PETHREAD Thread)
FORCEINLINE BOOLEAN MM_ANY_WS_LOCK_HELD(IN PETHREAD Thread)
FORCEINLINE VOID MiLockProcessWorkingSet(IN PEPROCESS Process, IN PETHREAD Thread)
BOOLEAN NTAPI MmIsAddressValid(IN PVOID VirtualAddress)
#define MiAddressToPte(x)
#define THREAD_ALL_ACCESS
#define DBG_UNREFERENCED_LOCAL_VARIABLE(L)
PFN_NUMBER NTAPI MmAllocPage(ULONG Consumer)
struct _MM_RMAP_ENTRY *NTAPI MmGetRmapListHeadPage(PFN_NUMBER Page)
VOID NTAPI MmDereferencePage(PFN_NUMBER Page)
#define RMAP_IS_SEGMENT(x)
_In_ PVOID _Out_opt_ BOOLEAN _Out_opt_ PPFN_NUMBER Page
PFN_NUMBER NTAPI MmGetLRUFirstUserPage(VOID)
FORCEINLINE VOID UpdateTotalCommittedPages(LONG Delta)
_Out_ PKAPC_STATE ApcState
PFN_NUMBER MmAvailablePages
PFN_NUMBER NTAPI MmGetLRUNextUserPage(PFN_NUMBER PreviousPage, BOOLEAN MoveToLast)
NTSTATUS NTAPI MmPageOutPhysicalAddress(PFN_NUMBER Page)
NTSTATUS NTAPI KeWaitForMultipleObjects(IN ULONG Count, IN PVOID Object[], IN WAIT_TYPE WaitType, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL, OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL)
static HANDLE MiBalancerThreadHandle
static KTIMER MiBalancerTimer
static KEVENT MiBalancerDoneEvent
static CLIENT_ID MiBalancerThreadId
MM_MEMORY_CONSUMER MiMemoryConsumers[MC_MAXIMUM]
VOID NTAPI MiBalancerThread(PVOID Unused)
VOID NTAPI MiZeroPhysicalPage(IN PFN_NUMBER PageFrameIndex)
static ULONG MiMinimumAvailablePages
VOID NTAPI MmRebalanceMemoryConsumers(VOID)
struct _MM_ALLOCATION_REQUEST MM_ALLOCATION_REQUEST
VOID NTAPI MmInitializeBalancer(ULONG NrAvailablePages, ULONG NrSystemPages)
static KEVENT MiBalancerEvent
ULONG NTAPI MiTrimMemoryConsumer(ULONG Consumer, ULONG InitialTarget)
struct _MM_ALLOCATION_REQUEST * PMM_ALLOCATION_REQUEST
NTSTATUS MmTrimUserMemory(ULONG Target, ULONG Priority, PULONG NrFreedPages)
VOID NTAPI MiInitBalancerThread(VOID)
NTSTATUS NTAPI MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, PPFN_NUMBER AllocatedPage)
VOID CcRosTrimCache(_In_ ULONG Target, _Out_ PULONG NrFreed)
VOID NTAPI MmRebalanceMemoryConsumersAndWait(VOID)
VOID NTAPI MmInitializeMemoryConsumer(ULONG Consumer, NTSTATUS(*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed))
static LONG PageOutThreadActive
static ULONG MiMinimumPagesPerRun
NTSTATUS NTAPI MmReleasePageMemoryConsumer(ULONG Consumer, PFN_NUMBER Page)
NTSTATUS NTAPI NtSetInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, IN PVOID ThreadInformation, IN ULONG ThreadInformationLength)
NTSTATUS NTAPI PsCreateSystemThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE ProcessHandle, IN PCLIENT_ID ClientId, IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext)
VOID NTAPI KeStackAttachProcess(IN PKPROCESS Process, OUT PRKAPC_STATE ApcState)
VOID NTAPI KeUnstackDetachProcess(IN PRKAPC_STATE ApcState)
static LARGE_INTEGER TinyTime
base of all file and directory entries
NTSTATUS(* Trim)(ULONG Target, ULONG Priority, PULONG NrFreed)
BOOLEAN NTAPI KeSetTimerEx(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN LONG Period, IN PKDPC Dpc OPTIONAL)
VOID NTAPI KeInitializeTimerEx(OUT PKTIMER Timer, IN TIMER_TYPE Type)
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY _In_ WDF_INTERRUPT_PRIORITY Priority
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
#define ObDereferenceObject
#define ObReferenceObject
_In_ ULONG _In_ BOOLEAN Active
#define PsGetCurrentProcess