3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/mm/aspace.c
6 * PURPOSE: Manages address spaces
7 * PROGRAMMER: David Welch (welch@cwcom.net)
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
15 #include <internal/mm.h>
16 #include <internal/ps.h>
17 #include <internal/pool.h>
19 #include <internal/debug.h>
21 /* GLOBALS ******************************************************************/
23 STATIC MADDRESS_SPACE KernelAddressSpace;
25 #define TAG_PTRC TAG('P', 'T', 'R', 'C')
27 /* FUNCTIONS *****************************************************************/
30 MmLockAddressSpace(PMADDRESS_SPACE AddressSpace)
33 * Don't bother with locking if we are the first thread.
35 if (KeGetCurrentThread() == NULL)
39 ExAcquireFastMutex(&AddressSpace->Lock);
43 MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace)
46 * Don't bother locking if we are the first thread.
48 if (KeGetCurrentThread() == NULL)
52 ExReleaseFastMutex(&AddressSpace->Lock);
56 MmInitializeKernelAddressSpace(VOID)
58 MmInitializeAddressSpace(NULL, &KernelAddressSpace);
61 PMADDRESS_SPACE MmGetCurrentAddressSpace(VOID)
63 return(&PsGetCurrentProcess()->AddressSpace);
66 PMADDRESS_SPACE MmGetKernelAddressSpace(VOID)
68 return(&KernelAddressSpace);
72 MmInitializeAddressSpace(PEPROCESS Process,
73 PMADDRESS_SPACE AddressSpace)
75 InitializeListHead(&AddressSpace->MAreaListHead);
76 ExInitializeFastMutex(&AddressSpace->Lock);
79 AddressSpace->LowestAddress = MM_LOWEST_USER_ADDRESS;
84 AddressSpace->LowestAddress = KERNEL_BASE;
85 #else /* !LIBCAPTIVE */
86 AddressSpace->LowestAddress = MM_LOWEST_USER_ADDRESS;
87 #endif /* !LIBCAPTIVE */
89 AddressSpace->Process = Process;
92 AddressSpace->PageTableRefCountTable =
93 ExAllocatePoolWithTag(NonPagedPool, 768 * sizeof(USHORT),
95 AddressSpace->PageTableRefCountTableSize = 768;
99 AddressSpace->PageTableRefCountTable = NULL;
100 AddressSpace->PageTableRefCountTableSize = 0;
102 return(STATUS_SUCCESS);
106 MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace)
108 if (AddressSpace->PageTableRefCountTable != NULL)
110 ExFreePool(AddressSpace->PageTableRefCountTable);
112 return(STATUS_SUCCESS);