Kernel base address and system space start can be distinct addresses, so use KERNEL_BASE and MmSystemRangeStart accordingly in the code.

svn path=/trunk/; revision=16447
This commit is contained in:
Filip Navara 2005-07-06 08:20:26 +00:00
parent d64e8b4096
commit 2773203033
12 changed files with 83 additions and 92 deletions

View file

@ -22,8 +22,6 @@
#define PA_SYSTEM (0) #define PA_SYSTEM (0)
#endif #endif
#define KERNEL_BASE (ULONG)MmSystemRangeStart
#if defined(__GNUC__) #if defined(__GNUC__)
#define FLUSH_TLB { \ #define FLUSH_TLB { \

View file

@ -308,6 +308,8 @@ extern LARGE_INTEGER SystemBootTime;
/* INITIALIZATION FUNCTIONS *************************************************/ /* INITIALIZATION FUNCTIONS *************************************************/
extern ULONG_PTR KERNEL_BASE;
VOID KeInitExceptions(VOID); VOID KeInitExceptions(VOID);
VOID KeInitInterrupts(VOID); VOID KeInitInterrupts(VOID);
VOID KeInitTimer(VOID); VOID KeInitTimer(VOID);

View file

@ -135,7 +135,7 @@ KiRosPrintAddress(PVOID address)
current_entry = current_entry->Flink; current_entry = current_entry->Flink;
} }
address = (PVOID)((ULONG_PTR)address & ~KERNEL_BASE); address = (PVOID)((ULONG_PTR)address & ~(ULONG_PTR)MmSystemRangeStart);
} while(++i <= 1); } while(++i <= 1);
return(FALSE); return(FALSE);

View file

@ -22,18 +22,6 @@
ULONG NtMajorVersion = 5; ULONG NtMajorVersion = 5;
ULONG NtMinorVersion = 0; ULONG NtMinorVersion = 0;
ULONG NtOSCSDVersion = BUILD_OSCSDVERSION(6, 0); ULONG NtOSCSDVersion = BUILD_OSCSDVERSION(6, 0);
#ifdef __GNUC__
ULONG EXPORTED NtBuildNumber = KERNEL_VERSION_BUILD;
ULONG EXPORTED NtGlobalFlag = 0;
CHAR EXPORTED KeNumberProcessors;
KAFFINITY EXPORTED KeActiveProcessors;
LOADER_PARAMETER_BLOCK EXPORTED KeLoaderBlock;
ULONG EXPORTED KeDcacheFlushCount = 0;
ULONG EXPORTED KeIcacheFlushCount = 0;
ULONG EXPORTED KiDmaIoCoherency = 0; /* RISC Architectures only */
ULONG EXPORTED InitSafeBootMode = 0; /* KB83764 */
#else
/* Microsoft-style declarations */
EXPORTED ULONG NtBuildNumber = KERNEL_VERSION_BUILD; EXPORTED ULONG NtBuildNumber = KERNEL_VERSION_BUILD;
EXPORTED ULONG NtGlobalFlag = 0; EXPORTED ULONG NtGlobalFlag = 0;
EXPORTED CHAR KeNumberProcessors; EXPORTED CHAR KeNumberProcessors;
@ -43,7 +31,6 @@ EXPORTED ULONG KeDcacheFlushCount = 0;
EXPORTED ULONG KeIcacheFlushCount = 0; EXPORTED ULONG KeIcacheFlushCount = 0;
EXPORTED ULONG KiDmaIoCoherency = 0; /* RISC Architectures only */ EXPORTED ULONG KiDmaIoCoherency = 0; /* RISC Architectures only */
EXPORTED ULONG InitSafeBootMode = 0; /* KB83764 */ EXPORTED ULONG InitSafeBootMode = 0; /* KB83764 */
#endif /* __GNUC__ */
LOADER_MODULE KeLoaderModules[64]; LOADER_MODULE KeLoaderModules[64];
static CHAR KeLoaderModuleStrings[64][256]; static CHAR KeLoaderModuleStrings[64][256];
@ -69,6 +56,9 @@ ULONG trap_stack_top;
/* Cached modules from the loader block */ /* Cached modules from the loader block */
PLOADER_MODULE CachedModules[MaximumCachedModuleType]; PLOADER_MODULE CachedModules[MaximumCachedModuleType];
extern unsigned int _image_base__;
ULONG_PTR KERNEL_BASE = (ULONG_PTR)&_image_base__;
/* FUNCTIONS ****************************************************************/ /* FUNCTIONS ****************************************************************/
/* /*

View file

@ -73,7 +73,7 @@ MmInitializeAddressSpace(PEPROCESS Process,
} }
else else
{ {
AddressSpace->LowestAddress = (PVOID)KERNEL_BASE; AddressSpace->LowestAddress = MmSystemRangeStart;
} }
AddressSpace->Process = Process; AddressSpace->Process = Process;
if (Process != NULL) if (Process != NULL)

View file

@ -105,7 +105,7 @@ MiFlushTlb(PULONG Pt, PVOID Address)
MiFlushTlbIpiRoutine(Address); MiFlushTlbIpiRoutine(Address);
} }
#else #else
if ((Pt && MmUnmapPageTable(Pt)) || Address >= (PVOID)KERNEL_BASE) if ((Pt && MmUnmapPageTable(Pt)) || Address >= MmSystemRangeStart)
{ {
FLUSH_TLB_ONE(Address); FLUSH_TLB_ONE(Address);
} }
@ -226,7 +226,7 @@ NTSTATUS Mmi386ReleaseMmInfo(PEPROCESS Process)
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
{ {
PageDir = (PULONGLONG)MmCreateHyperspaceMapping(PAE_PTE_TO_PFN(PageDirTable[i])); PageDir = (PULONGLONG)MmCreateHyperspaceMapping(PAE_PTE_TO_PFN(PageDirTable[i]));
if (i < PAE_ADDR_TO_PDTE_OFFSET(KERNEL_BASE)) if (i < PAE_ADDR_TO_PDTE_OFFSET(MmSystemRangeStart))
{ {
for (j = 0; j < 512; j++) for (j = 0; j < 512; j++)
{ {
@ -274,7 +274,7 @@ NTSTATUS Mmi386ReleaseMmInfo(PEPROCESS Process)
PULONG Pde; PULONG Pde;
PULONG PageDir; PULONG PageDir;
PageDir = MmCreateHyperspaceMapping(PTE_TO_PFN(Process->Pcb.DirectoryTableBase.u.LowPart)); PageDir = MmCreateHyperspaceMapping(PTE_TO_PFN(Process->Pcb.DirectoryTableBase.u.LowPart));
for (i = 0; i < ADDR_TO_PDE_OFFSET(KERNEL_BASE); i++) for (i = 0; i < ADDR_TO_PDE_OFFSET(MmSystemRangeStart); i++)
{ {
if (PageDir[i] != 0) if (PageDir[i] != 0)
{ {
@ -358,7 +358,7 @@ MmCopyMmInfo(PEPROCESS Src,
PageDirTable[i] = PAE_PFN_TO_PTE(Pfn[1+i]) | PA_PRESENT; PageDirTable[i] = PAE_PFN_TO_PTE(Pfn[1+i]) | PA_PRESENT;
} }
MmDeleteHyperspaceMapping(PageDirTable); MmDeleteHyperspaceMapping(PageDirTable);
for (i = PAE_ADDR_TO_PDTE_OFFSET(KERNEL_BASE); i < 4; i++) for (i = PAE_ADDR_TO_PDTE_OFFSET(MmSystemRangeStart); i < 4; i++)
{ {
PageDir = (PULONGLONG)MmCreateHyperspaceMapping(Pfn[i+1]); PageDir = (PULONGLONG)MmCreateHyperspaceMapping(Pfn[i+1]);
memcpy(PageDir, &MmGlobalKernelPageDirectoryForPAE[i * 512], 512 * sizeof(ULONGLONG)); memcpy(PageDir, &MmGlobalKernelPageDirectoryForPAE[i * 512], 512 * sizeof(ULONGLONG));
@ -382,9 +382,9 @@ MmCopyMmInfo(PEPROCESS Src,
PULONG PageDirectory; PULONG PageDirectory;
PageDirectory = MmCreateHyperspaceMapping(Pfn[0]); PageDirectory = MmCreateHyperspaceMapping(Pfn[0]);
memcpy(PageDirectory + ADDR_TO_PDE_OFFSET(KERNEL_BASE), memcpy(PageDirectory + ADDR_TO_PDE_OFFSET(MmSystemRangeStart),
MmGlobalKernelPageDirectory + ADDR_TO_PDE_OFFSET(KERNEL_BASE), MmGlobalKernelPageDirectory + ADDR_TO_PDE_OFFSET(MmSystemRangeStart),
(1024 - ADDR_TO_PDE_OFFSET(KERNEL_BASE)) * sizeof(ULONG)); (1024 - ADDR_TO_PDE_OFFSET(MmSystemRangeStart)) * sizeof(ULONG));
DPRINT("Addr %x\n",ADDR_TO_PDE_OFFSET(PAGETABLE_MAP)); DPRINT("Addr %x\n",ADDR_TO_PDE_OFFSET(PAGETABLE_MAP));
PageDirectory[ADDR_TO_PDE_OFFSET(PAGETABLE_MAP)] = PFN_TO_PTE(Pfn[0]) | PA_PRESENT | PA_READWRITE; PageDirectory[ADDR_TO_PDE_OFFSET(PAGETABLE_MAP)] = PFN_TO_PTE(Pfn[0]) | PA_PRESENT | PA_READWRITE;
@ -416,7 +416,7 @@ VOID MmDeletePageTable(PEPROCESS Process, PVOID Address)
{ {
*(ADDR_TO_PDE(Address)) = 0; *(ADDR_TO_PDE(Address)) = 0;
} }
if (Address >= (PVOID)KERNEL_BASE) if (Address >= MmSystemRangeStart)
{ {
KEBUGCHECK(0); KEBUGCHECK(0);
// MmGlobalKernelPageDirectory[ADDR_TO_PDE_OFFSET(Address)] = 0; // MmGlobalKernelPageDirectory[ADDR_TO_PDE_OFFSET(Address)] = 0;
@ -474,7 +474,7 @@ VOID MmFreePageTable(PEPROCESS Process, PVOID Address)
} }
MiFlushTlb(NULL, Address); MiFlushTlb(NULL, Address);
if (Address >= (PVOID)KERNEL_BASE) if (Address >= MmSystemRangeStart)
{ {
// MmGlobalKernelPageDirectory[ADDR_TO_PDE_OFFSET(Address)] = 0; // MmGlobalKernelPageDirectory[ADDR_TO_PDE_OFFSET(Address)] = 0;
KEBUGCHECK(0); KEBUGCHECK(0);
@ -506,7 +506,7 @@ MmGetPageTableForProcessForPAE(PEPROCESS Process, PVOID Address, BOOLEAN Create)
{ {
KEBUGCHECK(0); KEBUGCHECK(0);
} }
if (Address < (PVOID)KERNEL_BASE && Process && Process != PsGetCurrentProcess()) if (Address < MmSystemRangeStart && Process && Process != PsGetCurrentProcess())
{ {
PageDirTable = MmCreateHyperspaceMapping(PAE_PTE_TO_PFN(Process->Pcb.DirectoryTableBase.QuadPart)); PageDirTable = MmCreateHyperspaceMapping(PAE_PTE_TO_PFN(Process->Pcb.DirectoryTableBase.QuadPart));
if (PageDirTable == NULL) if (PageDirTable == NULL)
@ -556,7 +556,7 @@ MmGetPageTableForProcessForPAE(PEPROCESS Process, PVOID Address, BOOLEAN Create)
PageDir = PAE_ADDR_TO_PDE(Address); PageDir = PAE_ADDR_TO_PDE(Address);
if (0LL == ExfInterlockedCompareExchange64UL(PageDir, &ZeroEntry, &ZeroEntry)) if (0LL == ExfInterlockedCompareExchange64UL(PageDir, &ZeroEntry, &ZeroEntry))
{ {
if (Address >= (PVOID)KERNEL_BASE) if (Address >= MmSystemRangeStart)
{ {
if (MmGlobalKernelPageDirectoryForPAE[PAE_ADDR_TO_PDE_OFFSET(Address)] == 0LL) if (MmGlobalKernelPageDirectoryForPAE[PAE_ADDR_TO_PDE_OFFSET(Address)] == 0LL)
{ {
@ -612,7 +612,7 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create)
ULONG Entry; ULONG Entry;
PULONG Pt, PageDir; PULONG Pt, PageDir;
if (Address < (PVOID)KERNEL_BASE && Process && Process != PsGetCurrentProcess()) if (Address < MmSystemRangeStart && Process && Process != PsGetCurrentProcess())
{ {
PageDir = MmCreateHyperspaceMapping(PTE_TO_PFN(Process->Pcb.DirectoryTableBase.QuadPart)); PageDir = MmCreateHyperspaceMapping(PTE_TO_PFN(Process->Pcb.DirectoryTableBase.QuadPart));
if (PageDir == NULL) if (PageDir == NULL)
@ -653,7 +653,7 @@ MmGetPageTableForProcess(PEPROCESS Process, PVOID Address, BOOLEAN Create)
PageDir = ADDR_TO_PDE(Address); PageDir = ADDR_TO_PDE(Address);
if (0 == InterlockedCompareExchangeUL(PageDir, 0, 0)) if (0 == InterlockedCompareExchangeUL(PageDir, 0, 0))
{ {
if (Address >= (PVOID)KERNEL_BASE) if (Address >= MmSystemRangeStart)
{ {
if (0 == InterlockedCompareExchangeUL(&MmGlobalKernelPageDirectory[PdeOffset], 0, 0)) if (0 == InterlockedCompareExchangeUL(&MmGlobalKernelPageDirectory[PdeOffset], 0, 0))
{ {
@ -1024,7 +1024,7 @@ MmDeleteVirtualMapping(PEPROCESS Process, PVOID Address, BOOL FreePage,
*/ */
if (Process != NULL && WasValid && if (Process != NULL && WasValid &&
Process->AddressSpace.PageTableRefCountTable != NULL && Process->AddressSpace.PageTableRefCountTable != NULL &&
Address < (PVOID)KERNEL_BASE) Address < MmSystemRangeStart)
{ {
PUSHORT Ptrc; PUSHORT Ptrc;
ULONG Idx; ULONG Idx;
@ -1072,7 +1072,7 @@ MmDeletePageFileMapping(PEPROCESS Process, PVOID Address,
*/ */
if (Process != NULL && Pte && if (Process != NULL && Pte &&
Process->AddressSpace.PageTableRefCountTable != NULL && Process->AddressSpace.PageTableRefCountTable != NULL &&
Address < (PVOID)KERNEL_BASE) Address < MmSystemRangeStart)
{ {
PUSHORT Ptrc; PUSHORT Ptrc;
@ -1116,7 +1116,7 @@ MmDeletePageFileMapping(PEPROCESS Process, PVOID Address,
*/ */
if (Process != NULL && Pte && if (Process != NULL && Pte &&
Process->AddressSpace.PageTableRefCountTable != NULL && Process->AddressSpace.PageTableRefCountTable != NULL &&
Address < (PVOID)KERNEL_BASE) Address < MmSystemRangeStart)
{ {
PUSHORT Ptrc; PUSHORT Ptrc;
@ -1193,7 +1193,7 @@ BOOLEAN MmIsDirtyPage(PEPROCESS Process, PVOID Address)
BOOLEAN BOOLEAN
MmIsAccessedAndResetAccessPage(PEPROCESS Process, PVOID Address) MmIsAccessedAndResetAccessPage(PEPROCESS Process, PVOID Address)
{ {
if (Address < (PVOID)KERNEL_BASE && Process == NULL) if (Address < MmSystemRangeStart && Process == NULL)
{ {
DPRINT1("MmIsAccessedAndResetAccessPage is called for user space without a process.\n"); DPRINT1("MmIsAccessedAndResetAccessPage is called for user space without a process.\n");
KEBUGCHECK(0); KEBUGCHECK(0);
@ -1258,7 +1258,7 @@ MmIsAccessedAndResetAccessPage(PEPROCESS Process, PVOID Address)
VOID MmSetCleanPage(PEPROCESS Process, PVOID Address) VOID MmSetCleanPage(PEPROCESS Process, PVOID Address)
{ {
if (Address < (PVOID)KERNEL_BASE && Process == NULL) if (Address < MmSystemRangeStart && Process == NULL)
{ {
DPRINT1("MmSetCleanPage is called for user space without a process.\n"); DPRINT1("MmSetCleanPage is called for user space without a process.\n");
KEBUGCHECK(0); KEBUGCHECK(0);
@ -1321,7 +1321,7 @@ VOID MmSetCleanPage(PEPROCESS Process, PVOID Address)
VOID MmSetDirtyPage(PEPROCESS Process, PVOID Address) VOID MmSetDirtyPage(PEPROCESS Process, PVOID Address)
{ {
if (Address < (PVOID)KERNEL_BASE && Process == NULL) if (Address < MmSystemRangeStart && Process == NULL)
{ {
DPRINT1("MmSetDirtyPage is called for user space without a process.\n"); DPRINT1("MmSetDirtyPage is called for user space without a process.\n");
KEBUGCHECK(0); KEBUGCHECK(0);
@ -1475,7 +1475,7 @@ MmCreateVirtualMappingForKernel(PVOID Address,
DPRINT("MmCreateVirtualMappingForKernel(%x, %x, %x, %d)\n", DPRINT("MmCreateVirtualMappingForKernel(%x, %x, %x, %d)\n",
Address, flProtect, Pages, PageCount); Address, flProtect, Pages, PageCount);
if (Address < (PVOID)KERNEL_BASE) if (Address < MmSystemRangeStart)
{ {
DPRINT1("MmCreateVirtualMappingForKernel is called for user space\n"); DPRINT1("MmCreateVirtualMappingForKernel is called for user space\n");
KEBUGCHECK(0); KEBUGCHECK(0);
@ -1592,12 +1592,12 @@ MmCreatePageFileMapping(PEPROCESS Process,
PVOID Address, PVOID Address,
SWAPENTRY SwapEntry) SWAPENTRY SwapEntry)
{ {
if (Process == NULL && Address < (PVOID)KERNEL_BASE) if (Process == NULL && Address < MmSystemRangeStart)
{ {
DPRINT1("No process\n"); DPRINT1("No process\n");
KEBUGCHECK(0); KEBUGCHECK(0);
} }
if (Process != NULL && Address >= (PVOID)KERNEL_BASE) if (Process != NULL && Address >= MmSystemRangeStart)
{ {
DPRINT1("Setting kernel address with process context\n"); DPRINT1("Setting kernel address with process context\n");
KEBUGCHECK(0); KEBUGCHECK(0);
@ -1661,7 +1661,7 @@ MmCreatePageFileMapping(PEPROCESS Process,
} }
if (Process != NULL && if (Process != NULL &&
Process->AddressSpace.PageTableRefCountTable != NULL && Process->AddressSpace.PageTableRefCountTable != NULL &&
Address < (PVOID)KERNEL_BASE) Address < MmSystemRangeStart)
{ {
PUSHORT Ptrc; PUSHORT Ptrc;
ULONG Idx; ULONG Idx;
@ -1692,7 +1692,7 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process,
if (Process == NULL) if (Process == NULL)
{ {
if (Address < (PVOID)KERNEL_BASE) if (Address < MmSystemRangeStart)
{ {
DPRINT1("No process\n"); DPRINT1("No process\n");
KEBUGCHECK(0); KEBUGCHECK(0);
@ -1706,13 +1706,14 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process,
} }
else else
{ {
if (Address >= (PVOID)KERNEL_BASE) if (Address >= MmSystemRangeStart)
{ {
DPRINT1("Setting kernel address with process context\n"); DPRINT1("Setting kernel address with process context\n");
KEBUGCHECK(0); KEBUGCHECK(0);
} }
if (PageCount > KERNEL_BASE / PAGE_SIZE || if (PageCount > (ULONG_PTR)MmSystemRangeStart / PAGE_SIZE ||
(ULONG_PTR) Address / PAGE_SIZE + PageCount > KERNEL_BASE / PAGE_SIZE) (ULONG_PTR) Address / PAGE_SIZE + PageCount >
(ULONG_PTR)MmSystemRangeStart / PAGE_SIZE)
{ {
DPRINT1("Page Count to large\n"); DPRINT1("Page Count to large\n");
KEBUGCHECK(0); KEBUGCHECK(0);
@ -1725,7 +1726,7 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process,
NoExecute = TRUE; NoExecute = TRUE;
} }
Attributes &= 0xfff; Attributes &= 0xfff;
if (Address >= (PVOID)KERNEL_BASE) if (Address >= MmSystemRangeStart)
{ {
Attributes &= ~PA_USER; Attributes &= ~PA_USER;
if (Ke386GlobalPagesEnabled) if (Ke386GlobalPagesEnabled)
@ -1786,7 +1787,7 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process,
{ {
MmMarkPageUnmapped(PAE_PTE_TO_PFN((Pte))); MmMarkPageUnmapped(PAE_PTE_TO_PFN((Pte)));
} }
if (Address < (PVOID)KERNEL_BASE && if (Address < MmSystemRangeStart &&
Process->AddressSpace.PageTableRefCountTable != NULL && Process->AddressSpace.PageTableRefCountTable != NULL &&
Attributes & PA_PRESENT) Attributes & PA_PRESENT)
{ {
@ -1798,7 +1799,7 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process,
} }
if (Pte != 0LL) if (Pte != 0LL)
{ {
if (Address > (PVOID)KERNEL_BASE || if (Address > MmSystemRangeStart ||
(Pt >= (PULONGLONG)PAGETABLE_MAP && Pt < (PULONGLONG)PAGETABLE_MAP + 4*512*512)) (Pt >= (PULONGLONG)PAGETABLE_MAP && Pt < (PULONGLONG)PAGETABLE_MAP + 4*512*512))
{ {
MiFlushTlb((PULONG)Pt, Address); MiFlushTlb((PULONG)Pt, Address);
@ -1851,7 +1852,7 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process,
MmMarkPageUnmapped(PTE_TO_PFN((Pte))); MmMarkPageUnmapped(PTE_TO_PFN((Pte)));
} }
InterlockedExchangeUL(Pt, PFN_TO_PTE(Pages[i]) | Attributes); InterlockedExchangeUL(Pt, PFN_TO_PTE(Pages[i]) | Attributes);
if (Address < (PVOID)KERNEL_BASE && if (Address < MmSystemRangeStart &&
Process->AddressSpace.PageTableRefCountTable != NULL && Process->AddressSpace.PageTableRefCountTable != NULL &&
Attributes & PA_PRESENT) Attributes & PA_PRESENT)
{ {
@ -1863,7 +1864,7 @@ MmCreateVirtualMappingUnsafe(PEPROCESS Process,
} }
if (Pte != 0) if (Pte != 0)
{ {
if (Address > (PVOID)KERNEL_BASE || if (Address > MmSystemRangeStart ||
(Pt >= (PULONG)PAGETABLE_MAP && Pt < (PULONG)PAGETABLE_MAP + 1024*1024)) (Pt >= (PULONG)PAGETABLE_MAP && Pt < (PULONG)PAGETABLE_MAP + 1024*1024))
{ {
MiFlushTlb(Pt, Address); MiFlushTlb(Pt, Address);
@ -1963,7 +1964,7 @@ MmSetPageProtect(PEPROCESS Process, PVOID Address, ULONG flProtect)
NoExecute = TRUE; NoExecute = TRUE;
} }
Attributes &= 0xfff; Attributes &= 0xfff;
if (Address >= (PVOID)KERNEL_BASE) if (Address >= MmSystemRangeStart)
{ {
Attributes &= ~PA_USER; Attributes &= ~PA_USER;
if (Ke386GlobalPagesEnabled) if (Ke386GlobalPagesEnabled)
@ -2233,7 +2234,7 @@ VOID MmUpdatePageDir(PEPROCESS Process, PVOID Address, ULONG Size)
{ {
ULONG StartOffset, EndOffset, Offset; ULONG StartOffset, EndOffset, Offset;
if (Address < (PVOID)KERNEL_BASE) if (Address < MmSystemRangeStart)
{ {
KEBUGCHECK(0); KEBUGCHECK(0);
} }
@ -2322,7 +2323,7 @@ MmInitGlobalKernelPageDirectory(VOID)
if (Ke386Pae) if (Ke386Pae)
{ {
PULONGLONG CurrentPageDirectory = (PULONGLONG)PAE_PAGEDIRECTORY_MAP; PULONGLONG CurrentPageDirectory = (PULONGLONG)PAE_PAGEDIRECTORY_MAP;
for (i = PAE_ADDR_TO_PDE_OFFSET(KERNEL_BASE); i < 4 * 512; i++) for (i = PAE_ADDR_TO_PDE_OFFSET(MmSystemRangeStart); i < 4 * 512; i++)
{ {
if (!(i >= PAE_ADDR_TO_PDE_OFFSET(PAGETABLE_MAP) && i < PAE_ADDR_TO_PDE_OFFSET(PAGETABLE_MAP) + 4) && if (!(i >= PAE_ADDR_TO_PDE_OFFSET(PAGETABLE_MAP) && i < PAE_ADDR_TO_PDE_OFFSET(PAGETABLE_MAP) + 4) &&
!(i >= PAE_ADDR_TO_PDE_OFFSET(HYPERSPACE) && i < PAE_ADDR_TO_PDE_OFFSET(HYPERSPACE) + 2) && !(i >= PAE_ADDR_TO_PDE_OFFSET(HYPERSPACE) && i < PAE_ADDR_TO_PDE_OFFSET(HYPERSPACE) + 2) &&
@ -2340,7 +2341,7 @@ MmInitGlobalKernelPageDirectory(VOID)
else else
{ {
PULONG CurrentPageDirectory = (PULONG)PAGEDIRECTORY_MAP; PULONG CurrentPageDirectory = (PULONG)PAGEDIRECTORY_MAP;
for (i = ADDR_TO_PDE_OFFSET(KERNEL_BASE); i < 1024; i++) for (i = ADDR_TO_PDE_OFFSET(MmSystemRangeStart); i < 1024; i++)
{ {
if (i != ADDR_TO_PDE_OFFSET(PAGETABLE_MAP) && if (i != ADDR_TO_PDE_OFFSET(PAGETABLE_MAP) &&
i != ADDR_TO_PDE_OFFSET(HYPERSPACE) && i != ADDR_TO_PDE_OFFSET(HYPERSPACE) &&
@ -2360,7 +2361,7 @@ MmInitGlobalKernelPageDirectory(VOID)
ULONG ULONG
MiGetUserPageDirectoryCount(VOID) MiGetUserPageDirectoryCount(VOID)
{ {
return Ke386Pae ? PAE_ADDR_TO_PDE_OFFSET(KERNEL_BASE) : ADDR_TO_PDE_OFFSET(KERNEL_BASE); return Ke386Pae ? PAE_ADDR_TO_PDE_OFFSET(MmSystemRangeStart) : ADDR_TO_PDE_OFFSET(MmSystemRangeStart);
} }
VOID INIT_FUNCTION VOID INIT_FUNCTION

View file

@ -51,7 +51,7 @@ NTSTATUS MmPageFault(ULONG Cs,
Mode = KernelMode; Mode = KernelMode;
} }
if (Mode == KernelMode && Cr2 >= KERNEL_BASE && if (Mode == KernelMode && Cr2 >= (ULONG_PTR)MmSystemRangeStart &&
Mmi386MakeKernelPageTableGlobal((PVOID)Cr2)) Mmi386MakeKernelPageTableGlobal((PVOID)Cr2))
{ {
return(STATUS_SUCCESS); return(STATUS_SUCCESS);

View file

@ -469,8 +469,8 @@ MmFindGapBottomUp(
ULONG_PTR Length, ULONG_PTR Length,
ULONG_PTR Granularity) ULONG_PTR Granularity)
{ {
PVOID HighestAddress = AddressSpace->LowestAddress < (PVOID)KERNEL_BASE ? PVOID HighestAddress = AddressSpace->LowestAddress < MmSystemRangeStart ?
(PVOID)(KERNEL_BASE - 1) : (PVOID)MAXULONG_PTR; (PVOID)((ULONG_PTR)MmSystemRangeStart - 1) : (PVOID)MAXULONG_PTR;
PVOID AlignedAddress; PVOID AlignedAddress;
PMEMORY_AREA Node; PMEMORY_AREA Node;
PMEMORY_AREA FirstNode; PMEMORY_AREA FirstNode;
@ -546,8 +546,8 @@ MmFindGapTopDown(
ULONG_PTR Length, ULONG_PTR Length,
ULONG_PTR Granularity) ULONG_PTR Granularity)
{ {
PVOID HighestAddress = AddressSpace->LowestAddress < (PVOID)KERNEL_BASE ? PVOID HighestAddress = AddressSpace->LowestAddress < MmSystemRangeStart ?
(PVOID)(KERNEL_BASE - 1) : (PVOID)MAXULONG_PTR; (PVOID)((ULONG_PTR)MmSystemRangeStart - 1) : (PVOID)MAXULONG_PTR;
PVOID AlignedAddress; PVOID AlignedAddress;
PMEMORY_AREA Node; PMEMORY_AREA Node;
PMEMORY_AREA PreviousNode; PMEMORY_AREA PreviousNode;
@ -645,16 +645,16 @@ MmFindGapAtAddress(
{ {
PMEMORY_AREA Node = AddressSpace->MemoryAreaRoot; PMEMORY_AREA Node = AddressSpace->MemoryAreaRoot;
PMEMORY_AREA RightNeighbour = NULL; PMEMORY_AREA RightNeighbour = NULL;
PVOID HighestAddress = AddressSpace->LowestAddress < (PVOID)KERNEL_BASE ? PVOID HighestAddress = AddressSpace->LowestAddress < MmSystemRangeStart ?
(PVOID)(KERNEL_BASE - 1) : (PVOID)MAXULONG_PTR; (PVOID)((ULONG_PTR)MmSystemRangeStart - 1) : (PVOID)MAXULONG_PTR;
MmVerifyMemoryAreas(AddressSpace); MmVerifyMemoryAreas(AddressSpace);
Address = MM_ROUND_DOWN(Address, PAGE_SIZE); Address = MM_ROUND_DOWN(Address, PAGE_SIZE);
if (AddressSpace->LowestAddress < (PVOID)KERNEL_BASE) if (AddressSpace->LowestAddress < MmSystemRangeStart)
{ {
if (Address >= (PVOID)KERNEL_BASE) if (Address >= MmSystemRangeStart)
{ {
return 0; return 0;
} }
@ -970,15 +970,15 @@ MmCreateMemoryArea(PEPROCESS Process,
- (ULONG_PTR) MM_ROUND_DOWN(*BaseAddress, Granularity)); - (ULONG_PTR) MM_ROUND_DOWN(*BaseAddress, Granularity));
*BaseAddress = MM_ROUND_DOWN(*BaseAddress, Granularity); *BaseAddress = MM_ROUND_DOWN(*BaseAddress, Granularity);
if (AddressSpace->LowestAddress == (PVOID)KERNEL_BASE && if (AddressSpace->LowestAddress == MmSystemRangeStart &&
*BaseAddress < (PVOID)KERNEL_BASE) *BaseAddress < (PVOID)KERNEL_BASE)
{ {
CHECKPOINT; CHECKPOINT;
return STATUS_ACCESS_VIOLATION; return STATUS_ACCESS_VIOLATION;
} }
if (AddressSpace->LowestAddress < (PVOID)KERNEL_BASE && if (AddressSpace->LowestAddress < MmSystemRangeStart &&
(ULONG_PTR)(*BaseAddress) + tmpLength > KERNEL_BASE) (ULONG_PTR)(*BaseAddress) + tmpLength > (ULONG_PTR)MmSystemRangeStart)
{ {
CHECKPOINT; CHECKPOINT;
return STATUS_ACCESS_VIOLATION; return STATUS_ACCESS_VIOLATION;

View file

@ -217,7 +217,7 @@ MmUnmapLockedPages(PVOID BaseAddress, PMDL Mdl)
* so there is no need to free it * so there is no need to free it
*/ */
if ((Mdl->MdlFlags & MDL_SOURCE_IS_NONPAGED_POOL) && if ((Mdl->MdlFlags & MDL_SOURCE_IS_NONPAGED_POOL) &&
((ULONG_PTR)BaseAddress >= KERNEL_BASE)) (BaseAddress >= MmSystemRangeStart))
{ {
return; return;
} }
@ -242,7 +242,7 @@ MmUnmapLockedPages(PVOID BaseAddress, PMDL Mdl)
NULL); NULL);
} }
if ((ULONG_PTR)BaseAddress >= KERNEL_BASE) if (BaseAddress >= MmSystemRangeStart)
{ {
ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA); ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
@ -377,7 +377,7 @@ VOID STDCALL MmProbeAndLockPages (PMDL Mdl,
ASSERT(NrPages <= (Mdl->Size - sizeof(MDL))/sizeof(PFN_TYPE)); ASSERT(NrPages <= (Mdl->Size - sizeof(MDL))/sizeof(PFN_TYPE));
if (Mdl->StartVa >= (PVOID)KERNEL_BASE && if (Mdl->StartVa >= MmSystemRangeStart &&
MmGetPfnForProcess(NULL, Mdl->StartVa) >= MmPageArraySize) MmGetPfnForProcess(NULL, Mdl->StartVa) >= MmPageArraySize)
{ {
/* phys addr is not phys memory so this must be io memory */ /* phys addr is not phys memory so this must be io memory */
@ -392,7 +392,7 @@ VOID STDCALL MmProbeAndLockPages (PMDL Mdl,
} }
if (Mdl->StartVa >= (PVOID)KERNEL_BASE) if (Mdl->StartVa >= MmSystemRangeStart)
{ {
/* FIXME: why isn't AccessMode used? */ /* FIXME: why isn't AccessMode used? */
Mode = KernelMode; Mode = KernelMode;
@ -556,7 +556,7 @@ MmBuildMdlForNonPagedPool (PMDL Mdl)
* mdl buffer must (at least) be in kernel space, thou this doesn't * mdl buffer must (at least) be in kernel space, thou this doesn't
* necesarely mean that the buffer in within _nonpaged_ kernel space... * necesarely mean that the buffer in within _nonpaged_ kernel space...
*/ */
ASSERT((ULONG_PTR)Mdl->StartVa >= KERNEL_BASE); ASSERT(Mdl->StartVa >= MmSystemRangeStart);
PageCount = PAGE_ROUND_UP(Mdl->ByteOffset + Mdl->ByteCount) / PAGE_SIZE; PageCount = PAGE_ROUND_UP(Mdl->ByteOffset + Mdl->ByteCount) / PAGE_SIZE;
MdlPages = (PPFN_TYPE)(Mdl + 1); MdlPages = (PPFN_TYPE)(Mdl + 1);

View file

@ -35,7 +35,7 @@ MmCopyToCaller(PVOID Dest, const VOID *Src, ULONG NumberOfBytes)
if (ExGetPreviousMode() == UserMode) if (ExGetPreviousMode() == UserMode)
{ {
if ((ULONG_PTR)Dest >= KERNEL_BASE) if (Dest >= MmSystemRangeStart)
{ {
return(STATUS_ACCESS_VIOLATION); return(STATUS_ACCESS_VIOLATION);
} }
@ -56,7 +56,7 @@ MmCopyFromCaller(PVOID Dest, const VOID *Src, ULONG NumberOfBytes)
if (ExGetPreviousMode() == UserMode) if (ExGetPreviousMode() == UserMode)
{ {
if ((ULONG_PTR)Src >= KERNEL_BASE) if (Src >= MmSystemRangeStart)
{ {
return(STATUS_ACCESS_VIOLATION); return(STATUS_ACCESS_VIOLATION);
} }
@ -158,7 +158,7 @@ BOOLEAN STDCALL MmIsAddressValid(PVOID VirtualAddress)
MEMORY_AREA* MemoryArea; MEMORY_AREA* MemoryArea;
PMADDRESS_SPACE AddressSpace; PMADDRESS_SPACE AddressSpace;
if ((ULONG_PTR)VirtualAddress >= KERNEL_BASE) if (VirtualAddress >= MmSystemRangeStart)
{ {
AddressSpace = MmGetKernelAddressSpace(); AddressSpace = MmGetKernelAddressSpace();
} }
@ -205,7 +205,7 @@ NTSTATUS MmAccessFault(KPROCESSOR_MODE Mode,
/* /*
* Find the memory area for the faulting address * Find the memory area for the faulting address
*/ */
if (Address >= KERNEL_BASE) if (Address >= (ULONG_PTR)MmSystemRangeStart)
{ {
/* /*
* Check permissions * Check permissions
@ -325,7 +325,7 @@ NTSTATUS MmNotPresentFault(KPROCESSOR_MODE Mode,
* after my init patch anyways * after my init patch anyways
*/ */
CPRINT("No current process\n"); CPRINT("No current process\n");
if (Address < KERNEL_BASE) if (Address < (ULONG_PTR)MmSystemRangeStart)
{ {
return(STATUS_UNSUCCESSFUL); return(STATUS_UNSUCCESSFUL);
} }
@ -334,7 +334,7 @@ NTSTATUS MmNotPresentFault(KPROCESSOR_MODE Mode,
/* /*
* Find the memory area for the faulting address * Find the memory area for the faulting address
*/ */
if (Address >= KERNEL_BASE) if (Address >= (ULONG_PTR)MmSystemRangeStart)
{ {
/* /*
* Check permissions * Check permissions

View file

@ -74,7 +74,7 @@ MmWritePagePhysicalAddress(PFN_TYPE Page)
{ {
KEBUGCHECK(0); KEBUGCHECK(0);
} }
if (Address < (PVOID)KERNEL_BASE) if (Address < MmSystemRangeStart)
{ {
Status = ObReferenceObjectByPointer(Process, PROCESS_ALL_ACCESS, NULL, KernelMode); Status = ObReferenceObjectByPointer(Process, PROCESS_ALL_ACCESS, NULL, KernelMode);
ExReleaseFastMutex(&RmapListLock); ExReleaseFastMutex(&RmapListLock);
@ -100,7 +100,7 @@ MmWritePagePhysicalAddress(PFN_TYPE Page)
if (MemoryArea == NULL || MemoryArea->DeleteInProgress) if (MemoryArea == NULL || MemoryArea->DeleteInProgress)
{ {
MmUnlockAddressSpace(AddressSpace); MmUnlockAddressSpace(AddressSpace);
if (Address < (PVOID)KERNEL_BASE) if (Address < MmSystemRangeStart)
{ {
ObDereferenceObject(Process); ObDereferenceObject(Process);
} }
@ -122,7 +122,7 @@ MmWritePagePhysicalAddress(PFN_TYPE Page)
if (PageOp == NULL) if (PageOp == NULL)
{ {
MmUnlockAddressSpace(AddressSpace); MmUnlockAddressSpace(AddressSpace);
if (Address < (PVOID)KERNEL_BASE) if (Address < MmSystemRangeStart)
{ {
ObDereferenceObject(Process); ObDereferenceObject(Process);
} }
@ -142,13 +142,13 @@ MmWritePagePhysicalAddress(PFN_TYPE Page)
} }
else if ((Type == MEMORY_AREA_VIRTUAL_MEMORY) || (Type == MEMORY_AREA_PEB_OR_TEB)) else if ((Type == MEMORY_AREA_VIRTUAL_MEMORY) || (Type == MEMORY_AREA_PEB_OR_TEB))
{ {
PageOp = MmGetPageOp(MemoryArea, Address < (PVOID)KERNEL_BASE ? Process->UniqueProcessId : NULL, PageOp = MmGetPageOp(MemoryArea, Address < MmSystemRangeStart ? Process->UniqueProcessId : NULL,
Address, NULL, 0, MM_PAGEOP_PAGEOUT, TRUE); Address, NULL, 0, MM_PAGEOP_PAGEOUT, TRUE);
if (PageOp == NULL) if (PageOp == NULL)
{ {
MmUnlockAddressSpace(AddressSpace); MmUnlockAddressSpace(AddressSpace);
if (Address < (PVOID)KERNEL_BASE) if (Address < MmSystemRangeStart)
{ {
ObDereferenceObject(Process); ObDereferenceObject(Process);
} }
@ -170,7 +170,7 @@ MmWritePagePhysicalAddress(PFN_TYPE Page)
{ {
KEBUGCHECK(0); KEBUGCHECK(0);
} }
if (Address < (PVOID)KERNEL_BASE) if (Address < MmSystemRangeStart)
{ {
ObDereferenceObject(Process); ObDereferenceObject(Process);
} }
@ -204,7 +204,7 @@ MmPageOutPhysicalAddress(PFN_TYPE Page)
KEBUGCHECK(0); KEBUGCHECK(0);
} }
if (Address < (PVOID)KERNEL_BASE) if (Address < MmSystemRangeStart)
{ {
Status = ObReferenceObjectByPointer(Process, PROCESS_ALL_ACCESS, NULL, KernelMode); Status = ObReferenceObjectByPointer(Process, PROCESS_ALL_ACCESS, NULL, KernelMode);
ExReleaseFastMutex(&RmapListLock); ExReleaseFastMutex(&RmapListLock);
@ -225,7 +225,7 @@ MmPageOutPhysicalAddress(PFN_TYPE Page)
if (MemoryArea == NULL || MemoryArea->DeleteInProgress) if (MemoryArea == NULL || MemoryArea->DeleteInProgress)
{ {
MmUnlockAddressSpace(AddressSpace); MmUnlockAddressSpace(AddressSpace);
if (Address < (PVOID)KERNEL_BASE) if (Address < MmSystemRangeStart)
{ {
ObDereferenceObject(Process); ObDereferenceObject(Process);
} }
@ -245,7 +245,7 @@ MmPageOutPhysicalAddress(PFN_TYPE Page)
if (PageOp == NULL) if (PageOp == NULL)
{ {
MmUnlockAddressSpace(AddressSpace); MmUnlockAddressSpace(AddressSpace);
if (Address < (PVOID)KERNEL_BASE) if (Address < MmSystemRangeStart)
{ {
ObDereferenceObject(Process); ObDereferenceObject(Process);
} }
@ -265,12 +265,12 @@ MmPageOutPhysicalAddress(PFN_TYPE Page)
} }
else if ((Type == MEMORY_AREA_VIRTUAL_MEMORY) || (Type == MEMORY_AREA_PEB_OR_TEB)) else if ((Type == MEMORY_AREA_VIRTUAL_MEMORY) || (Type == MEMORY_AREA_PEB_OR_TEB))
{ {
PageOp = MmGetPageOp(MemoryArea, Address < (PVOID)KERNEL_BASE ? Process->UniqueProcessId : NULL, PageOp = MmGetPageOp(MemoryArea, Address < MmSystemRangeStart ? Process->UniqueProcessId : NULL,
Address, NULL, 0, MM_PAGEOP_PAGEOUT, TRUE); Address, NULL, 0, MM_PAGEOP_PAGEOUT, TRUE);
if (PageOp == NULL) if (PageOp == NULL)
{ {
MmUnlockAddressSpace(AddressSpace); MmUnlockAddressSpace(AddressSpace);
if (Address < (PVOID)KERNEL_BASE) if (Address < MmSystemRangeStart)
{ {
ObDereferenceObject(Process); ObDereferenceObject(Process);
} }
@ -292,7 +292,7 @@ MmPageOutPhysicalAddress(PFN_TYPE Page)
{ {
KEBUGCHECK(0); KEBUGCHECK(0);
} }
if (Address < (PVOID)KERNEL_BASE) if (Address < MmSystemRangeStart)
{ {
ObDereferenceObject(Process); ObDereferenceObject(Process);
} }

View file

@ -123,7 +123,7 @@ MiQueryVirtualMemory (IN HANDLE ProcessHandle,
MEMORY_AREA* MemoryArea; MEMORY_AREA* MemoryArea;
PMADDRESS_SPACE AddressSpace; PMADDRESS_SPACE AddressSpace;
if (Address < (PVOID)KERNEL_BASE) if (Address < MmSystemRangeStart)
{ {
Status = ObReferenceObjectByHandle(ProcessHandle, Status = ObReferenceObjectByHandle(ProcessHandle,
PROCESS_QUERY_INFORMATION, PROCESS_QUERY_INFORMATION,
@ -248,7 +248,7 @@ MiQueryVirtualMemory (IN HANDLE ProcessHandle,
} }
MmUnlockAddressSpace(AddressSpace); MmUnlockAddressSpace(AddressSpace);
if (Address < (PVOID)KERNEL_BASE) if (Address < MmSystemRangeStart)
{ {
ObDereferenceObject(Process); ObDereferenceObject(Process);
} }
@ -286,7 +286,7 @@ NtQueryVirtualMemory (IN HANDLE ProcessHandle,
PrevMode = ExGetPreviousMode(); PrevMode = ExGetPreviousMode();
if (Address >= (PVOID)KERNEL_BASE) if (Address >= MmSystemRangeStart)
{ {
DPRINT1("Invalid parameter\n"); DPRINT1("Invalid parameter\n");
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;