79 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 DPRINT1(
"MM BALANCER: %s\n",
Priority ?
"Paging out!" :
"Removing access bit!");
148 while (CurrentPage != 0 &&
Target > 0)
296 *AllocatedPage =
Page;
305 PVOID WaitObjects[2];
325 ULONG InitialTarget = 0;
329 ULONG OldTarget = InitialTarget;
338 if (InitialTarget != 0 &&
339 InitialTarget == OldTarget)
345 while (InitialTarget != 0);
352 DPRINT1(
"KeWaitForMultipleObjects failed, status = %x\n",
Status);
VOID NTAPI MmDereferencePage(PFN_NUMBER Page)
VOID NTAPI MmRebalanceMemoryConsumers(VOID)
VOID NTAPI MmInitializeMemoryConsumer(ULONG Consumer, NTSTATUS(*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed))
_Must_inspect_result_ typedef _In_ PVOID Unused
#define THREAD_ALL_ACCESS
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
static ULONG MiMinimumPagesPerRun
#define PsGetCurrentThread()
VOID NTAPI MiBalancerThread(PVOID Unused)
NTKERNELAPI VOID FASTCALL ExReleaseRundownProtection(_Inout_ PEX_RUNDOWN_REF RunRef)
struct _MM_RMAP_ENTRY *NTAPI MmGetRmapListHeadPage(PFN_NUMBER Page)
struct _MM_ALLOCATION_REQUEST MM_ALLOCATION_REQUEST
#define ExAcquireRundownProtection
FORCEINLINE VOID MiLockProcessWorkingSet(IN PEPROCESS Process, IN PETHREAD Thread)
#define LOW_REALTIME_PRIORITY
VOID NTAPI MmInitializeBalancer(ULONG NrAvailablePages, ULONG NrSystemPages)
BOOLEAN NTAPI KeSetTimerEx(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN LONG Period, IN PKDPC Dpc OPTIONAL)
PFN_NUMBER MmAvailablePages
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
static KEVENT MiBalancerEvent
static LONG PageOutThreadActive
#define MiAddressToPte(x)
PFN_NUMBER NTAPI MmGetLRUNextUserPage(PFN_NUMBER PreviousPage, BOOLEAN MoveToLast)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
VOID NTAPI KeStackAttachProcess(IN PKPROCESS Process, OUT PRKAPC_STATE ApcState)
DECLSPEC_NORETURN VOID NTAPI KeBugCheck(ULONG BugCheckCode)
static CLIENT_ID MiBalancerThreadId
struct _MM_ALLOCATION_REQUEST * PMM_ALLOCATION_REQUEST
NTSTATUS NTAPI MmPageOutPhysicalAddress(PFN_NUMBER Page)
NTSTATUS NTAPI NtSetInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, IN PVOID ThreadInformation, IN ULONG ThreadInformationLength)
ULONG NTAPI MiTrimMemoryConsumer(ULONG Consumer, ULONG InitialTarget)
#define NT_SUCCESS(StatCode)
NTSTATUS(* Trim)(ULONG Target, ULONG Priority, PULONG NrFreed)
#define ObDereferenceObject
NTSTATUS NTAPI MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, PPFN_NUMBER AllocatedPage)
#define RMAP_IS_SEGMENT(x)
PFN_NUMBER NTAPI MmAllocPage(ULONG Consumer)
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)
BOOLEAN NTAPI MmIsAddressValid(IN PVOID VirtualAddress)
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY _In_ WDF_INTERRUPT_PRIORITY Priority
#define InterlockedDecrement
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
MM_MEMORY_CONSUMER MiMemoryConsumers[MC_MAXIMUM]
#define InterlockedDecrementUL(Addend)
PFN_NUMBER NTAPI MmGetLRUFirstUserPage(VOID)
NTSTATUS NTAPI MmReleasePageMemoryConsumer(ULONG Consumer, PFN_NUMBER Page)
#define KeInitializeEvent(pEvt, foo, foo2)
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
VOID NTAPI KeUnstackDetachProcess(IN PRKAPC_STATE ApcState)
#define InterlockedIncrementUL(Addend)
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)
_Out_ PKAPC_STATE ApcState
VOID NTAPI MiZeroPhysicalPage(IN PFN_NUMBER PageFrameIndex)
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
VOID NTAPI MiInitBalancerThread(VOID)
#define ObReferenceObject
static HANDLE MiBalancerThreadHandle
static ULONG MiMinimumAvailablePages
NTSTATUS MmTrimUserMemory(ULONG Target, ULONG Priority, PULONG NrFreedPages)
base of all file and directory entries
VOID NTAPI KeInitializeTimerEx(OUT PKTIMER Timer, IN TIMER_TYPE Type)
FORCEINLINE VOID MiUnlockProcessWorkingSet(IN PEPROCESS Process, IN PETHREAD Thread)
static KTIMER MiBalancerTimer