- Define DECLSPEC_ADDRSAFE and FORCEINLINE for gcc in winnt.h
[reactos.git] / reactos / include / ndk / mmtypes.h
1 /*++ NDK Version: 0095
2
3 Copyright (c) Alex Ionescu. All rights reserved.
4
5 Header Name:
6
7 mmtypes.h
8
9 Abstract:
10
11 Type definitions for the Memory Manager
12
13 Author:
14
15 Alex Ionescu (alex.ionescu@reactos.com) 06-Oct-2004
16
17 --*/
18
19 #ifndef _MMTYPES_H
20 #define _MMTYPES_H
21
22 //
23 // Dependencies
24 //
25 #include <arch/mmtypes.h>
26
27 //
28 // Page-Rounding Macros
29 //
30 #define PAGE_ROUND_DOWN(x) (((ULONG)x)&(~(PAGE_SIZE-1)))
31 #define PAGE_ROUND_UP(x) \
32 ( (((ULONG)x)%PAGE_SIZE) ? ((((ULONG)x)&(~(PAGE_SIZE-1)))+PAGE_SIZE) : ((ULONG)x) )
33
34 //
35 // Macro for generating pool tags
36 //
37 #define TAG(A, B, C, D) (ULONG)(((A)<<0) + ((B)<<8) + ((C)<<16) + ((D)<<24))
38
39 #ifdef NTOS_MODE_USER
40
41 //
42 // Section Flags for NtCreateSection
43 //
44 #define SEC_BASED 0x00200000
45 #define SEC_NO_CHANGE 0x00400000
46
47 //
48 // Section Inherit Flags for NtCreateSection
49 //
50 typedef enum _SECTION_INHERIT
51 {
52 ViewShare = 1,
53 ViewUnmap = 2
54 } SECTION_INHERIT;
55
56 //
57 // Pool Types
58 //
59 typedef enum _POOL_TYPE
60 {
61 NonPagedPool,
62 PagedPool,
63 NonPagedPoolMustSucceed,
64 DontUseThisType,
65 NonPagedPoolCacheAligned,
66 PagedPoolCacheAligned,
67 NonPagedPoolCacheAlignedMustS,
68 MaxPoolType,
69 NonPagedPoolSession = 32,
70 PagedPoolSession,
71 NonPagedPoolMustSucceedSession,
72 DontUseThisTypeSession,
73 NonPagedPoolCacheAlignedSession,
74 PagedPoolCacheAlignedSession,
75 NonPagedPoolCacheAlignedMustSSession
76 } POOL_TYPE;
77 #endif
78
79 //
80 // Per Processor Non Paged Lookaside List IDs
81 //
82 typedef enum _PP_NPAGED_LOOKASIDE_NUMBER
83 {
84 LookasideSmallIrpList = 0,
85 LookasideLargeIrpList = 1,
86 LookasideMdlList = 2,
87 LookasideCreateInfoList = 3,
88 LookasideNameBufferList = 4,
89 LookasideTwilightList = 5,
90 LookasideCompletionList = 6,
91 LookasideMaximumList = 7
92 } PP_NPAGED_LOOKASIDE_NUMBER;
93
94 //
95 // Memory Information Classes for NtQueryVirtualMemory
96 //
97 typedef enum _MEMORY_INFORMATION_CLASS
98 {
99 MemoryBasicInformation,
100 MemoryWorkingSetList,
101 MemorySectionName,
102 MemoryBasicVlmInformation
103 } MEMORY_INFORMATION_CLASS;
104
105 //
106 // Section Information Clasess for NtQuerySection
107 //
108 typedef enum _SECTION_INFORMATION_CLASS
109 {
110 SectionBasicInformation,
111 SectionImageInformation,
112 } SECTION_INFORMATION_CLASS;
113
114 #ifdef NTOS_MODE_USER
115
116 //
117 // Virtual Memory Counters
118 //
119 typedef struct _VM_COUNTERS
120 {
121 SIZE_T PeakVirtualSize;
122 SIZE_T VirtualSize;
123 ULONG PageFaultCount;
124 SIZE_T PeakWorkingSetSize;
125 SIZE_T WorkingSetSize;
126 SIZE_T QuotaPeakPagedPoolUsage;
127 SIZE_T QuotaPagedPoolUsage;
128 SIZE_T QuotaPeakNonPagedPoolUsage;
129 SIZE_T QuotaNonPagedPoolUsage;
130 SIZE_T PagefileUsage;
131 SIZE_T PeakPagefileUsage;
132 } VM_COUNTERS, *PVM_COUNTERS;
133
134 typedef struct _VM_COUNTERS_EX
135 {
136 SIZE_T PeakVirtualSize;
137 SIZE_T VirtualSize;
138 ULONG PageFaultCount;
139 SIZE_T PeakWorkingSetSize;
140 SIZE_T WorkingSetSize;
141 SIZE_T QuotaPeakPagedPoolUsage;
142 SIZE_T QuotaPagedPoolUsage;
143 SIZE_T QuotaPeakNonPagedPoolUsage;
144 SIZE_T QuotaNonPagedPoolUsage;
145 SIZE_T PagefileUsage;
146 SIZE_T PeakPagefileUsage;
147 SIZE_T PrivateUsage;
148 } VM_COUNTERS_EX, *PVM_COUNTERS_EX;
149 #endif
150
151 //
152 // List of Working Sets
153 //
154 typedef struct _MEMORY_WORKING_SET_LIST
155 {
156 ULONG NumberOfPages;
157 ULONG WorkingSetList[1];
158 } MEMORY_WORKING_SET_LIST, *PMEMORY_WORKING_SET_LIST;
159
160 //
161 // Memory Information Structures for NtQueryVirtualMemory
162 //
163 typedef struct
164 {
165 UNICODE_STRING SectionFileName;
166 WCHAR NameBuffer[ANYSIZE_ARRAY];
167 } MEMORY_SECTION_NAME, *PMEMORY_SECTION_NAME;
168
169 //
170 // Section Information Structures for NtQuerySection
171 //
172 typedef struct _SECTION_BASIC_INFORMATION
173 {
174 PVOID BaseAddress;
175 ULONG Attributes;
176 LARGE_INTEGER Size;
177 } SECTION_BASIC_INFORMATION, *PSECTION_BASIC_INFORMATION;
178
179 typedef struct _SECTION_IMAGE_INFORMATION
180 {
181 PVOID TransferAddress;
182 ULONG ZeroBits;
183 ULONG MaximumStackSize;
184 ULONG CommittedStackSize;
185 ULONG SubsystemType;
186 USHORT SubSystemMinorVersion;
187 USHORT SubSystemMajorVersion;
188 ULONG GpValue;
189 USHORT ImageCharacteristics;
190 USHORT DllChracteristics;
191 USHORT Machine;
192 UCHAR ImageContainsCode;
193 UCHAR Spare1;
194 ULONG LoaderFlags;
195 ULONG ImageFileSIze;
196 ULONG Reserved[1];
197 } SECTION_IMAGE_INFORMATION, *PSECTION_IMAGE_INFORMATION;
198
199 #ifndef NTOS_MODE_USER
200
201 //
202 // FIXME: REACTOS SPECIFIC HACK IN EPROCESS
203 //
204 typedef struct _MADDRESS_SPACE
205 {
206 struct _MEMORY_AREA *MemoryAreaRoot;
207 FAST_MUTEX Lock;
208 PVOID LowestAddress;
209 struct _EPROCESS* Process;
210 PUSHORT PageTableRefCountTable;
211 ULONG PageTableRefCountTableSize;
212 } MADDRESS_SPACE, *PMADDRESS_SPACE;
213
214 //
215 // Generic Address Range Structure
216 //
217 typedef struct _ADDRESS_RANGE
218 {
219 ULONG BaseAddrLow;
220 ULONG BaseAddrHigh;
221 ULONG LengthLow;
222 ULONG LengthHigh;
223 ULONG Type;
224 } ADDRESS_RANGE, *PADDRESS_RANGE;
225
226 //
227 // Node in Memory Manager's AVL Table
228 //
229 typedef struct _MMADDRESS_NODE
230 {
231 union
232 {
233 ULONG Balance:2;
234 struct _MMADDRESS_NODE *Parent;
235 } u1;
236 struct _MMADDRESS_NODE *LeftChild;
237 struct _MMADDRESS_NODE *RightChild;
238 ULONG StartingVpn;
239 ULONG EndingVpn;
240 } MMADDRESS_NODE, *PMMADDRESS_NODE;
241
242 //
243 // Memory Manager AVL Table for VADs and other descriptors
244 //
245 typedef struct _MM_AVL_TABLE
246 {
247 MMADDRESS_NODE BalancedRoot;
248 ULONG DepthOfTree:5;
249 ULONG Unused:3;
250 ULONG NumberGenericTableElements:24;
251 PVOID NodeHint;
252 PVOID NodeFreeHint;
253 } MM_AVL_TABLE, *PMM_AVL_TABLE;
254
255 //
256 // Memory Manager Working Set Structures
257 //
258 typedef struct _MMWSLENTRY
259 {
260 ULONG Valid:1;
261 ULONG LockedInWs:1;
262 ULONG LockedInMemory:1;
263 ULONG Protection:5;
264 ULONG Hashed:1;
265 ULONG Direct:1;
266 ULONG Age:2;
267 ULONG VirtualPageNumber:14;
268 } MMWSLENTRY, *PMMWSLENTRY;
269
270 typedef struct _MMWSLE
271 {
272 union
273 {
274 PVOID VirtualAddress;
275 ULONG Long;
276 MMWSLENTRY e1;
277 };
278 } MMWSLE, *PMMWSLE;
279
280 typedef struct _MMWSLE_HASH
281 {
282 PVOID Key;
283 ULONG Index;
284 } MMWSLE_HASH, *PMMWSLE_HASH;
285
286 typedef struct _MMWSL
287 {
288 ULONG FirstFree;
289 ULONG FirstDynamic;
290 ULONG LastEntry;
291 ULONG NextSlot;
292 PMMWSLE Wsle;
293 ULONG LastInitializedWsle;
294 ULONG NonDirectcout;
295 PMMWSLE_HASH HashTable;
296 ULONG HashTableSize;
297 ULONG NumberOfCommittedPageTables;
298 PVOID HashTableStart;
299 PVOID HighestPermittedHashAddress;
300 ULONG NumberOfImageWaiters;
301 ULONG VadBitMapHint;
302 USHORT UsedPageTableEntries[768];
303 ULONG CommittedPageTables[24];
304 } MMWSL, *PMMWSL;
305
306 //
307 // Flags for Memory Support Structure
308 //
309 typedef struct _MMSUPPORT_FLAGS
310 {
311 ULONG SessionSpace:1;
312 ULONG BeingTrimmed:1;
313 ULONG SessionLeader:1;
314 ULONG TrimHard:1;
315 ULONG WorkingSetHard:1;
316 ULONG AddressSpaceBeingDeleted :1;
317 ULONG Available:10;
318 ULONG AllowWorkingSetAdjustment:8;
319 ULONG MemoryPriority:8;
320 } MMSUPPORT_FLAGS, *PMMSUPPORT_FLAGS;
321
322 //
323 // Per-Process Memory Manager Data
324 //
325 typedef struct _MMSUPPORT
326 {
327 LARGE_INTEGER LastTrimTime;
328 MMSUPPORT_FLAGS Flags;
329 ULONG PageFaultCount;
330 ULONG PeakWorkingSetSize;
331 ULONG WorkingSetSize;
332 ULONG MinimumWorkingSetSize;
333 ULONG MaximumWorkingSetSize;
334 PMMWSL MmWorkingSetList;
335 LIST_ENTRY WorkingSetExpansionLinks;
336 ULONG Claim;
337 ULONG NextEstimationSlot;
338 ULONG NextAgingSlot;
339 ULONG EstimatedAvailable;
340 ULONG GrowthSinceLastEstimate;
341 } MMSUPPORT, *PMMSUPPORT;
342
343 #endif // !NTOS_MODE_USER
344
345 #endif // _MMTYPES_H