#define MI_PAGED_POOL_START (PVOID)0xFFFFF8A000000000ULL // 128 GB paged pool [MiVaPagedPool]
//#define MI_PAGED_POOL_END 0xFFFFF8BFFFFFFFFFULL
//#define MI_SESSION_SPACE_START 0xFFFFF90000000000ULL // 512 GB session space [MiVaSessionSpace]
-#define MI_SESSION_VIEW_END 0xFFFFF97FFF000000ULL
-#define MI_SESSION_SPACE_END 0xFFFFF97FFFFFFFFFULL
+//#define MI_SESSION_VIEW_END 0xFFFFF97FFF000000ULL
+#define MI_SESSION_SPACE_END 0xFFFFF98000000000ULL
#define MI_SYSTEM_CACHE_START 0xFFFFF98000000000ULL // 1 TB system cache (on Vista+ this is dynamic VA space) [MiVaSystemCache,MiVaSpecialPoolPaged,MiVaSpecialPoolNonPaged]
#define MI_SYSTEM_CACHE_END 0xFFFFFA7FFFFFFFFFULL
#define MI_PFN_DATABASE 0xFFFFFA8000000000ULL // up to 5.5 TB PFN database followed by non paged pool [MiVaPfnDatabase/MiVaNonPagedPool]
#define MI_MIN_INIT_PAGED_POOLSIZE (32 * _1MB)
#define MI_MAX_INIT_NONPAGED_POOL_SIZE (128ULL * 1024 * 1024 * 1024)
#define MI_MAX_NONPAGED_POOL_SIZE (128ULL * 1024 * 1024 * 1024)
-#define MI_SYSTEM_VIEW_SIZE (16 * _1MB)
-#define MI_SESSION_VIEW_SIZE (20 * _1MB)
-#define MI_SESSION_POOL_SIZE (16 * _1MB)
-#define MI_SESSION_IMAGE_SIZE (8 * _1MB)
-#define MI_SESSION_WORKING_SET_SIZE (4 * _1MB)
+#define MI_SYSTEM_VIEW_SIZE (104 * _1MB)
+#define MI_SESSION_VIEW_SIZE (104 * _1MB)
+#define MI_SESSION_POOL_SIZE (64 * _1MB)
+#define MI_SESSION_IMAGE_SIZE (16 * _1MB)
+#define MI_SESSION_WORKING_SET_SIZE (16 * _1MB)
#define MI_SESSION_SIZE (MI_SESSION_VIEW_SIZE + \
MI_SESSION_POOL_SIZE + \
MI_SESSION_IMAGE_SIZE + \
BOOLEAN
MI_IS_MAPPED_PTE(PMMPTE PointerPte)
{
- /// FIXME
- __debugbreak();
- return ((PointerPte->u.Long & 0xFFFFFC01) != 0);
+ return ((PointerPte->u.Hard.Valid != 0) ||
+ (PointerPte->u.Proto.Prototype != 0) ||
+ (PointerPte->u.Trans.Transition != 0) ||
+ (PointerPte->u.Hard.PageFrameNumber != 0));
}
INIT_FUNCTION
MiSessionCreateInternal(OUT PULONG SessionId)
{
PEPROCESS Process = PsGetCurrentProcess();
- ULONG NewFlags, Flags, Size, i, Color;
+ ULONG NewFlags, Flags, i, Color;
+#if (_MI_PAGING_LEVELS < 3)
+ ULONG Size;
+#endif // (_MI_PAGING_LEVELS < 3)
+ PMMPDE PageTables = NULL;
KIRQL OldIrql;
PMMPTE PointerPte, SessionPte;
- PMMPDE PointerPde, PageTables;
+ PMMPDE PointerPde;
PMM_SESSION_SPACE SessionGlobal;
MMPTE TempPte;
MMPDE TempPde;
/* Now we should own the flag */
ASSERT(Process->Flags & PSF_SESSION_CREATION_UNDERWAY_BIT);
+#if (_MI_PAGING_LEVELS < 3)
/*
* Session space covers everything from 0xA0000000 to 0xC0000000.
* Allocate enough page tables to describe the entire region
PageTables = ExAllocatePoolWithTag(NonPagedPool, Size, 'tHmM');
ASSERT(PageTables != NULL);
RtlZeroMemory(PageTables, Size);
+#endif // (_MI_PAGING_LEVELS < 3)
/* Lock the session ID creation mutex */
KeAcquireGuardedMutex(&MiSessionIdMutex);
{
/* We ran out of session IDs, we should expand */
DPRINT1("Too many sessions created. Expansion not yet supported\n");
+#if (_MI_PAGING_LEVELS < 3)
ExFreePoolWithTag(PageTables, 'tHmM');
+#endif // (_MI_PAGING_LEVELS < 3)
return STATUS_NO_MEMORY;
}
MmSessionSpace->PageTables[PointerPde - MiAddressToPde(MmSessionBase)] = *PointerPde;
#endif
InitializeListHead(&MmSessionSpace->ImageList);
+
DPRINT1("Session %lu is ready to go: 0x%p 0x%p, %lx 0x%p\n",
*SessionId, MmSessionSpace, SessionGlobal, SessionPageDirIndex, PageTables);
#include <debug.h>
#include <mm/ARM3/miarm.h>
+#include <fltkernel.h>
extern PMMPTE MmDebugPte;
/* Helper macros */
-#define IS_ALIGNED(addr, align) (((ULONG64)(addr) & (align - 1)) == 0)
#define IS_PAGE_ALIGNED(addr) IS_ALIGNED(addr, PAGE_SIZE)
/* GLOBALS *****************************************************************/
NTAPI
MiInitializeSessionSpaceLayout(VOID)
{
+ /* This is the entire size */
MmSessionSize = MI_SESSION_SIZE;
- MmSessionViewSize = MI_SESSION_VIEW_SIZE;
- MmSessionPoolSize = MI_SESSION_POOL_SIZE;
- MmSessionImageSize = MI_SESSION_IMAGE_SIZE;
- MmSystemViewSize = MI_SYSTEM_VIEW_SIZE;
- /* Set up session space */
+ /* Start with session space end */
MiSessionSpaceEnd = (PVOID)MI_SESSION_SPACE_END;
- /* This is where we will load Win32k.sys and the video driver */
+ /* The highest range is the session image range */
+ MmSessionImageSize = MI_SESSION_IMAGE_SIZE;
MiSessionImageEnd = MiSessionSpaceEnd;
- MiSessionImageStart = (PCHAR)MiSessionImageEnd - MmSessionImageSize;
+ MiSessionImageStart = (PUCHAR)MiSessionImageEnd - MmSessionImageSize;
+ ASSERT(IS_PAGE_ALIGNED(MiSessionImageStart));
+
+ /* Session working set is below the session image range */
+ MiSessionSpaceWs = (PUCHAR)MiSessionImageStart - MI_SESSION_WORKING_SET_SIZE;
- /* The view starts right below the session working set (itself below
- * the image area) */
- MiSessionViewEnd = (PVOID)MI_SESSION_VIEW_END;
- MiSessionViewStart = (PCHAR)MiSessionViewEnd - MmSessionViewSize;
+ /* Session view is below the session working set */
+ MmSessionViewSize = MI_SESSION_VIEW_SIZE;
+ MiSessionViewEnd = MiSessionSpaceWs;
+ MiSessionViewStart = (PUCHAR)MiSessionViewEnd - MmSessionViewSize;
ASSERT(IS_PAGE_ALIGNED(MiSessionViewStart));
- /* Session pool follows */
+ /* Session pool is below session view */
+ MmSessionPoolSize = MI_SESSION_POOL_SIZE;
MiSessionPoolEnd = MiSessionViewStart;
- MiSessionPoolStart = (PCHAR)MiSessionPoolEnd - MmSessionPoolSize;
+ MiSessionPoolStart = (PUCHAR)MiSessionPoolEnd - MmSessionPoolSize;
ASSERT(IS_PAGE_ALIGNED(MiSessionPoolStart));
/* And it all begins here */
/* System view space ends at session space, so now that we know where
* this is, we can compute the base address of system view space itself. */
- MiSystemViewStart = (PCHAR)MmSessionBase - MmSystemViewSize;
+ MmSystemViewSize = MI_SYSTEM_VIEW_SIZE;
+ MiSystemViewStart = (PUCHAR)MmSessionBase - MmSystemViewSize;
ASSERT(IS_PAGE_ALIGNED(MiSystemViewStart));
/* Sanity checks */
+ ASSERT(Add2Ptr(MmSessionBase, MmSessionSize) == MiSessionSpaceEnd);
ASSERT(MiSessionViewEnd <= MiSessionImageStart);
ASSERT(MmSessionBase <= MiSessionPoolStart);
+
+ /* Compute the PTE addresses for all the addresses we carved out */
+ MiSessionImagePteStart = MiAddressToPte(MiSessionImageStart);
+ MiSessionImagePteEnd = MiAddressToPte(MiSessionImageEnd);
+ MiSessionBasePte = MiAddressToPte(MmSessionBase);
+ MiSessionLastPte = MiAddressToPte(MiSessionSpaceEnd);
+
+ /* Initialize the pointer to the session space structure */
+ MmSessionSpace = (PMM_SESSION_SPACE)Add2Ptr(MiSessionImageStart, 0x10000);
}
VOID