16 #define MODULE_INVOLVED_IN_ARM3 70 if (!
Process->Vm.Flags.SessionLeader)
143 BitmapSize = ((
Size + 31) / 32) *
sizeof(
ULONG);
185 if (
Process->Vm.Flags.SessionLeader == 1)
return 0;
189 if (!SessionGlobal)
return 0;
200 if (
Process->Vm.Flags.SessionLeader == 1)
return 0;
204 if (!SessionGlobal)
return -1;
364 if (ReferenceCount == 0)
371 if ((
Process->Vm.Flags.SessionLeader) || (ReferenceCount == 0))
382 if (
Process->Vm.Flags.SessionLeader)
448 NewProcess->Session = SessionGlobal;
494 AllocatedPageTable =
FALSE;
499 AllocatedPageTable =
TRUE;
511 if (AllocatedPageTable !=
FALSE)
607 #if (_MI_PAGING_LEVELS < 3) 609 #endif // (_MI_PAGING_LEVELS < 3) 612 PMMPTE PointerPte, SessionPte;
634 DPRINT1(
"Lost session race\n");
642 if (NewFlags ==
Flags)
break;
651 #if (_MI_PAGING_LEVELS < 3) 660 #endif // (_MI_PAGING_LEVELS < 3) 670 DPRINT1(
"Too many sessions created. Expansion not yet supported\n");
671 #if (_MI_PAGING_LEVELS < 3) 673 #endif // (_MI_PAGING_LEVELS < 3) 718 if (!SessionPageDirIndex)
739 SessionPageDirIndex);
798 DPRINT1(
"Session %lu is ready to go: 0x%p 0x%p, %lx 0x%p\n",
834 ULONG SessionLeaderExists;
840 DPRINT1(
"Process already in session\n");
845 if (!
Process->Vm.Flags.SessionLeader)
849 if (SessionLeaderExists)
851 DPRINT1(
"Session leader race\n");
898 DPRINT1(
"Not in a session!\n");
903 if (!
Process->Vm.Flags.SessionLeader)
905 DPRINT1(
"Not a session leader!\n");
931 EntryProcess = SessionEntry;
939 EntrySession = EntryProcess->
Session;
967 if (CurrentSession == EntrySession)
999 EntryProcess = SessionEntry;
1007 EntrySession = EntryProcess->
Session;
1040 EntryProcess = SessionEntry;
1070 ListEntry = ListEntry->
Flink;
1080 SessionProcessLinks);
PFN_NUMBER MiSessionTagSizePages
#define KeGetCurrentIrql()
VOID NTAPI MiDereferenceSessionFinal(VOID)
#define PspClearProcessFlag(Process, Flag)
union _MM_SESSION_SPACE::@1806 u
#define MI_SESSION_TAG_PAGES_MAXIMUM
#define MiAddressToPde(x)
FORCEINLINE KIRQL MiAcquireExpansionLock(VOID)
USHORT UsedPageTableEntries[768]
#define PSF_SESSION_CREATION_UNDERWAY_BIT
VOID FASTCALL KeAcquireGuardedMutex(IN PKGUARDED_MUTEX GuardedMutex)
KSPIN_LOCK MmExpansionLock
LONG ProcessReferenceToSession
PMMPTE NTAPI MiReserveSystemPtes(IN ULONG NumberOfPtes, IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType)
#define MI_IS_SESSION_ADDRESS(Address)
struct _LIST_ENTRY * Blink
struct _MMPFN::@1778::@1784 e2
PFN_NUMBER MiSessionCreateCharge
NTSYSAPI void WINAPI RtlInitializeBitMap(PRTL_BITMAP, PULONG, ULONG)
VOID NTAPI MiSessionAddProcess(IN PEPROCESS NewProcess)
PMM_SESSION_SPACE MmSessionSpace
#define MI_GET_NEXT_COLOR()
LCID NTAPI MmGetSessionLocaleId(VOID)
LCID PsDefaultSystemLocaleId
HARDWARE_PDE_ARMV6 TempPde
FORCEINLINE KIRQL MiAcquirePfnLock(VOID)
#define InterlockedCompareExchange
IN PVOID IN PVOID IN USHORT IN USHORT Size
PFN_NUMBER MmLowestPhysicalPage
BOOLEAN NTAPI MmIsSessionAddress(IN PVOID Address)
#define RtlCheckBit(BMH, BP)
VOID NTAPI MiInitializePfnForOtherProcess(IN PFN_NUMBER PageFrameIndex, IN PVOID PteAddress, IN PFN_NUMBER PteFrame)
KGUARDED_MUTEX MiSessionIdMutex
VOID NTAPI MiZeroPhysicalPage(IN PFN_NUMBER PageFrameIndex)
ULONG MinimumWorkingSetSize
#define PSF_PROCESS_IN_SESSION_BIT
#define InsertTailList(ListHead, Entry)
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
LCID PsDefaultThreadLocaleId
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
LIST_ENTRY MmWorkingSetExpansionHead
VOID NTAPI MiSessionRemoveProcess(VOID)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
ULONG NTAPI MmGetSessionId(IN PEPROCESS Process)
FORCEINLINE VOID MiReleasePfnLock(_In_ KIRQL OldIrql)
NTSTATUS NTAPI MmSessionDelete(IN ULONG SessionId)
PFN_NUMBER MiSessionTagPages
#define STATUS_ALREADY_COMMITTED
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
#define MI_MAKE_DIRTY_PAGE(x)
PDRIVER_UNLOAD Win32KDriverUnload
VOID NTAPI MiSessionLeader(IN PEPROCESS Process)
#define MiAddressToPte(x)
volatile LONG MiSessionLeaderExists
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
FORCEINLINE VOID MI_WRITE_VALID_PTE(IN PMMPTE PointerPte, IN MMPTE TempPte)
VOID NTAPI KeStackAttachProcess(IN PKPROCESS Process, OUT PRKAPC_STATE ApcState)
_IRQL_requires_max_(APC_LEVEL)
#define RtlInterlockedClearBits(Flags, Flag)
NTSTATUS NTAPI MiSessionInitializeWorkingSetList(VOID)
#define PsGetCurrentProcess
FORCEINLINE PFN_NUMBER MiRemoveZeroPageSafe(IN ULONG Color)
PETHREAD MiExpansionLockOwner
VOID NTAPI MiInitializeSessionIds(VOID)
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
NTSYSAPI ULONG WINAPI RtlFindClearBitsAndSet(PRTL_BITMAP, ULONG, ULONG)
#define ExInitializePushLock
VOID NTAPI MiDecrementShareCount(IN PMMPFN Pfn1, IN PFN_NUMBER PageFrameIndex)
FORCEINLINE VOID MI_WRITE_VALID_PDE(IN PMMPDE PointerPde, IN MMPDE TempPde)
VOID NTAPI MiReleaseSystemPtes(IN PMMPTE StartingPte, IN ULONG NumberOfPtes, IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType)
NTSTATUS NTAPI MiSessionCreateInternal(OUT PULONG SessionId)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
VOID NTAPI KeFlushEntireTb(IN BOOLEAN Invalid, IN BOOLEAN AllProcessors)
#define STATUS_UNABLE_TO_FREE_VM
struct _LIST_ENTRY * Flink
EX_PUSH_LOCK WorkingSetMutex
VOID NTAPI MiDereferenceSession(VOID)
MM_SESSION_SPACE_FLAGS Flags
struct _MM_SESSION_SPACE * GlobalVirtualAddress
_Must_inspect_result_ _In_ ULONG Flags
LIST_ENTRY WorkingSetExpansionLinks
VOID FASTCALL KeZeroPages(IN PVOID Address, IN ULONG Size)
PRTL_BITMAP MiSessionIdBitmap
#define NT_SUCCESS(StatCode)
_In_ WDFCOLLECTION _In_ ULONG Index
BOOLEAN NTAPI MiInitializeSystemSpaceMap(IN PMMSESSION InputSession OPTIONAL)
MMPTE ValidKernelPteLocal
PFN_NUMBER MiSessionDataPages
#define STATUS_PROCESS_IS_TERMINATING
#define ObDereferenceObject
#define MI_SESSION_DATA_PAGES_MAXIMUM
VOID NTAPI RtlClearBit(_In_ PRTL_BITMAP BitMapHeader, _In_ BITMAP_INDEX BitNumber)
HARDWARE_PTE_ARMV6 TempPte
BOOLEAN NTAPI MmIsAddressValid(IN PVOID VirtualAddress)
#define ExAllocatePoolWithTag(hernya, size, tag)
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_ PCUNICODE_STRING _In_ PCUNICODE_STRING _In_ LCID LocaleId
#define BYTES_TO_PAGES(Size)
FORCEINLINE PMMPFN MI_PFN_ELEMENT(IN PFN_NUMBER Pfn)
#define InterlockedDecrement
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
#define MI_INITIAL_SESSION_IDS
#define KeEnterCriticalRegion()
PVOID NTAPI MmGetSessionById(_In_ ULONG SessionId)
LIST_ENTRY MiSessionWsList
MMPTE ValidKernelPdeLocal
PFN_NUMBER NTAPI MiRemoveAnyPage(IN ULONG Color)
VOID NTAPI MiReleaseProcessReferenceToSessionDataPage(IN PMM_SESSION_SPACE SessionGlobal)
#define MI_SET_PFN_DELETED(x)
PFN_COUNT MmNumberOfPhysicalPages
VOID FASTCALL KeInitializeGuardedMutex(OUT PKGUARDED_MUTEX GuardedMutex)
#define KeLeaveCriticalRegion()
#define KeInitializeEvent(pEvt, foo, foo2)
#define InterlockedIncrement
ULONG NTAPI MmGetSessionIdEx(IN PEPROCESS 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 ROUND_TO_PAGES(Size)
VOID NTAPI KeUnstackDetachProcess(IN PRKAPC_STATE ApcState)
#define InitializeListHead(ListHead)
_Out_ PKAPC_STATE ApcState
LONG ResidentProcessCount
FORCEINLINE VOID MiReleaseExpansionLock(KIRQL OldIrql)
NTSYSAPI void WINAPI RtlClearAllBits(PRTL_BITMAP)
VOID FASTCALL KeReleaseGuardedMutex(IN OUT PKGUARDED_MUTEX GuardedMutex)
struct _MM_SESSION_SPACE * PMM_SESSION_SPACE
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
#define ObReferenceObject
#define PspSetProcessFlag(Process, Flag)
VOID NTAPI MiInitializePfnAndMakePteValid(IN PFN_NUMBER PageFrameIndex, IN PMMPTE PointerPte, IN MMPTE TempPte)
#define STATUS_INVALID_SYSTEM_SERVICE
#define RtlZeroMemory(Destination, Length)
NTSTATUS NTAPI MmSessionCreate(OUT PULONG SessionId)
VOID NTAPI MiInitializeSessionWsSupport(VOID)
PFN_NUMBER MmHighestPhysicalPage
#define ExFreePoolWithTag(_P, _T)
FORCEINLINE PVOID MiPteToAddress(PMMPTE PointerPte)
ULONG MaximumWorkingSetSize
FORCEINLINE BOOLEAN MI_IS_PHYSICAL_ADDRESS(IN PVOID Address)
PFN_NUMBER MiSessionBigPoolPages
VOID NTAPI MmQuitNextSession(_Inout_ PVOID SessionEntry)
VOID NTAPI KeBugCheckEx(_In_ ULONG BugCheckCode, _In_ ULONG_PTR BugCheckParameter1, _In_ ULONG_PTR BugCheckParameter2, _In_ ULONG_PTR BugCheckParameter3, _In_ ULONG_PTR BugCheckParameter4)
PFN_NUMBER SessionPageDirectoryIndex