1 /* $Id: aspace.c,v 1.13 2002/09/08 10:23:32 chorns Exp $
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
;
83 AddressSpace
->LowestAddress
= KERNEL_BASE
;
85 AddressSpace
->Process
= Process
;
88 AddressSpace
->PageTableRefCountTable
=
89 ExAllocatePoolWithTag(NonPagedPool
, 768 * sizeof(USHORT
),
91 AddressSpace
->PageTableRefCountTableSize
= 768;
95 AddressSpace
->PageTableRefCountTable
= NULL
;
96 AddressSpace
->PageTableRefCountTableSize
= 0;
98 return(STATUS_SUCCESS
);
102 MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace
)
104 if (AddressSpace
->PageTableRefCountTable
!= NULL
)
106 ExFreePool(AddressSpace
->PageTableRefCountTable
);
108 return(STATUS_SUCCESS
);