- Use EPROCESS 's AddressCreationLock instead of the MADDRESS_SPACE Lock.

- Overlay MADDRES_SPACE over MM_AVL_NODE. Even though our structures are currently incompatible, they represent the same thing (The EPROCESS's Address space).

svn path=/trunk/; revision=21934
This commit is contained in:
Alex Ionescu 2006-05-18 20:10:44 +00:00
parent 93a0bb6787
commit 7b3c313c1c
14 changed files with 81 additions and 59 deletions

View file

@ -219,7 +219,6 @@ typedef struct _MEMORY_AREA
ULONG Type;
ULONG Protect;
ULONG Flags;
ULONG LockCount;
BOOLEAN DeleteInProgress;
ULONG PageOpCount;
union
@ -242,7 +241,6 @@ typedef struct _MEMORY_AREA
typedef struct _MADDRESS_SPACE
{
PMEMORY_AREA MemoryAreaRoot;
FAST_MUTEX Lock;
PVOID LowestAddress;
struct _ROS_EPROCESS* Process;
PUSHORT PageTableRefCountTable;

View file

@ -45,7 +45,7 @@ typedef struct _ROS_EPROCESS
EX_PUSH_LOCK AddressCreationLock;
PETHREAD RotateInProgress;
#else
KGUARDED_MUTEX AddressCreationLock;
FAST_MUTEX AddressCreationLock; // FIXME: FAST_MUTEX for XP, KGUARDED_MUTEX for 2K3
KSPIN_LOCK HyperSpaceLock;
#endif
PETHREAD ForkInProgress;
@ -200,7 +200,6 @@ typedef struct _ROS_EPROCESS
UCHAR PriorityClass;
MM_AVL_TABLE VadRoot;
ULONG Cookie;
MADDRESS_SPACE AddressSpace;
} ROS_EPROCESS, *PROS_EPROCESS;
#include <poppack.h>

View file

@ -27,6 +27,8 @@ HalReleaseDisplayOwnership(
VOID
);
extern FAST_MUTEX KernelAddressSpaceLock;
/* GLOBALS ******************************************************************/
static LIST_ENTRY BugcheckCallbackListHead = {NULL,NULL};
@ -341,7 +343,7 @@ KeBugCheckWithTf(ULONG BugCheckCode,
KeRaiseIrql(HIGH_LEVEL, &OldIrql);
/* Unload the Kernel Adress Space if we own it */
if (MmGetKernelAddressSpace()->Lock.Owner == KeGetCurrentThread())
if (KernelAddressSpaceLock.Owner == KeGetCurrentThread())
MmUnlockAddressSpace(MmGetKernelAddressSpace());
/* FIXMEs: Use inbv to clear, fill and write to screen. */

View file

@ -679,7 +679,7 @@ NtAllocateVirtualMemory(IN HANDLE ProcessHandle,
Type = (AllocationType & MEM_COMMIT) ? MEM_COMMIT : MEM_RESERVE;
DPRINT("Type %x\n", Type);
AddressSpace = &Process->AddressSpace;
AddressSpace = (PMADDRESS_SPACE)&Process->VadRoot;
MmLockAddressSpace(AddressSpace);
if (PBaseAddress != 0)
@ -833,7 +833,7 @@ MmFreeVirtualMemory(PROS_EPROCESS Process,
if (PageOp != NULL)
{
NTSTATUS Status;
MmUnlockAddressSpace(&Process->AddressSpace);
MmUnlockAddressSpace((PMADDRESS_SPACE)&Process->VadRoot);
Status = KeWaitForSingleObject(&PageOp->CompletionEvent,
0,
KernelMode,
@ -844,7 +844,7 @@ MmFreeVirtualMemory(PROS_EPROCESS Process,
DPRINT1("Failed to wait for page op\n");
KEBUGCHECK(0);
}
MmLockAddressSpace(&Process->AddressSpace);
MmLockAddressSpace((PMADDRESS_SPACE)&Process->VadRoot);
MmReleasePageOp(PageOp);
}
}
@ -860,7 +860,7 @@ MmFreeVirtualMemory(PROS_EPROCESS Process,
}
/* Actually free the memory area. */
MmFreeMemoryArea(&Process->AddressSpace,
MmFreeMemoryArea((PMADDRESS_SPACE)&Process->VadRoot,
MemoryArea,
MmFreeVirtualMemoryPage,
(PVOID)Process);
@ -913,7 +913,7 @@ NtFreeVirtualMemory(IN HANDLE ProcessHandle,
return(Status);
}
AddressSpace = &Process->AddressSpace;
AddressSpace = (PMADDRESS_SPACE)&Process->VadRoot;
MmLockAddressSpace(AddressSpace);
MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace, BaseAddress);

View file

@ -20,7 +20,8 @@
/* GLOBALS ******************************************************************/
STATIC MADDRESS_SPACE KernelAddressSpace;
static MADDRESS_SPACE KernelAddressSpace;
FAST_MUTEX KernelAddressSpaceLock;
/* FUNCTIONS *****************************************************************/
@ -35,7 +36,15 @@ MmLockAddressSpace(PMADDRESS_SPACE AddressSpace)
{
return;
}
ExEnterCriticalRegionAndAcquireFastMutexUnsafe(&AddressSpace->Lock);
if (AddressSpace->Process)
{
ExEnterCriticalRegionAndAcquireFastMutexUnsafe(&AddressSpace->Process->AddressCreationLock);
}
else
{
ExEnterCriticalRegionAndAcquireFastMutexUnsafe(&KernelAddressSpaceLock);
}
}
VOID
@ -49,7 +58,14 @@ MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace)
{
return;
}
ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(&AddressSpace->Lock);
if (AddressSpace->Process)
{
ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(&AddressSpace->Process->AddressCreationLock);
}
else
{
ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(&KernelAddressSpaceLock);
}
}
VOID
@ -64,7 +80,7 @@ PMADDRESS_SPACE
NTAPI
MmGetCurrentAddressSpace(VOID)
{
return(&((PROS_EPROCESS)PsGetCurrentProcess())->AddressSpace);
return((PMADDRESS_SPACE)&((PROS_EPROCESS)PsGetCurrentProcess())->VadRoot);
}
PMADDRESS_SPACE
@ -80,7 +96,14 @@ MmInitializeAddressSpace(PROS_EPROCESS Process,
PMADDRESS_SPACE AddressSpace)
{
AddressSpace->MemoryAreaRoot = NULL;
ExInitializeFastMutex(&AddressSpace->Lock);
if (Process)
{
ExInitializeFastMutex(&Process->AddressCreationLock);
}
else
{
ExInitializeFastMutex(&KernelAddressSpaceLock);
}
if (Process != NULL)
{
AddressSpace->LowestAddress = MM_LOWEST_USER_ADDRESS;

View file

@ -243,7 +243,7 @@ Mmi386ReleaseMmInfo(PROS_EPROCESS Process)
DPRINT1("ProcessId %d, Pde for %08x - %08x is not freed, RefCount %d\n",
Process->UniqueProcessId,
(i * 512 + j) * 512 * PAGE_SIZE, (i * 512 + j + 1) * 512 * PAGE_SIZE - 1,
Process->AddressSpace.PageTableRefCountTable[i*512 + j]);
((PMADDRESS_SPACE)&Process->VadRoot)->PageTableRefCountTable[i*512 + j]);
Pde = MmCreateHyperspaceMapping(PAE_PTE_TO_PFN(PageDir[j]));
for (k = 0; k < 512; k++)
{
@ -288,7 +288,7 @@ Mmi386ReleaseMmInfo(PROS_EPROCESS Process)
{
DPRINT1("Pde for %08x - %08x is not freed, RefCount %d\n",
i * 4 * 1024 * 1024, (i + 1) * 4 * 1024 * 1024 - 1,
Process->AddressSpace.PageTableRefCountTable[i]);
((PMADDRESS_SPACE)&Process->VadRoot)->PageTableRefCountTable[i]);
Pde = MmCreateHyperspaceMapping(PTE_TO_PFN(PageDir[i]));
for (j = 0; j < 1024; j++)
{
@ -1041,13 +1041,13 @@ MmDeleteVirtualMapping(PROS_EPROCESS Process, PVOID Address, BOOLEAN FreePage,
* Decrement the reference count for this page table.
*/
if (Process != NULL && WasValid &&
Process->AddressSpace.PageTableRefCountTable != NULL &&
((PMADDRESS_SPACE)&Process->VadRoot)->PageTableRefCountTable != NULL &&
Address < MmSystemRangeStart)
{
PUSHORT Ptrc;
ULONG Idx;
Ptrc = Process->AddressSpace.PageTableRefCountTable;
Ptrc = ((PMADDRESS_SPACE)&Process->VadRoot)->PageTableRefCountTable;
Idx = Ke386Pae ? PAE_ADDR_TO_PAGE_TABLE(Address) : ADDR_TO_PAGE_TABLE(Address);
Ptrc[Idx]--;
@ -1090,12 +1090,12 @@ MmDeletePageFileMapping(PROS_EPROCESS Process, PVOID Address,
* Decrement the reference count for this page table.
*/
if (Process != NULL && Pte &&
Process->AddressSpace.PageTableRefCountTable != NULL &&
((PMADDRESS_SPACE)&Process->VadRoot)->PageTableRefCountTable != NULL &&
Address < MmSystemRangeStart)
{
PUSHORT Ptrc;
Ptrc = Process->AddressSpace.PageTableRefCountTable;
Ptrc = ((PMADDRESS_SPACE)&Process->VadRoot)->PageTableRefCountTable;
Ptrc[PAE_ADDR_TO_PAGE_TABLE(Address)]--;
if (Ptrc[PAE_ADDR_TO_PAGE_TABLE(Address)] == 0)
@ -1134,12 +1134,12 @@ MmDeletePageFileMapping(PROS_EPROCESS Process, PVOID Address,
* Decrement the reference count for this page table.
*/
if (Process != NULL && Pte &&
Process->AddressSpace.PageTableRefCountTable != NULL &&
((PMADDRESS_SPACE)&Process->VadRoot)->PageTableRefCountTable != NULL &&
Address < MmSystemRangeStart)
{
PUSHORT Ptrc;
Ptrc = Process->AddressSpace.PageTableRefCountTable;
Ptrc = ((PMADDRESS_SPACE)&Process->VadRoot)->PageTableRefCountTable;
Ptrc[ADDR_TO_PAGE_TABLE(Address)]--;
if (Ptrc[ADDR_TO_PAGE_TABLE(Address)] == 0)
@ -1694,13 +1694,13 @@ MmCreatePageFileMapping(PROS_EPROCESS Process,
}
}
if (Process != NULL &&
Process->AddressSpace.PageTableRefCountTable != NULL &&
((PMADDRESS_SPACE)&Process->VadRoot)->PageTableRefCountTable != NULL &&
Address < MmSystemRangeStart)
{
PUSHORT Ptrc;
ULONG Idx;
Ptrc = Process->AddressSpace.PageTableRefCountTable;
Ptrc = ((PMADDRESS_SPACE)&Process->VadRoot)->PageTableRefCountTable;
Idx = Ke386Pae ? PAE_ADDR_TO_PAGE_TABLE(Address) : ADDR_TO_PAGE_TABLE(Address);
Ptrc[Idx]++;
}
@ -1823,12 +1823,12 @@ MmCreateVirtualMappingUnsafe(PROS_EPROCESS Process,
MmMarkPageUnmapped(PAE_PTE_TO_PFN((Pte)));
}
if (Address < MmSystemRangeStart &&
Process->AddressSpace.PageTableRefCountTable != NULL &&
((PMADDRESS_SPACE)&Process->VadRoot)->PageTableRefCountTable != NULL &&
Attributes & PA_PRESENT)
{
PUSHORT Ptrc;
Ptrc = Process->AddressSpace.PageTableRefCountTable;
Ptrc = ((PMADDRESS_SPACE)&Process->VadRoot)->PageTableRefCountTable;
Ptrc[PAE_ADDR_TO_PAGE_TABLE(Addr)]++;
}
@ -1888,12 +1888,12 @@ MmCreateVirtualMappingUnsafe(PROS_EPROCESS Process,
}
(void)InterlockedExchangeUL(Pt, PFN_TO_PTE(Pages[i]) | Attributes);
if (Address < MmSystemRangeStart &&
Process->AddressSpace.PageTableRefCountTable != NULL &&
((PMADDRESS_SPACE)&Process->VadRoot)->PageTableRefCountTable != NULL &&
Attributes & PA_PRESENT)
{
PUSHORT Ptrc;
Ptrc = Process->AddressSpace.PageTableRefCountTable;
Ptrc = ((PMADDRESS_SPACE)&Process->VadRoot)->PageTableRefCountTable;
Ptrc[ADDR_TO_PAGE_TABLE(Addr)]++;
}

View file

@ -1011,7 +1011,7 @@ MmCreateMemoryArea(PMADDRESS_SPACE AddressSpace,
MemoryArea->EndingAddress = (PVOID)((ULONG_PTR)*BaseAddress + tmpLength);
MemoryArea->Protect = Protect;
MemoryArea->Flags = AllocationFlags;
MemoryArea->LockCount = 0;
//MemoryArea->LockCount = 0;
MemoryArea->PageOpCount = 0;
MemoryArea->DeleteInProgress = FALSE;

View file

@ -273,14 +273,14 @@ MmUnmapLockedPages(PVOID BaseAddress, PMDL Mdl)
ASSERT(Mdl->Process == PsGetCurrentProcess());
Marea = MmLocateMemoryAreaByAddress( &((PROS_EPROCESS)Mdl->Process)->AddressSpace, BaseAddress );
Marea = MmLocateMemoryAreaByAddress( (PMADDRESS_SPACE)&((PROS_EPROCESS)Mdl->Process)->VadRoot, BaseAddress );
if (Marea == NULL)
{
DPRINT1( "Couldn't open memory area when unmapping user-space pages!\n" );
KEBUGCHECK(0);
}
MmFreeMemoryArea( &((PROS_EPROCESS)Mdl->Process)->AddressSpace, Marea, NULL, NULL );
MmFreeMemoryArea( (PMADDRESS_SPACE)&((PROS_EPROCESS)Mdl->Process)->VadRoot, Marea, NULL, NULL );
Mdl->Process = NULL;
}
@ -411,7 +411,7 @@ VOID STDCALL MmProbeAndLockPages (PMDL Mdl,
/* FIXME: why isn't AccessMode used? */
Mode = UserMode;
Mdl->Process = CurrentProcess;
AddressSpace = &((PROS_EPROCESS)CurrentProcess)->AddressSpace;
AddressSpace = (PMADDRESS_SPACE)&((PROS_EPROCESS)CurrentProcess)->VadRoot;
}
@ -805,8 +805,8 @@ MmMapLockedPagesSpecifyCache ( IN PMDL Mdl,
CurrentProcess = (PROS_EPROCESS)PsGetCurrentProcess();
MmLockAddressSpace(&CurrentProcess->AddressSpace);
Status = MmCreateMemoryArea(&CurrentProcess->AddressSpace,
MmLockAddressSpace((PMADDRESS_SPACE)&CurrentProcess->VadRoot);
Status = MmCreateMemoryArea((PMADDRESS_SPACE)&CurrentProcess->VadRoot,
MEMORY_AREA_MDL_MAPPING,
&Base,
PageCount * PAGE_SIZE,
@ -815,7 +815,7 @@ MmMapLockedPagesSpecifyCache ( IN PMDL Mdl,
(Base != NULL),
0,
BoundaryAddressMultiple);
MmUnlockAddressSpace(&CurrentProcess->AddressSpace);
MmUnlockAddressSpace((PMADDRESS_SPACE)&CurrentProcess->VadRoot);
if (!NT_SUCCESS(Status))
{
if (Mdl->MdlFlags & MDL_MAPPING_CAN_FAIL)

View file

@ -38,17 +38,17 @@ MmReleaseMmInfo(PROS_EPROCESS Process)
DPRINT("MmReleaseMmInfo(Process %x (%s))\n", Process,
Process->ImageFileName);
MmLockAddressSpace(&Process->AddressSpace);
MmLockAddressSpace((PMADDRESS_SPACE)&Process->VadRoot);
while ((MemoryArea = Process->AddressSpace.MemoryAreaRoot) != NULL)
while ((MemoryArea = ((PMADDRESS_SPACE)&Process->VadRoot)->MemoryAreaRoot) != NULL)
{
switch (MemoryArea->Type)
{
case MEMORY_AREA_SECTION_VIEW:
Address = (PVOID)MemoryArea->StartingAddress;
MmUnlockAddressSpace(&Process->AddressSpace);
MmUnlockAddressSpace((PMADDRESS_SPACE)&Process->VadRoot);
MmUnmapViewOfSection((PEPROCESS)Process, Address);
MmLockAddressSpace(&Process->AddressSpace);
MmLockAddressSpace((PMADDRESS_SPACE)&Process->VadRoot);
break;
case MEMORY_AREA_VIRTUAL_MEMORY:
@ -58,7 +58,7 @@ MmReleaseMmInfo(PROS_EPROCESS Process)
case MEMORY_AREA_SHARED_DATA:
case MEMORY_AREA_NO_ACCESS:
MmFreeMemoryArea(&Process->AddressSpace,
MmFreeMemoryArea((PMADDRESS_SPACE)&Process->VadRoot,
MemoryArea,
NULL,
NULL);
@ -75,8 +75,8 @@ MmReleaseMmInfo(PROS_EPROCESS Process)
Mmi386ReleaseMmInfo(Process);
MmUnlockAddressSpace(&Process->AddressSpace);
MmDestroyAddressSpace(&Process->AddressSpace);
MmUnlockAddressSpace((PMADDRESS_SPACE)&Process->VadRoot);
MmDestroyAddressSpace((PMADDRESS_SPACE)&Process->VadRoot);
DPRINT("Finished MmReleaseMmInfo()\n");
return(STATUS_SUCCESS);
@ -114,7 +114,7 @@ BOOLEAN STDCALL MmIsAddressValid(PVOID VirtualAddress)
}
else
{
AddressSpace = &((PROS_EPROCESS)PsGetCurrentProcess())->AddressSpace;
AddressSpace = (PMADDRESS_SPACE)&((PROS_EPROCESS)PsGetCurrentProcess())->VadRoot;
}
MmLockAddressSpace(AddressSpace);
@ -171,7 +171,7 @@ MmAccessFault(KPROCESSOR_MODE Mode,
}
else
{
AddressSpace = &((PROS_EPROCESS)PsGetCurrentProcess())->AddressSpace;
AddressSpace = (PMADDRESS_SPACE)&((PROS_EPROCESS)PsGetCurrentProcess())->VadRoot;
}
if (!FromMdl)
@ -304,7 +304,7 @@ MmNotPresentFault(KPROCESSOR_MODE Mode,
}
else
{
AddressSpace = &((PROS_EPROCESS)PsGetCurrentProcess())->AddressSpace;
AddressSpace = (PMADDRESS_SPACE)&((PROS_EPROCESS)PsGetCurrentProcess())->VadRoot;
}
if (!FromMdl)

View file

@ -29,7 +29,7 @@ MiCreatePebOrTeb(PROS_EPROCESS Process,
PVOID BaseAddress)
{
NTSTATUS Status;
PMADDRESS_SPACE ProcessAddressSpace = &Process->AddressSpace;
PMADDRESS_SPACE ProcessAddressSpace = (PMADDRESS_SPACE)&Process->VadRoot;
PMEMORY_AREA MemoryArea;
PHYSICAL_ADDRESS BoundaryAddressMultiple;
PVOID AllocatedBase = BaseAddress;
@ -110,7 +110,7 @@ STDCALL
MmDeleteTeb(PROS_EPROCESS Process,
PTEB Teb)
{
PMADDRESS_SPACE ProcessAddressSpace = &Process->AddressSpace;
PMADDRESS_SPACE ProcessAddressSpace = (PMADDRESS_SPACE)&Process->VadRoot;
PMEMORY_AREA MemoryArea;
/* Lock the Address Space */
@ -424,7 +424,7 @@ MmCreateProcessAddressSpace(IN PROS_EPROCESS Process,
IN PROS_SECTION_OBJECT Section OPTIONAL)
{
NTSTATUS Status;
PMADDRESS_SPACE ProcessAddressSpace = &Process->AddressSpace;
PMADDRESS_SPACE ProcessAddressSpace = (PMADDRESS_SPACE)&Process->VadRoot;
PVOID BaseAddress;
PMEMORY_AREA MemoryArea;
PHYSICAL_ADDRESS BoundaryAddressMultiple;

View file

@ -92,7 +92,7 @@ MmWritePagePhysicalAddress(PFN_TYPE Page)
{
return Status;
}
AddressSpace = &Process->AddressSpace;
AddressSpace = (PMADDRESS_SPACE)&Process->VadRoot;
}
else
{
@ -223,7 +223,7 @@ MmPageOutPhysicalAddress(PFN_TYPE Page)
{
return Status;
}
AddressSpace = &Process->AddressSpace;
AddressSpace = (PMADDRESS_SPACE)&Process->VadRoot;
}
else
{

View file

@ -1338,7 +1338,7 @@ MmPageOutDeleteMapping(PVOID Context, PROS_EPROCESS Process, PVOID Address)
PageOutContext = (MM_SECTION_PAGEOUT_CONTEXT*)Context;
if (Process)
{
MmLockAddressSpace(&Process->AddressSpace);
MmLockAddressSpace((PMADDRESS_SPACE)&Process->VadRoot);
}
MmDeleteVirtualMapping(Process,
@ -1362,7 +1362,7 @@ MmPageOutDeleteMapping(PVOID Context, PROS_EPROCESS Process, PVOID Address)
}
if (Process)
{
MmUnlockAddressSpace(&Process->AddressSpace);
MmUnlockAddressSpace((PMADDRESS_SPACE)&Process->VadRoot);
}
if (PageOutContext->Private)
@ -3676,7 +3676,7 @@ NtMapViewOfSection(IN HANDLE SectionHandle,
return(Status);
}
AddressSpace = &Process->AddressSpace;
AddressSpace = (PMADDRESS_SPACE)&Process->VadRoot;
Status = ObReferenceObjectByHandle(SectionHandle,
SECTION_MAP_READ,
@ -3911,7 +3911,7 @@ MmUnmapViewOfSection(PEPROCESS Process,
ASSERT(Process);
AddressSpace = &((PROS_EPROCESS)Process)->AddressSpace;
AddressSpace = (PMADDRESS_SPACE)&((PROS_EPROCESS)Process)->VadRoot;
MmLockAddressSpace(AddressSpace);
MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace,
@ -4432,7 +4432,7 @@ MmMapViewOfSection(IN PVOID SectionObject,
Section = (PROS_SECTION_OBJECT)SectionObject;
AddressSpace = &((PROS_EPROCESS)Process)->AddressSpace;
AddressSpace = (PMADDRESS_SPACE)&((PROS_EPROCESS)Process)->VadRoot;
AllocationType |= (Section->AllocationAttributes & SEC_NO_CHANGE);

View file

@ -137,7 +137,7 @@ MiQueryVirtualMemory (IN HANDLE ProcessHandle,
DPRINT("NtQueryVirtualMemory() = %x\n",Status);
return(Status);
}
AddressSpace = &Process->AddressSpace;
AddressSpace = (PMADDRESS_SPACE)&Process->VadRoot;
}
else
{
@ -393,7 +393,7 @@ MiProtectVirtualMemory(IN PEPROCESS Process,
PAGE_ROUND_DOWN(*BaseAddress);
*BaseAddress = (PVOID)PAGE_ROUND_DOWN(*BaseAddress);
AddressSpace = &((PROS_EPROCESS)Process)->AddressSpace;
AddressSpace = (PMADDRESS_SPACE)&((PROS_EPROCESS)Process)->VadRoot;
MmLockAddressSpace(AddressSpace);
MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace, *BaseAddress);

View file

@ -255,7 +255,7 @@ PsInitProcessManagment(VOID)
PspInheritQuota(PsInitialSystemProcess, NULL);
MmInitializeAddressSpace((PROS_EPROCESS)PsInitialSystemProcess,
&((PROS_EPROCESS)PsInitialSystemProcess)->AddressSpace);
(PMADDRESS_SPACE)&((PROS_EPROCESS)PsInitialSystemProcess)->VadRoot);
((PROS_EPROCESS)PsInitialSystemProcess)->LockEvent =
ExAllocatePoolWithTag(PagedPool, sizeof(KEVENT), TAG('P', 's', 'L', 'k'));