diff --git a/reactos/ntoskrnl/include/internal/mm.h b/reactos/ntoskrnl/include/internal/mm.h index 99e8c7010d7..b102d943f8f 100644 --- a/reactos/ntoskrnl/include/internal/mm.h +++ b/reactos/ntoskrnl/include/internal/mm.h @@ -254,9 +254,9 @@ typedef struct _MADDRESS_SPACE { PMEMORY_AREA MemoryAreaRoot; PVOID LowestAddress; - struct _EPROCESS* Process; + PEPROCESS Process; PUSHORT PageTableRefCountTable; - ULONG PageTableRefCountTableSize; + PEX_PUSH_LOCK Lock; } MADDRESS_SPACE, *PMADDRESS_SPACE; typedef struct @@ -392,26 +392,10 @@ typedef VOID /* aspace.c ******************************************************************/ -VOID -NTAPI -MmLockAddressSpace(PMADDRESS_SPACE AddressSpace); - -VOID -NTAPI -MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace); - VOID NTAPI MmInitializeKernelAddressSpace(VOID); -PMADDRESS_SPACE -NTAPI -MmGetCurrentAddressSpace(VOID); - -PMADDRESS_SPACE -NTAPI -MmGetKernelAddressSpace(VOID); - NTSTATUS NTAPI MmInitializeAddressSpace( @@ -1584,4 +1568,37 @@ MiSyncThreadProcessViews(IN PVOID Process, MmUpdatePageDir((PEPROCESS)Process, Address, Size); } + +extern MADDRESS_SPACE MmKernelAddressSpace; + +FORCEINLINE +VOID +MmLockAddressSpace(PMADDRESS_SPACE AddressSpace) +{ + KeEnterCriticalRegion(); + ExAcquirePushLockExclusive(AddressSpace->Lock); +} + +FORCEINLINE +VOID +MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace) +{ + ExReleasePushLock(AddressSpace->Lock); + KeLeaveCriticalRegion(); +} + +FORCEINLINE +PMADDRESS_SPACE +MmGetCurrentAddressSpace(VOID) +{ + return (PMADDRESS_SPACE)&((PEPROCESS)KeGetCurrentThread()->ApcState.Process)->VadRoot; +} + +FORCEINLINE +PMADDRESS_SPACE +MmGetKernelAddressSpace(VOID) +{ + return &MmKernelAddressSpace; +} + #endif diff --git a/reactos/ntoskrnl/mm/aspace.c b/reactos/ntoskrnl/mm/aspace.c index 1d49ccdc909..dd9cd5e8eaf 100644 --- a/reactos/ntoskrnl/mm/aspace.c +++ b/reactos/ntoskrnl/mm/aspace.c @@ -19,59 +19,19 @@ /* GLOBALS ******************************************************************/ -static MADDRESS_SPACE KernelAddressSpace; -EX_PUSH_LOCK KernelAddressSpaceLock; +MADDRESS_SPACE MmKernelAddressSpace; + +ULONGLONG Cycles; +ULONG TimeDelta; /* FUNCTIONS *****************************************************************/ -VOID -NTAPI -MmLockAddressSpace(PMADDRESS_SPACE AddressSpace) -{ - if (AddressSpace->Process) - { - ExAcquirePushLockExclusive((PEX_PUSH_LOCK)&AddressSpace->Process->AddressCreationLock); - } - else - { - ExAcquirePushLockExclusive(&KernelAddressSpaceLock); - } -} - -VOID -NTAPI -MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace) -{ - if (AddressSpace->Process) - { - ExReleasePushLock((PEX_PUSH_LOCK)&AddressSpace->Process->AddressCreationLock); - } - else - { - ExReleasePushLock(&KernelAddressSpaceLock); - } -} - VOID INIT_FUNCTION NTAPI MmInitializeKernelAddressSpace(VOID) { - MmInitializeAddressSpace(NULL, &KernelAddressSpace); -} - -PMADDRESS_SPACE -NTAPI -MmGetCurrentAddressSpace(VOID) -{ - return((PMADDRESS_SPACE)&(PsGetCurrentProcess())->VadRoot); -} - -PMADDRESS_SPACE -NTAPI -MmGetKernelAddressSpace(VOID) -{ - return(&KernelAddressSpace); + MmInitializeAddressSpace(NULL, &MmKernelAddressSpace); } NTSTATUS @@ -79,51 +39,45 @@ NTAPI MmInitializeAddressSpace(PEPROCESS Process, PMADDRESS_SPACE AddressSpace) { - AddressSpace->MemoryAreaRoot = NULL; - if (Process) - { - ExInitializePushLock((PULONG_PTR)&Process->AddressCreationLock); - } - else - { - ExInitializePushLock((PULONG_PTR)&KernelAddressSpaceLock); - } - if (Process != NULL) - { - AddressSpace->LowestAddress = MM_LOWEST_USER_ADDRESS; - } - else - { - AddressSpace->LowestAddress = MmSystemRangeStart; - } - AddressSpace->Process = Process; - if (Process != NULL) - { - ULONG Count; - Count = MiGetUserPageDirectoryCount(); - AddressSpace->PageTableRefCountTable = - ExAllocatePoolWithTag(NonPagedPool, Count * sizeof(USHORT), - TAG_PTRC); - RtlZeroMemory(AddressSpace->PageTableRefCountTable, Count * sizeof(USHORT)); - AddressSpace->PageTableRefCountTableSize = Count; - } - else - { - AddressSpace->PageTableRefCountTable = NULL; - AddressSpace->PageTableRefCountTableSize = 0; - } - return(STATUS_SUCCESS); + ULONG Count; + + AddressSpace->MemoryAreaRoot = NULL; + + if (Process != NULL) + { + AddressSpace->LowestAddress = MM_LOWEST_USER_ADDRESS; + AddressSpace->Process = Process; + AddressSpace->Lock = (PEX_PUSH_LOCK)&Process->AddressCreationLock; + ExInitializePushLock((PULONG_PTR)AddressSpace->Lock); + Count = MiGetUserPageDirectoryCount(); + AddressSpace->PageTableRefCountTable = ExAllocatePoolWithTag(NonPagedPool, + Count * sizeof(USHORT), + TAG_PTRC); + RtlZeroMemory(AddressSpace->PageTableRefCountTable, Count * sizeof(USHORT)); + + } + else + { + AddressSpace->LowestAddress = MmSystemRangeStart; + AddressSpace->Process = NULL; + AddressSpace->PageTableRefCountTable = NULL; + AddressSpace->Lock = (PEX_PUSH_LOCK)&PsGetCurrentProcess()->AddressCreationLock; + ExInitializePushLock((PULONG_PTR)AddressSpace->Lock); + } + + return STATUS_SUCCESS; } NTSTATUS NTAPI MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace) { - if (AddressSpace->PageTableRefCountTable != NULL) - { - ExFreePool(AddressSpace->PageTableRefCountTable); - } - return(STATUS_SUCCESS); + if (AddressSpace->PageTableRefCountTable) + { + ExFreePool(AddressSpace->PageTableRefCountTable); + } + + return STATUS_SUCCESS; } /* EOF */