fd7da65df39aabecb68409dcbe30d125659c54aa
[reactos.git] / reactos / include / internal / mm.h
1 /*
2 * Higher level memory managment definitions
3 */
4
5 #ifndef __INCLUDE_INTERNAL_MM_H
6 #define __INCLUDE_INTERNAL_MM_H
7
8 #include <internal/linkage.h>
9 #include <internal/ntoskrnl.h>
10 #include <windows.h>
11
12 /* TYPES *********************************************************************/
13
14 enum
15 {
16 MEMORY_AREA_INVALID,
17 MEMORY_AREA_SECTION_VIEW_COMMIT,
18 MEMORY_AREA_CONTINUOUS_MEMORY,
19 MEMORY_AREA_NO_CACHE,
20 MEMORY_AREA_IO_MAPPING,
21 MEMORY_AREA_SYSTEM,
22 MEMORY_AREA_MDL_MAPPING,
23 MEMORY_AREA_COMMIT,
24 MEMORY_AREA_RESERVE,
25 MEMORY_AREA_SECTION_VIEW_RESERVE,
26 MEMORY_AREA_CACHE_SEGMENT,
27 };
28
29 #define PAGE_TO_SECTION_PAGE_DIRECTORY_OFFSET(x) ((x) / (4*1024*1024))
30 #define PAGE_TO_SECTION_PAGE_TABLE_OFFSET(x) (((x) % 4*1024*1024) / (4*1024))
31
32 #define NR_SECTION_PAGE_TABLES (1024)
33 #define NR_SECTION_PAGE_ENTRIES (1024)
34
35 typedef struct
36 {
37 PVOID Pages[NR_SECTION_PAGE_ENTRIES];
38 } SECTION_PAGE_TABLE, *PSECTION_PAGE_TABLE;
39
40 typedef struct
41 {
42 PSECTION_PAGE_TABLE PageTables[NR_SECTION_PAGE_TABLES];
43 } SECTION_PAGE_DIRECTORY, *PSECTION_PAGE_DIRECTORY;
44
45 typedef struct
46 {
47 CSHORT Type;
48 CSHORT Size;
49 LARGE_INTEGER MaximumSize;
50 ULONG SectionPageProtection;
51 ULONG AllocateAttributes;
52 PFILE_OBJECT FileObject;
53 LIST_ENTRY ViewListHead;
54 KSPIN_LOCK ViewListLock;
55 KMUTEX Lock;
56 SECTION_PAGE_DIRECTORY PageDirectory;
57 } SECTION_OBJECT, *PSECTION_OBJECT;
58
59 typedef struct
60 {
61 ULONG Type;
62 PVOID BaseAddress;
63 ULONG Length;
64 ULONG Attributes;
65 LIST_ENTRY Entry;
66 ULONG LockCount;
67 PEPROCESS Process;
68 union
69 {
70 struct
71 {
72 SECTION_OBJECT* Section;
73 ULONG ViewOffset;
74 LIST_ENTRY ViewListEntry;
75 } SectionData;
76 } Data;
77 } MEMORY_AREA, *PMEMORY_AREA;
78
79
80 /* FUNCTIONS */
81
82 VOID MmLockAddressSpace(PMADDRESS_SPACE AddressSpace);
83 VOID MmUnlockAddressSpace(PMADDRESS_SPACE AddressSpace);
84 VOID MmInitializeKernelAddressSpace(VOID);
85 PMADDRESS_SPACE MmGetCurrentAddressSpace(VOID);
86 PMADDRESS_SPACE MmGetKernelAddressSpace(VOID);
87 NTSTATUS MmInitializeAddressSpace(PEPROCESS Process,
88 PMADDRESS_SPACE AddressSpace);
89 NTSTATUS MmDestroyAddressSpace(PMADDRESS_SPACE AddressSpace);
90 PVOID STDCALL MmAllocateSection (IN ULONG Length);
91 NTSTATUS MmCreateMemoryArea(PEPROCESS Process,
92 PMADDRESS_SPACE AddressSpace,
93 ULONG Type,
94 PVOID* BaseAddress,
95 ULONG Length,
96 ULONG Attributes,
97 MEMORY_AREA** Result);
98 MEMORY_AREA* MmOpenMemoryAreaByAddress(PMADDRESS_SPACE AddressSpace,
99 PVOID Address);
100 NTSTATUS MmInitMemoryAreas(VOID);
101 VOID ExInitNonPagedPool(ULONG BaseAddress);
102 NTSTATUS MmFreeMemoryArea(PMADDRESS_SPACE AddressSpace,
103 PVOID BaseAddress,
104 ULONG Length,
105 BOOLEAN FreePages);
106 VOID MmDumpMemoryAreas(PLIST_ENTRY ListHead);
107 NTSTATUS MmLockMemoryArea(MEMORY_AREA* MemoryArea);
108 NTSTATUS MmUnlockMemoryArea(MEMORY_AREA* MemoryArea);
109 NTSTATUS MmInitSectionImplementation(VOID);
110
111 /*void VirtualInit(boot_param* bp);*/
112
113 #define MM_LOWEST_USER_ADDRESS (4096)
114
115 PMEMORY_AREA MmSplitMemoryArea(PEPROCESS Process,
116 PMADDRESS_SPACE AddressSpace,
117 PMEMORY_AREA OriginalMemoryArea,
118 PVOID BaseAddress,
119 ULONG Length,
120 ULONG NewType,
121 ULONG NewAttributes);
122 PVOID MmInitializePageList(PVOID FirstPhysKernelAddress,
123 PVOID LastPhysKernelAddress,
124 ULONG MemorySizeInPages,
125 ULONG LastKernelBase);
126
127 PVOID MmAllocPage(VOID);
128 VOID MmDereferencePage(PVOID PhysicalAddress);
129 VOID MmReferencePage(PVOID PhysicalAddress);
130 VOID MmDeletePageTable(PEPROCESS Process, PVOID Address);
131 NTSTATUS MmCopyMmInfo(PEPROCESS Src, PEPROCESS Dest);
132 NTSTATUS MmReleaseMmInfo(PEPROCESS Process);
133 NTSTATUS Mmi386ReleaseMmInfo(PEPROCESS Process);
134 VOID MmDeletePageEntry(PEPROCESS Process, PVOID Address, BOOL FreePage);
135
136 VOID MmBuildMdlFromPages(PMDL Mdl);
137 PVOID MmGetMdlPageAddress(PMDL Mdl, PVOID Offset);
138 VOID MiShutdownMemoryManager(VOID);
139 ULONG MmGetPhysicalAddressForProcess(PEPROCESS Process,
140 PVOID Address);
141 NTSTATUS STDCALL MmUnmapViewOfSection(PEPROCESS Process,
142 PMEMORY_AREA MemoryArea);
143 PVOID MiTryToSharePageInSection(PSECTION_OBJECT Section, ULONG Offset);
144
145 NTSTATUS MmSafeCopyFromUser(PVOID Dest, PVOID Src, ULONG NumberOfBytes);
146 NTSTATUS MmSafeCopyToUser(PVOID Dest, PVOID Src, ULONG NumberOfBytes);
147 VOID MmInitPagingFile(VOID);
148
149 /* FIXME: it should be in ddk/mmfuncs.h */
150 NTSTATUS
151 STDCALL
152 MmCreateSection (
153 OUT PSECTION_OBJECT * SectionObject,
154 IN ACCESS_MASK DesiredAccess,
155 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
156 IN PLARGE_INTEGER MaximumSize,
157 IN ULONG SectionPageProtection,
158 IN ULONG AllocationAttributes,
159 IN HANDLE FileHandle OPTIONAL,
160 IN PFILE_OBJECT File OPTIONAL
161 );
162
163 NTSTATUS MmPageFault(ULONG Cs,
164 PULONG Eip,
165 PULONG Eax,
166 ULONG Cr2,
167 ULONG ErrorCode);
168
169 NTSTATUS MmAccessFault(KPROCESSOR_MODE Mode,
170 ULONG Address);
171 NTSTATUS MmNotPresentFault(KPROCESSOR_MODE Mode,
172 ULONG Address);
173
174 #endif