ReactOS 0.4.16-dev-550-g2186ce3
miarm.h
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: ntoskrnl/mm/ARM3/miarm.h
5 * PURPOSE: ARM Memory Manager Header
6 * PROGRAMMERS: ReactOS Portable Systems Group
7 */
8
9#pragma once
10
11#ifdef __cplusplus
12extern "C" {
13#endif
14
15#define MI_LOWEST_VAD_ADDRESS (PVOID)MM_LOWEST_USER_ADDRESS
16
17/* Make the code cleaner with some definitions for size multiples */
18#define _1KB (1024u)
19#define _1MB (1024 * _1KB)
20#define _1GB (1024 * _1MB)
21
22/* Everyone loves 64K */
23#define _64K (64 * _1KB)
24
25/* Size of a page table */
26#define PT_SIZE (PTE_PER_PAGE * sizeof(MMPTE))
27
28/* Size of a page directory */
29#define PD_SIZE (PDE_PER_PAGE * sizeof(MMPDE))
30
31/* Size of all page directories for a process */
32#define SYSTEM_PD_SIZE (PPE_PER_PAGE * PD_SIZE)
33#ifdef _M_IX86
35#endif
36
37//
38// Protection Bits part of the internal memory manager Protection Mask, from:
39// http://reactos.org/wiki/Techwiki:Memory_management_in_the_Windows_XP_kernel
40// https://www.reactos.org/wiki/Techwiki:Memory_Protection_constants
41// and public assertions.
42//
43#define MM_ZERO_ACCESS 0
44#define MM_READONLY 1
45#define MM_EXECUTE 2
46#define MM_EXECUTE_READ 3
47#define MM_READWRITE 4
48#define MM_WRITECOPY 5
49#define MM_EXECUTE_READWRITE 6
50#define MM_EXECUTE_WRITECOPY 7
51#define MM_PROTECT_ACCESS 7
52
53//
54// These are flags on top of the actual protection mask
55//
56#define MM_NOCACHE 0x08
57#define MM_GUARDPAGE 0x10
58#define MM_WRITECOMBINE 0x18
59#define MM_PROTECT_SPECIAL 0x18
60
61//
62// These are special cases
63//
64#define MM_DECOMMIT (MM_ZERO_ACCESS | MM_GUARDPAGE)
65#define MM_NOACCESS (MM_ZERO_ACCESS | MM_WRITECOMBINE)
66#define MM_OUTSWAPPED_KSTACK (MM_EXECUTE_WRITECOPY | MM_WRITECOMBINE)
67#define MM_INVALID_PROTECTION 0xFFFFFFFF
68
69//
70// Specific PTE Definitions that map to the Memory Manager's Protection Mask Bits
71// The Memory Manager's definition define the attributes that must be preserved
72// and these PTE definitions describe the attributes in the hardware sense. This
73// helps deal with hardware differences between the actual boolean expression of
74// the argument.
75//
76// For example, in the logical attributes, we want to express read-only as a flag
77// but on x86, it is writability that must be set. On the other hand, on x86, just
78// like in the kernel, it is disabling the caches that requires a special flag,
79// while on certain architectures such as ARM, it is enabling the cache which
80// requires a flag.
81//
82#if defined(_M_IX86)
83//
84// Access Flags
85//
86#define PTE_READONLY 0 // Doesn't exist on x86
87#define PTE_EXECUTE 0 // Not worrying about NX yet
88#define PTE_EXECUTE_READ 0 // Not worrying about NX yet
89#define PTE_READWRITE 0x2
90#define PTE_WRITECOPY 0x200
91#define PTE_EXECUTE_READWRITE 0x2 // Not worrying about NX yet
92#define PTE_EXECUTE_WRITECOPY 0x200
93#define PTE_PROTOTYPE 0x400
94
95//
96// State Flags
97//
98#define PTE_VALID 0x1
99#define PTE_ACCESSED 0x20
100#define PTE_DIRTY 0x40
101
102//
103// Cache flags
104//
105#define PTE_ENABLE_CACHE 0
106#define PTE_DISABLE_CACHE 0x10
107#define PTE_WRITECOMBINED_CACHE 0x10
108#define PTE_PROTECT_MASK 0x612
109#elif defined(_M_AMD64)
110//
111// Access Flags
112//
113#define PTE_READONLY 0x8000000000000000ULL
114#define PTE_EXECUTE 0x0000000000000000ULL
115#define PTE_EXECUTE_READ PTE_EXECUTE /* EXECUTE implies READ on x64 */
116#define PTE_READWRITE 0x8000000000000002ULL
117#define PTE_WRITECOPY 0x8000000000000200ULL
118#define PTE_EXECUTE_READWRITE 0x0000000000000002ULL
119#define PTE_EXECUTE_WRITECOPY 0x0000000000000200ULL
120#define PTE_PROTOTYPE 0x0000000000000400ULL
121
122//
123// State Flags
124//
125#define PTE_VALID 0x0000000000000001ULL
126#define PTE_ACCESSED 0x0000000000000020ULL
127#define PTE_DIRTY 0x0000000000000040ULL
128
129//
130// Cache flags
131//
132#define PTE_ENABLE_CACHE 0x0000000000000000ULL
133#define PTE_DISABLE_CACHE 0x0000000000000010ULL
134#define PTE_WRITECOMBINED_CACHE 0x0000000000000010ULL
135#define PTE_PROTECT_MASK 0x8000000000000612ULL
136#elif defined(_M_ARM)
137#define PTE_READONLY 0x200
138#define PTE_EXECUTE 0 // Not worrying about NX yet
139#define PTE_EXECUTE_READ 0 // Not worrying about NX yet
140#define PTE_READWRITE 0 // Doesn't exist on ARM
141#define PTE_WRITECOPY 0 // Doesn't exist on ARM
142#define PTE_EXECUTE_READWRITE 0 // Not worrying about NX yet
143#define PTE_EXECUTE_WRITECOPY 0 // Not worrying about NX yet
144#define PTE_PROTOTYPE 0x400 // Using the Shared bit
145
146//
147// Cache flags
148//
149#define PTE_ENABLE_CACHE 0
150#define PTE_DISABLE_CACHE 0x10
151#define PTE_WRITECOMBINED_CACHE 0x10
152#define PTE_PROTECT_MASK 0x610
153#else
154#error Define these please!
155#endif
156
157//
158// Some internal SYSTEM_PTE_MISUSE bugcheck subcodes
159// These names were created by Oleg Dubinskiy and Doug Lyons for ReactOS. For reference, see
160// https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/bug-check-0xda--system-pte-misuse
161//
162#define PTE_MAPPING_NONE 0x100
163#define PTE_MAPPING_NOT_OWNED 0x101
164#define PTE_MAPPING_EMPTY 0x102
165#define PTE_MAPPING_RESERVED 0x103
166#define PTE_MAPPING_ADDRESS_NOT_OWNED 0x104
167#define PTE_MAPPING_ADDRESS_INVALID 0x105
168#define PTE_UNMAPPING_ADDRESS_NOT_OWNED 0x108
169#define PTE_MAPPING_ADDRESS_EMPTY 0x109
170
171//
172// Mask for image section page protection
173//
174#define IMAGE_SCN_PROTECTION_MASK (IMAGE_SCN_MEM_WRITE | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_EXECUTE)
175
176extern const ULONG_PTR MmProtectToPteMask[32];
177extern const ULONG MmProtectToValue[32];
178
179//
180// Assertions for session images, addresses, and PTEs
181//
182#define MI_IS_SESSION_IMAGE_ADDRESS(Address) \
183 (((Address) >= MiSessionImageStart) && ((Address) < MiSessionImageEnd))
184
185#define MI_IS_SESSION_ADDRESS(Address) \
186 (((Address) >= MmSessionBase) && ((Address) < MiSessionSpaceEnd))
187
188#define MI_IS_SESSION_PTE(Pte) \
189 ((((PMMPTE)Pte) >= MiSessionBasePte) && (((PMMPTE)Pte) < MiSessionLastPte))
190
191#define MI_IS_PAGE_TABLE_ADDRESS(Address) \
192 (((PVOID)(Address) >= (PVOID)PTE_BASE) && ((PVOID)(Address) <= (PVOID)PTE_TOP))
193
194#define MI_IS_SYSTEM_PAGE_TABLE_ADDRESS(Address) \
195 (((Address) >= (PVOID)MiAddressToPte(MmSystemRangeStart)) && ((Address) <= (PVOID)PTE_TOP))
196
197#define MI_IS_PAGE_TABLE_OR_HYPER_ADDRESS(Address) \
198 (((PVOID)(Address) >= (PVOID)PTE_BASE) && ((PVOID)(Address) <= (PVOID)MmHyperSpaceEnd))
199
200//
201// Creates a software PTE with the given protection
202//
203#define MI_MAKE_SOFTWARE_PTE(p, x) ((p)->u.Long = (x << MM_PTE_SOFTWARE_PROTECTION_BITS))
204
205//
206// Marks a PTE as deleted
207//
208#define MI_SET_PFN_DELETED(x) ((x)->PteAddress = (PMMPTE)((ULONG_PTR)(x)->PteAddress | 1))
209#define MI_IS_PFN_DELETED(x) ((ULONG_PTR)((x)->PteAddress) & 1)
210
211//
212// Special values for LoadedImports
213//
214#define MM_SYSLDR_NO_IMPORTS ((PVOID)(ULONG_PTR)-2)
215#define MM_SYSLDR_BOOT_LOADED ((PVOID)(ULONG_PTR)-1)
216#define MM_SYSLDR_SINGLE_ENTRY 0x1
217
218//
219// Number of initial session IDs
220//
221#define MI_INITIAL_SESSION_IDS 64
222
223#if defined(_M_IX86) || defined(_M_ARM)
224//
225// PFN List Sentinel
226//
227#define LIST_HEAD 0xFFFFFFFF
228
229//
230// Because GCC cannot automatically downcast 0xFFFFFFFF to lesser-width bits,
231// we need a manual definition suited to the number of bits in the PteFrame.
232// This is used as a LIST_HEAD for the colored list
233//
234#define COLORED_LIST_HEAD ((1 << 25) - 1) // 0x1FFFFFF
235#elif defined(_M_AMD64)
236#define LIST_HEAD 0xFFFFFFFFFFFFFFFFLL
237#define COLORED_LIST_HEAD ((1ULL << 57) - 1) // 0x1FFFFFFFFFFFFFFLL
238#else
239#error Define these please!
240#endif
241
242//
243// Returns the color of a page
244//
245#define MI_GET_PAGE_COLOR(x) ((x) & MmSecondaryColorMask)
246#define MI_GET_NEXT_COLOR() (MI_GET_PAGE_COLOR(++MmSystemPageColor))
247#define MI_GET_NEXT_PROCESS_COLOR(x) (MI_GET_PAGE_COLOR(++(x)->NextPageColor))
248
249//
250// Prototype PTEs that don't yet have a pagefile association
251//
252#ifdef _WIN64
253#define MI_PTE_LOOKUP_NEEDED 0xffffffffULL
254#else
255#define MI_PTE_LOOKUP_NEEDED 0xFFFFF
256#endif
257
258//
259// Number of session data and tag pages
260//
261#define MI_SESSION_DATA_PAGES_MAXIMUM (MM_ALLOCATION_GRANULARITY / PAGE_SIZE)
262#define MI_SESSION_TAG_PAGES_MAXIMUM (MM_ALLOCATION_GRANULARITY / PAGE_SIZE)
263
264//
265// Used by MiCheckSecuredVad
266//
267#define MM_READ_WRITE_ALLOWED 11
268#define MM_READ_ONLY_ALLOWED 10
269#define MM_NO_ACCESS_ALLOWED 01
270#define MM_DELETE_CHECK 85
271
272//
273// System views are binned into 64K chunks
274//
275#define MI_SYSTEM_VIEW_BUCKET_SIZE _64K
276
277//
278// FIXFIX: These should go in ex.h after the pool merge
279//
280#ifdef _WIN64
281#define POOL_BLOCK_SIZE 16
282#else
283#define POOL_BLOCK_SIZE 8
284#endif
285#define POOL_LISTS_PER_PAGE (PAGE_SIZE / POOL_BLOCK_SIZE)
286#define BASE_POOL_TYPE_MASK 1
287#define POOL_MAX_ALLOC (PAGE_SIZE - (sizeof(POOL_HEADER) + POOL_BLOCK_SIZE))
288
289//
290// Pool debugging/analysis/tracing flags
291//
292#define POOL_FLAG_CHECK_TIMERS 0x1
293#define POOL_FLAG_CHECK_WORKERS 0x2
294#define POOL_FLAG_CHECK_RESOURCES 0x4
295#define POOL_FLAG_VERIFIER 0x8
296#define POOL_FLAG_CHECK_DEADLOCK 0x10
297#define POOL_FLAG_SPECIAL_POOL 0x20
298#define POOL_FLAG_DBGPRINT_ON_FAILURE 0x40
299#define POOL_FLAG_CRASH_ON_FAILURE 0x80
300
301//
302// BAD_POOL_HEADER codes during pool bugcheck
303//
304#define POOL_CORRUPTED_LIST 3
305#define POOL_SIZE_OR_INDEX_MISMATCH 5
306#define POOL_ENTRIES_NOT_ALIGNED_PREVIOUS 6
307#define POOL_HEADER_NOT_ALIGNED 7
308#define POOL_HEADER_IS_ZERO 8
309#define POOL_ENTRIES_NOT_ALIGNED_NEXT 9
310#define POOL_ENTRY_NOT_FOUND 10
311
312//
313// BAD_POOL_CALLER codes during pool bugcheck
314//
315#define POOL_ENTRY_CORRUPTED 1
316#define POOL_ENTRY_ALREADY_FREE 6
317#define POOL_ENTRY_NOT_ALLOCATED 7
318#define POOL_ALLOC_IRQL_INVALID 8
319#define POOL_FREE_IRQL_INVALID 9
320#define POOL_BILLED_PROCESS_INVALID 13
321#define POOL_HEADER_SIZE_INVALID 32
322
323typedef struct _POOL_DESCRIPTOR
324{
339
340typedef struct _POOL_HEADER
341{
342 union
343 {
344 struct
345 {
346#ifdef _WIN64
351#else
356#endif
357 };
359 };
360#ifdef _WIN64
362#endif
363 union
364 {
365#ifdef _WIN64
366 PEPROCESS ProcessBilled;
367#else
369#endif
370 struct
371 {
374 };
375 };
377
380
382{
391
393{
399
404
405//
406// END FIXFIX
407//
408
410{
414
416{
421
423{
429
431{
435
437{
442
443typedef struct _MMCOLOR_TABLES
444{
449
451{
455
456typedef struct _MMVIEW
457{
461
462typedef struct _MMSESSION
463{
474
476{
481
482typedef struct _MM_SESSION_SPACE
483{
486 union
487 {
490 } u;
518#if defined (_M_AMD64)
519 MMPDE PageDirectory;
520#else
522#endif
523#if defined (_M_AMD64)
524 PMMPTE SpecialPoolFirstPte;
525 PMMPTE SpecialPoolLastPte;
526 PMMPTE NextPdeForSpecialPoolExpansion;
527 PMMPTE LastPdeForSpecialPoolExpansion;
528 PFN_NUMBER SpecialPagesInUse;
529#endif
532
535extern MMPDE ValidKernelPde;
536extern MMPTE ValidKernelPte;
539extern MMPDE DemandZeroPde;
540extern MMPTE DemandZeroPte;
541extern MMPTE PrototypePte;
547extern BOOLEAN MmTrackPtes;
548extern BOOLEAN MmDynamicPfn;
549extern BOOLEAN MmMirroring;
556extern WCHAR MmVerifyDriverBuffer[512];
572extern PVOID MmPagedPoolEnd;
573extern PVOID MmSessionBase;
574extern SIZE_T MmSessionSize;
619extern ULONG MmProductType;
657extern PVOID MiSessionPoolEnd; // 0xBE000000
658extern PVOID MiSessionPoolStart; // 0xBD000000
659extern PVOID MiSessionViewStart; // 0xBE000000
672
676{
677 return (WorkingSet != &MmSystemCacheWs) && !WorkingSet->Flags.SessionSpace;
678}
679
683{
684 return ((MemoryType == LoaderFree) ||
685 (MemoryType == LoaderLoadedProgram) ||
686 (MemoryType == LoaderFirmwareTemporary) ||
687 (MemoryType == LoaderOsloaderStack));
688}
689
693{
694 return ((MemoryType == LoaderFirmwarePermanent) ||
695 (MemoryType == LoaderSpecialMemory) ||
696 (MemoryType == LoaderHALCachedMemory) ||
697 (MemoryType == LoaderBBTMemory));
698}
699
700#ifdef _M_AMD64
703MiIsUserPxe(PVOID Address)
704{
705 return ((ULONG_PTR)Address >> 7) == 0x1FFFFEDF6FB7DA0ULL;
706}
707
710MiIsUserPpe(PVOID Address)
711{
712 return ((ULONG_PTR)Address >> 16) == 0xFFFFF6FB7DA0ULL;
713}
714
718{
719 return ((ULONG_PTR)Address >> 25) == 0x7FFFFB7DA0ULL;
720}
721
725{
726 return ((ULONG_PTR)Address >> 34) == 0x3FFFFDA0ULL;
727}
728#else
732{
733 return ((Address >= (PVOID)MiAddressToPde(NULL)) &&
735}
736
740{
741 return (Address >= (PVOID)PTE_BASE) && (Address <= (PVOID)MiHighestUserPte);
742}
743#endif
744
745//
746// Figures out the hardware bits for a PTE
747//
751{
753
754 /* Start fresh */
755 TempPte.u.Long = 0;
756
757 /* Make it valid and accessed */
758 TempPte.u.Hard.Valid = TRUE;
760
761 /* Is this for user-mode? */
762 if (
763#if (_MI_PAGING_LEVELS == 4)
764 MiIsUserPxe(PointerPte) ||
765#endif
766#if (_MI_PAGING_LEVELS >= 3)
767 MiIsUserPpe(PointerPte) ||
768#endif
769 MiIsUserPde(PointerPte) ||
770 MiIsUserPte(PointerPte))
771 {
772 /* Set the owner bit */
774 }
775
776 /* FIXME: We should also set the global bit */
777
778 /* Return the protection */
779 return TempPte.u.Long;
780}
781
782//
783// Creates a valid kernel PTE with the given protection
784//
786VOID
788 IN PMMPTE MappingPte,
789 IN ULONG_PTR ProtectionMask,
790 IN PFN_NUMBER PageFrameNumber)
791{
792 /* Only valid for kernel, non-session PTEs */
793 ASSERT(MappingPte > MiHighestUserPte);
794 ASSERT(!MI_IS_SESSION_PTE(MappingPte));
795 ASSERT((MappingPte < (PMMPTE)PDE_BASE) || (MappingPte > (PMMPTE)PDE_TOP));
796
797 /* Check that we are not setting valid a page that should not be */
798 ASSERT(ProtectionMask & MM_PROTECT_ACCESS);
799 ASSERT((ProtectionMask & MM_GUARDPAGE) == 0);
800
801 /* Start fresh */
802 NewPte->u.Long = 0;
803
804 /* Set the protection and page */
805 NewPte->u.Hard.PageFrameNumber = PageFrameNumber;
806 NewPte->u.Long |= MmProtectToPteMask[ProtectionMask];
807
808 /* Make this valid & global */
809#ifdef _GLOBAL_PAGES_ARE_AWESOME_
811 NewPte->u.Hard.Global = 1;
812#endif
813 NewPte->u.Hard.Valid = 1;
814}
815
816//
817// Creates a valid PTE with the given protection
818//
820VOID
822 IN PMMPTE MappingPte,
823 IN ULONG_PTR ProtectionMask,
824 IN PFN_NUMBER PageFrameNumber)
825{
826 /* Check that we are not setting valid a page that should not be */
827 ASSERT(ProtectionMask & MM_PROTECT_ACCESS);
828 ASSERT((ProtectionMask & MM_GUARDPAGE) == 0);
829
830 /* Set the protection and page */
831 NewPte->u.Long = MiDetermineUserGlobalPteMask(MappingPte);
832 NewPte->u.Long |= MmProtectToPteMask[ProtectionMask];
833 NewPte->u.Hard.PageFrameNumber = PageFrameNumber;
834}
835
836//
837// Creates a valid user PTE with the given protection
838//
840VOID
842 IN PMMPTE MappingPte,
843 IN ULONG_PTR ProtectionMask,
844 IN PFN_NUMBER PageFrameNumber)
845{
846 /* Only valid for kernel, non-session PTEs */
847 ASSERT(MappingPte <= MiHighestUserPte);
848
849 /* Start fresh */
850 NewPte->u.Long = 0;
851
852 /* Check that we are not setting valid a page that should not be */
853 ASSERT(ProtectionMask & MM_PROTECT_ACCESS);
854 ASSERT((ProtectionMask & MM_GUARDPAGE) == 0);
855
856 NewPte->u.Hard.Valid = TRUE;
857 NewPte->u.Hard.Owner = TRUE;
858 NewPte->u.Hard.PageFrameNumber = PageFrameNumber;
859 NewPte->u.Long |= MmProtectToPteMask[ProtectionMask];
860}
861
862#ifndef _M_AMD64
863//
864// Builds a Prototype PTE for the address of the PTE
865//
867VOID
869 IN PMMPTE PointerPte)
870{
872
873 /* Mark this as a prototype */
874 NewPte->u.Long = 0;
875 NewPte->u.Proto.Prototype = 1;
876
877 /*
878 * Prototype PTEs are only valid in paged pool by design, this little trick
879 * lets us only use 30 bits for the address of the PTE, as long as the area
880 * stays 1024MB At most.
881 */
883
884 /*
885 * 7 bits go in the "low" (but we assume the bottom 2 are zero)
886 * and the other 21 bits go in the "high"
887 */
888 NewPte->u.Proto.ProtoAddressLow = (Offset & 0x1FC) >> 2;
889 NewPte->u.Proto.ProtoAddressHigh = (Offset & 0x3FFFFE00) >> 9;
890}
891
892//
893// Builds a Subsection PTE for the address of the Segment
894//
896VOID
899{
901
902 /* Mark this as a prototype */
903 NewPte->u.Long = 0;
904 NewPte->u.Subsect.Prototype = 1;
905
906 /*
907 * Segments are only valid either in nonpaged pool. We store the 20 bit
908 * difference either from the top or bottom of nonpaged pool, giving a
909 * maximum of 128MB to each delta, meaning nonpaged pool cannot exceed
910 * 256MB.
911 */
912 if ((ULONG_PTR)Segment < ((ULONG_PTR)MmSubsectionBase + (128 * _1MB)))
913 {
915 NewPte->u.Subsect.WhichPool = PagedPool;
916 }
917 else
918 {
920 NewPte->u.Subsect.WhichPool = NonPagedPool;
921 }
922
923 /*
924 * 4 bits go in the "low" (but we assume the bottom 3 are zero)
925 * and the other 20 bits go in the "high"
926 */
927 NewPte->u.Subsect.SubsectionAddressLow = (Offset & 0x78) >> 3;
928 NewPte->u.Subsect.SubsectionAddressHigh = (Offset & 0xFFFFF80) >> 7;
929}
930
934{
936 return ((PointerPte->u.Long & 0xFFFFFC01) != 0);
937}
938
939#endif
940
942VOID
945 _In_ ULONG Protection)
946{
947 NewPte->u.Long = 0;
948 NewPte->u.Trans.Transition = 1;
949 NewPte->u.Trans.Protection = Protection;
950 NewPte->u.Trans.PageFrameNumber = Page;
951}
952
953//
954// Returns if the page is physically resident (ie: a large page)
955// FIXFIX: CISC/x86 only?
956//
960{
961 PMMPDE PointerPde;
962
963 /* Large pages are never paged out, always physically resident */
964 PointerPde = MiAddressToPde(Address);
965 return ((PointerPde->u.Hard.LargePage) && (PointerPde->u.Hard.Valid));
966}
967
968//
969// Writes a valid PTE
970//
972VOID
975{
976 /* Write the valid PTE */
977 ASSERT(PointerPte->u.Hard.Valid == 0);
978 ASSERT(TempPte.u.Hard.Valid == 1);
979#if _M_AMD64
981 (TempPte.u.Hard.NoExecute == 0));
982#endif
983 *PointerPte = TempPte;
984}
985
986//
987// Updates a valid PTE
988//
990VOID
993{
994 /* Write the valid PTE */
995 ASSERT(PointerPte->u.Hard.Valid == 1);
996 ASSERT(TempPte.u.Hard.Valid == 1);
997 ASSERT(PointerPte->u.Hard.PageFrameNumber == TempPte.u.Hard.PageFrameNumber);
998 *PointerPte = TempPte;
999}
1000
1001//
1002// Writes an invalid PTE
1003//
1005VOID
1007 IN MMPTE InvalidPte)
1008{
1009 /* Write the invalid PTE */
1010 ASSERT(InvalidPte.u.Hard.Valid == 0);
1011 *PointerPte = InvalidPte;
1012}
1013
1014//
1015// Erase the PTE completely
1016//
1018VOID
1020{
1021 /* Zero out the PTE */
1022 ASSERT(PointerPte->u.Long != 0);
1023 PointerPte->u.Long = 0;
1024}
1025
1026//
1027// Writes a valid PDE
1028//
1030VOID
1033{
1034 /* Write the valid PDE */
1035 ASSERT(PointerPde->u.Hard.Valid == 0);
1036#ifdef _M_AMD64
1037 ASSERT(PointerPde->u.Hard.NoExecute == 0);
1038#endif
1039 ASSERT(TempPde.u.Hard.Valid == 1);
1040 *PointerPde = TempPde;
1041}
1042
1043//
1044// Writes an invalid PDE
1045//
1047VOID
1049 IN MMPDE InvalidPde)
1050{
1051 /* Write the invalid PDE */
1052 ASSERT(InvalidPde.u.Hard.Valid == 0);
1053 ASSERT(InvalidPde.u.Long != 0);
1054#ifdef _M_AMD64
1055 ASSERT(InvalidPde.u.Soft.Protection == MM_EXECUTE_READWRITE);
1056#endif
1057 *PointerPde = InvalidPde;
1058}
1059
1060//
1061// Checks if the thread already owns a working set
1062//
1064BOOLEAN
1066{
1067 /* If any of these are held, return TRUE */
1074}
1075
1077BOOLEAN
1079{
1083}
1084
1085//
1086// Checks if the process owns the working set lock
1087//
1089BOOLEAN
1091{
1092 /* Check if this process is the owner, and that the thread owns the WS */
1093 if (PsGetCurrentThread()->OwnsProcessWorkingSetExclusive == 0)
1094 {
1095 DPRINT("Thread: %p is not an owner\n", PsGetCurrentThread());
1096 }
1097 if (KeGetCurrentThread()->ApcState.Process != &Process->Pcb)
1098 {
1099 DPRINT("Current thread %p is attached to another process %p\n", PsGetCurrentThread(), Process);
1100 }
1101 return ((KeGetCurrentThread()->ApcState.Process == &Process->Pcb) &&
1102 ((PsGetCurrentThread()->OwnsProcessWorkingSetExclusive) ||
1103 (PsGetCurrentThread()->OwnsProcessWorkingSetShared)));
1104}
1105
1106//
1107// New ARM3<->RosMM PAGE Architecture
1108//
1110BOOLEAN
1112{
1113 return Section->u.Flags.filler;
1114}
1115
1116#define MI_IS_ROS_PFN(x) ((x)->u4.AweAllocation == TRUE)
1117
1118VOID
1119NTAPI
1121 IN PMMPFN Pfn1,
1122 IN PFN_NUMBER PageFrameIndex
1123);
1124
1126BOOLEAN
1128{
1129 return (Process->Vm.Flags.AcquiredUnsafe == TRUE);
1130}
1131
1132//
1133// Locks the working set for the given process
1134//
1136VOID
1139{
1140 /* Shouldn't already be owning the process working set */
1143
1144 /* Block APCs, make sure that still nothing is already held */
1147
1148 /* Lock the working set */
1149 ExAcquirePushLockExclusive(&Process->Vm.WorkingSetMutex);
1150
1151 /* Now claim that we own the lock */
1155}
1156
1158VOID
1161{
1162 /* Shouldn't already be owning the process working set */
1165
1166 /* Block APCs, make sure that still nothing is already held */
1169
1170 /* Lock the working set */
1171 ExAcquirePushLockShared(&Process->Vm.WorkingSetMutex);
1172
1173 /* Now claim that we own the lock */
1178}
1179
1181VOID
1184{
1185 /* Shouldn't already be owning the process working set */
1187
1188 /* APCs must be blocked, make sure that still nothing is already held */
1191
1192 /* Lock the working set */
1193 ExAcquirePushLockExclusive(&Process->Vm.WorkingSetMutex);
1194
1195 /* Now claim that we own the lock */
1197 Process->Vm.Flags.AcquiredUnsafe = 1;
1200}
1201
1202//
1203// Unlocks the working set for the given process
1204//
1206VOID
1209{
1210 /* Make sure we are the owner of a safe acquisition */
1213
1214 /* The thread doesn't own it anymore */
1217
1218 /* Release the lock and re-enable APCs */
1219 ExReleasePushLockExclusive(&Process->Vm.WorkingSetMutex);
1221}
1222
1223//
1224// Unlocks the working set for the given process
1225//
1227VOID
1230{
1231 /* Make sure we are the owner of a safe acquisition (because shared) */
1234
1235 /* Ensure we are in a shared acquisition */
1238
1239 /* Don't claim the lock anylonger */
1241
1242 /* Release the lock and re-enable APCs */
1243 ExReleasePushLockShared(&Process->Vm.WorkingSetMutex);
1245}
1246
1247//
1248// Unlocks the working set for the given process
1249//
1251VOID
1254{
1255 /* Make sure we are the owner of an unsafe acquisition */
1260
1261 /* No longer unsafe */
1262 Process->Vm.Flags.AcquiredUnsafe = 0;
1263
1264 /* The thread doesn't own it anymore */
1267
1268 /* Release the lock but don't touch APC state */
1269 ExReleasePushLockExclusive(&Process->Vm.WorkingSetMutex);
1271}
1272
1273//
1274// Locks the working set
1275//
1277VOID
1279 IN PMMSUPPORT WorkingSet)
1280{
1281 /* Block APCs */
1283
1284 /* Working set should be in global memory */
1285 ASSERT(MI_IS_SESSION_ADDRESS((PVOID)WorkingSet) == FALSE);
1286
1287 /* Thread shouldn't already be owning something */
1289
1290 /* Lock this working set */
1291 ExAcquirePushLockExclusive(&WorkingSet->WorkingSetMutex);
1292
1293 /* Which working set is this? */
1294 if (WorkingSet == &MmSystemCacheWs)
1295 {
1296 /* Own the system working set */
1300 }
1301 else if (WorkingSet->Flags.SessionSpace)
1302 {
1303 /* Own the session working set */
1307 }
1308 else
1309 {
1310 /* Own the process working set */
1314 }
1315}
1316
1318VOID
1321 _In_ PMMSUPPORT WorkingSet)
1322{
1323 /* Block APCs */
1325
1326 /* Working set should be in global memory */
1327 ASSERT(MI_IS_SESSION_ADDRESS((PVOID)WorkingSet) == FALSE);
1328
1329 /* Thread shouldn't already be owning something */
1331
1332 /* Lock this working set */
1333 ExAcquirePushLockShared(&WorkingSet->WorkingSetMutex);
1334
1335 /* Which working set is this? */
1336 if (WorkingSet == &MmSystemCacheWs)
1337 {
1338 /* Own the system working set */
1342 }
1343 else if (WorkingSet->Flags.SessionSpace)
1344 {
1345 /* Own the session working set */
1349 }
1350 else
1351 {
1352 /* Own the process working set */
1356 }
1357}
1358
1359//
1360// Unlocks the working set
1361//
1363VOID
1365 IN PMMSUPPORT WorkingSet)
1366{
1367 /* Working set should be in global memory */
1368 ASSERT(MI_IS_SESSION_ADDRESS((PVOID)WorkingSet) == FALSE);
1369
1370 /* Which working set is this? */
1371 if (WorkingSet == &MmSystemCacheWs)
1372 {
1373 /* Release the system working set */
1377 }
1378 else if (WorkingSet->Flags.SessionSpace)
1379 {
1380 /* Release the session working set */
1384 }
1385 else
1386 {
1387 /* Release the process working set */
1391 }
1392
1393 /* Release the working set lock */
1394 ExReleasePushLockExclusive(&WorkingSet->WorkingSetMutex);
1395
1396 /* Unblock APCs */
1398}
1399
1401VOID
1404 _In_ PMMSUPPORT WorkingSet)
1405{
1406 /* Working set should be in global memory */
1407 ASSERT(MI_IS_SESSION_ADDRESS((PVOID)WorkingSet) == FALSE);
1408
1409 /* Which working set is this? */
1410 if (WorkingSet == &MmSystemCacheWs)
1411 {
1412 /* Release the system working set */
1416 }
1417 else if (WorkingSet->Flags.SessionSpace)
1418 {
1419 /* Release the session working set */
1423 }
1424 else
1425 {
1426 /* Release the process working set */
1430 }
1431
1432 /* Release the working set lock */
1433 ExReleasePushLockShared(&WorkingSet->WorkingSetMutex);
1434
1435 /* Unblock APCs */
1437}
1438
1440BOOLEAN
1444{
1445 /* Sanity check: No exclusive lock. */
1449
1450 /* And it should have one and only one shared lock */
1452
1453 /* Try. */
1455 return FALSE;
1456
1457 if (Vm == &MmSystemCacheWs)
1458 {
1462 }
1463 else if (Vm->Flags.SessionSpace)
1464 {
1468 }
1469 else
1470 {
1474 }
1475
1476 return TRUE;
1477}
1478
1480VOID
1483 OUT PBOOLEAN Safe,
1484 OUT PBOOLEAN Shared)
1485{
1487
1488 /* Check if the current owner is unsafe */
1490 {
1491 /* Release unsafely */
1493 *Safe = FALSE;
1494 *Shared = FALSE;
1495 }
1497 {
1498 /* Owner is safe and exclusive, release normally */
1500 *Safe = TRUE;
1501 *Shared = FALSE;
1502 }
1503 else
1504 {
1505 /* Owner is shared (implies safe), release normally */
1507 *Safe = TRUE;
1508 *Shared = TRUE;
1509 }
1510}
1511
1513VOID
1516 IN BOOLEAN Safe,
1517 IN BOOLEAN Shared)
1518{
1519 /* Check if this was a safe lock or not */
1520 if (Safe)
1521 {
1522 if (Shared)
1523 {
1524 /* Reacquire safely & shared */
1526 }
1527 else
1528 {
1529 /* Reacquire safely */
1531 }
1532 }
1533 else
1534 {
1535 /* Unsafe lock cannot be shared */
1536 ASSERT(Shared == FALSE);
1537 /* Reacquire unsafely */
1539 }
1540}
1541
1543KIRQL
1545{
1546 KIRQL OldIrql;
1547
1552 return OldIrql;
1553}
1554
1556VOID
1558{
1563}
1564
1565//
1566// Returns the ProtoPTE inside a VAD for the given VPN
1567//
1569PMMPTE
1571 IN ULONG_PTR Vpn)
1572{
1573 PMMPTE ProtoPte;
1574
1575 /* Find the offset within the VAD's prototype PTEs */
1576 ProtoPte = Vad->FirstPrototypePte + (Vpn - Vad->StartingVpn);
1577 ASSERT(ProtoPte <= Vad->LastContiguousPte);
1578 return ProtoPte;
1579}
1580
1581//
1582// Returns the PFN Database entry for the given page number
1583// Warning: This is not necessarily a valid PFN database entry!
1584//
1586PMMPFN
1588{
1589 /* Get the entry */
1590 return &MmPfnDatabase[Pfn];
1591};
1592
1593//
1594// Drops a locked page without dereferencing it
1595//
1597VOID
1599{
1600 /* This page shouldn't be locked, but it should be valid */
1601 ASSERT(Pfn1->u3.e2.ReferenceCount != 0);
1602 ASSERT(Pfn1->u2.ShareCount == 0);
1603
1604 /* Is this the last reference to the page */
1605 if (Pfn1->u3.e2.ReferenceCount == 1)
1606 {
1607 /* It better not be valid */
1608 ASSERT(Pfn1->u3.e1.PageLocation != ActiveAndValid);
1609
1610 /* Is it a prototype PTE? */
1611 if ((Pfn1->u3.e1.PrototypePte == 1) &&
1612 (Pfn1->OriginalPte.u.Soft.Prototype == 1))
1613 {
1614 /* FIXME: We should return commit */
1615 DPRINT1("Not returning commit for prototype PTE\n");
1616 }
1617
1618 /* Update the counter */
1620 }
1621}
1622
1623//
1624// Drops a locked page and dereferences it
1625//
1627VOID
1629{
1630 USHORT RefCount, OldRefCount;
1631 PFN_NUMBER PageFrameIndex;
1632
1633 /* Loop while we decrement the page successfully */
1634 do
1635 {
1636 /* There should be at least one reference */
1637 OldRefCount = Pfn1->u3.e2.ReferenceCount;
1638 ASSERT(OldRefCount != 0);
1639
1640 /* Are we the last one */
1641 if (OldRefCount == 1)
1642 {
1643 /* The page shoudln't be shared not active at this point */
1644 ASSERT(Pfn1->u3.e2.ReferenceCount == 1);
1645 ASSERT(Pfn1->u3.e1.PageLocation != ActiveAndValid);
1646 ASSERT(Pfn1->u2.ShareCount == 0);
1647
1648 /* Is it a prototype PTE? */
1649 if ((Pfn1->u3.e1.PrototypePte == 1) &&
1650 (Pfn1->OriginalPte.u.Soft.Prototype == 1))
1651 {
1652 /* FIXME: We should return commit */
1653 DPRINT1("Not returning commit for prototype PTE\n");
1654 }
1655
1656 /* Update the counter, and drop a reference the long way */
1658 PageFrameIndex = MiGetPfnEntryIndex(Pfn1);
1659 MiDecrementReferenceCount(Pfn1, PageFrameIndex);
1660 return;
1661 }
1662
1663 /* Drop a reference the short way, and that's it */
1664 RefCount = InterlockedCompareExchange16((PSHORT)&Pfn1->u3.e2.ReferenceCount,
1665 OldRefCount - 1,
1666 OldRefCount);
1667 ASSERT(RefCount != 0);
1668 } while (OldRefCount != RefCount);
1669
1670 /* If we got here, there should be more than one reference */
1671 ASSERT(RefCount > 1);
1672 if (RefCount == 2)
1673 {
1674 /* Is it still being shared? */
1675 if (Pfn1->u2.ShareCount >= 1)
1676 {
1677 /* Then it should be valid */
1678 ASSERT(Pfn1->u3.e1.PageLocation == ActiveAndValid);
1679
1680 /* Is it a prototype PTE? */
1681 if ((Pfn1->u3.e1.PrototypePte == 1) &&
1682 (Pfn1->OriginalPte.u.Soft.Prototype == 1))
1683 {
1684 /* We don't handle ethis */
1685 ASSERT(FALSE);
1686 }
1687
1688 /* Update the counter */
1690 }
1691 }
1692}
1693
1694//
1695// References a locked page and updates the counter
1696// Used in MmProbeAndLockPages to handle different edge cases
1697//
1699VOID
1701{
1702 USHORT RefCount, OldRefCount;
1703
1704 /* Sanity check */
1705 ASSERT(Pfn1->u3.e2.ReferenceCount != 0);
1706
1707 /* Does ARM3 own the page? */
1708 if (MI_IS_ROS_PFN(Pfn1))
1709 {
1710 /* ReactOS Mm doesn't track share count */
1711 ASSERT(Pfn1->u3.e1.PageLocation == ActiveAndValid);
1712 }
1713 else
1714 {
1715 /* On ARM3 pages, we should see a valid share count */
1716 ASSERT((Pfn1->u2.ShareCount != 0) && (Pfn1->u3.e1.PageLocation == ActiveAndValid));
1717
1718 /* Is it a prototype PTE? */
1719 if ((Pfn1->u3.e1.PrototypePte == 1) &&
1720 (Pfn1->OriginalPte.u.Soft.Prototype == 1))
1721 {
1722 /* FIXME: We should charge commit */
1723 DPRINT1("Not charging commit for prototype PTE\n");
1724 }
1725 }
1726
1727 /* More locked pages! */
1729
1730 /* Loop trying to update the reference count */
1731 do
1732 {
1733 /* Get the current reference count, make sure it's valid */
1734 OldRefCount = Pfn1->u3.e2.ReferenceCount;
1735 ASSERT(OldRefCount != 0);
1736 ASSERT(OldRefCount < 2500);
1737
1738 /* Bump it up by one */
1739 RefCount = InterlockedCompareExchange16((PSHORT)&Pfn1->u3.e2.ReferenceCount,
1740 OldRefCount + 1,
1741 OldRefCount);
1742 ASSERT(RefCount != 0);
1743 } while (OldRefCount != RefCount);
1744
1745 /* Was this the first lock attempt? If not, undo our bump */
1746 if (OldRefCount != 1) InterlockedDecrementSizeT(&MmSystemLockPagesCount);
1747}
1748
1749//
1750// References a locked page and updates the counter
1751// Used in all other cases except MmProbeAndLockPages
1752//
1754VOID
1756{
1757 USHORT NewRefCount;
1758
1759 /* Is it a prototype PTE? */
1760 if ((Pfn1->u3.e1.PrototypePte == 1) &&
1761 (Pfn1->OriginalPte.u.Soft.Prototype == 1))
1762 {
1763 /* FIXME: We should charge commit */
1764 DPRINT1("Not charging commit for prototype PTE\n");
1765 }
1766
1767 /* More locked pages! */
1769
1770 /* Update the reference count */
1771 NewRefCount = InterlockedIncrement16((PSHORT)&Pfn1->u3.e2.ReferenceCount);
1772 if (NewRefCount == 2)
1773 {
1774 /* Is it locked or shared? */
1775 if (Pfn1->u2.ShareCount)
1776 {
1777 /* It's shared, so make sure it's active */
1778 ASSERT(Pfn1->u3.e1.PageLocation == ActiveAndValid);
1779 }
1780 else
1781 {
1782 /* It's locked, so we shouldn't lock again */
1784 }
1785 }
1786 else
1787 {
1788 /* Someone had already locked the page, so undo our bump */
1789 ASSERT(NewRefCount < 2500);
1791 }
1792}
1793
1794//
1795// References a locked page and updates the counter
1796// Used in all other cases except MmProbeAndLockPages
1797//
1799VOID
1801{
1802 USHORT NewRefCount;
1803
1804 /* Make sure the page isn't used yet */
1805 ASSERT(Pfn1->u2.ShareCount == 0);
1806 ASSERT(Pfn1->u3.e1.PageLocation != ActiveAndValid);
1807
1808 /* Is it a prototype PTE? */
1809 if ((Pfn1->u3.e1.PrototypePte == 1) &&
1810 (Pfn1->OriginalPte.u.Soft.Prototype == 1))
1811 {
1812 /* FIXME: We should charge commit */
1813 DPRINT1("Not charging commit for prototype PTE\n");
1814 }
1815
1816 /* More locked pages! */
1818
1819 /* Update the reference count */
1820 NewRefCount = InterlockedIncrement16((PSHORT)&Pfn1->u3.e2.ReferenceCount);
1821 if (NewRefCount != 1)
1822 {
1823 /* Someone had already locked the page, so undo our bump */
1824 ASSERT(NewRefCount < 2500);
1826 }
1827}
1828
1829
1830
1831CODE_SEG("INIT")
1832BOOLEAN
1833NTAPI
1835 IN ULONG Phase,
1836 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1837);
1838
1839CODE_SEG("INIT")
1840VOID
1841NTAPI
1843
1844CODE_SEG("INIT")
1846NTAPI
1848 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1849);
1850
1851CODE_SEG("INIT")
1852VOID
1853NTAPI
1855 VOID
1856);
1857
1858CODE_SEG("INIT")
1859VOID
1860NTAPI
1862 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1863);
1864
1865CODE_SEG("INIT")
1866VOID
1867NTAPI
1869 VOID
1870);
1871
1872CODE_SEG("INIT")
1873VOID
1874NTAPI
1876 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1877);
1878
1879VOID
1880NTAPI
1882 VOID
1883);
1884
1885VOID
1886NTAPI
1888 VOID
1889);
1890
1891CODE_SEG("INIT")
1892BOOLEAN
1893NTAPI
1895 VOID
1896);
1897
1898CODE_SEG("INIT")
1900NTAPI
1902 IN PFN_NUMBER PageCount
1903);
1904
1905CODE_SEG("INIT")
1907NTAPI
1909 IN PLOADER_PARAMETER_BLOCK LoaderBlock,
1910 IN PBOOLEAN IncludeType
1911);
1912
1914NTAPI
1916 IN PLOADER_PARAMETER_BLOCK LoaderBlock,
1917 IN PBOOLEAN IncludeType
1918);
1919
1920VOID
1923 IN PVOID AddressStart,
1924 IN PVOID AddressEnd
1925);
1926
1928NTAPI
1932 IN OUT PSIZE_T NumberOfBytesToProtect,
1933 IN ULONG NewAccessProtection,
1934 OUT PULONG OldAccessProtection OPTIONAL
1935);
1936
1938NTAPI
1940 IN ULONG FaultCode,
1943 IN PVOID TrapInformation
1944);
1945
1950);
1951
1952CODE_SEG("INIT")
1953VOID
1954NTAPI
1956 VOID
1957);
1958
1959CODE_SEG("INIT")
1960VOID
1961NTAPI
1963 VOID
1964);
1965
1966CODE_SEG("INIT")
1967VOID //
1968NTAPI //
1970 IN POOL_TYPE PoolType,// FIXFIX: This should go in ex.h after the pool merge
1971 IN ULONG Threshold //
1972); //
1973
1974// FIXFIX: THIS ONE TOO
1975CODE_SEG("INIT")
1976VOID
1977NTAPI
1979 IN PPOOL_DESCRIPTOR PoolDescriptor,
1981 IN ULONG PoolIndex,
1982 IN ULONG Threshold,
1983 IN PVOID PoolLock
1984);
1985
1987NTAPI
1989 VOID
1990);
1991
1992CODE_SEG("INIT")
1993VOID
1994NTAPI
1996 IN PMMPTE StartingPte,
1997 IN ULONG NumberOfPtes,
1999);
2000
2001PMMPTE
2002NTAPI
2004 IN ULONG NumberOfPtes,
2005 IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType
2006);
2007
2008VOID
2009NTAPI
2011 IN PMMPTE StartingPte,
2012 IN ULONG NumberOfPtes,
2013 IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType
2014);
2015
2016
2018NTAPI
2020 IN PFN_NUMBER LowestPfn,
2021 IN PFN_NUMBER HighestPfn,
2022 IN PFN_NUMBER BoundaryPfn,
2023 IN PFN_NUMBER SizeInPages,
2025);
2026
2027PVOID
2028NTAPI
2031 IN PFN_NUMBER BaseAddressPages,
2032 IN PFN_NUMBER SizeInPages,
2033 IN PFN_NUMBER LowestPfn,
2034 IN PFN_NUMBER HighestPfn,
2035 IN PFN_NUMBER BoundaryPfn,
2036 IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute
2037);
2038
2039PMDL
2040NTAPI
2042 IN PHYSICAL_ADDRESS LowAddress,
2046 IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute,
2047 IN ULONG Flags
2048);
2049
2050VOID
2051NTAPI
2053 IN PMMPFNLIST ListHead,
2054 IN PFN_NUMBER PageFrameIndex
2055);
2056
2057VOID
2058NTAPI
2061);
2062
2063VOID
2064NTAPI
2066 IN PMMPFN Pfn
2067);
2068
2069VOID
2070NTAPI
2072 IN PFN_NUMBER PageFrameIndex,
2073 IN PMMPTE PointerPte,
2074 IN BOOLEAN Modified
2075);
2076
2078NTAPI
2080 OUT PPFN_NUMBER PageFrameIndex,
2081 IN PMMPDE PointerPde,
2082 IN PFN_NUMBER ContainingPageFrame,
2083 IN BOOLEAN SessionAllocation
2084);
2085
2086VOID
2087NTAPI
2089 IN PFN_NUMBER PageFrameIndex,
2090 IN PMMPTE PointerPte,
2092);
2093
2094VOID
2095NTAPI
2097 IN PFN_NUMBER PageFrameIndex,
2098 IN PVOID PteAddress,
2099 IN PFN_NUMBER PteFrame
2100);
2101
2102VOID
2103NTAPI
2105 IN PMMPFN Pfn1,
2106 IN PFN_NUMBER PageFrameIndex
2107);
2108
2110NTAPI
2112 IN ULONG Color
2113);
2114
2116NTAPI
2118 IN ULONG Color
2119);
2120
2121VOID
2122NTAPI
2124 IN PFN_NUMBER PageFrameIndex
2125);
2126
2127VOID
2128NTAPI
2130 IN PFN_NUMBER PageFrameIndex
2131);
2132
2134NTAPI
2136 IN PMMPTE PointerPte,
2137 IN PFN_NUMBER PageCount,
2138 IN ULONG Flags,
2139 OUT PPFN_NUMBER ValidPages
2140);
2141
2142ULONG
2143NTAPI
2145 IN PMMPTE PointerPte
2146);
2147
2149NTAPI
2152);
2153
2154CODE_SEG("INIT")
2155VOID
2156NTAPI
2158 VOID
2159);
2160
2161CODE_SEG("INIT")
2162VOID
2163NTAPI
2165 VOID
2166);
2167
2168CODE_SEG("INIT")
2169VOID
2170NTAPI
2172 VOID
2173);
2174
2175BOOLEAN
2176NTAPI
2178 IN PMMPFN Pfn1
2179);
2180
2181PMMVAD
2182NTAPI
2185);
2186
2188NTAPI
2190 IN ULONG_PTR StartVpn,
2191 IN ULONG_PTR EndVpn,
2193 OUT PMMADDRESS_NODE *NodeOrParent
2194);
2195
2197NTAPI
2200 IN ULONG_PTR BoundaryAddress,
2205);
2206
2208NTAPI
2211 IN ULONG_PTR BoundaryAddress,
2215);
2216
2218NTAPI
2223 OUT PMMADDRESS_NODE *PreviousVad,
2225);
2226
2228NTAPI
2230 IN PMMVAD Vad,
2231 IN PVOID Base,
2232 IN SIZE_T Size,
2233 IN ULONG ProtectionMask
2234);
2235
2236VOID
2237NTAPI
2239 _Inout_ PMMVAD Vad,
2240 _Inout_ PMM_AVL_TABLE VadRoot);
2241
2243NTAPI
2245 _Inout_ PMMVAD Vad,
2248 _In_ ULONG_PTR HighestAddress,
2251
2252VOID
2253NTAPI
2255 IN PSECTION Section
2256);
2257
2259NTAPI
2263 IN BOOLEAN SkipDebuggerNotify
2264);
2265
2266VOID
2267NTAPI
2270 IN PMMADDRESS_NODE NewNode,
2273);
2274
2275VOID
2276NTAPI
2280);
2281
2283NTAPI
2286);
2287
2289NTAPI
2292);
2293
2294BOOLEAN
2295NTAPI
2297 IN PMMSESSION InputSession OPTIONAL
2298);
2299
2300VOID
2301NTAPI
2303 VOID
2304);
2305
2306VOID
2307NTAPI
2309 IN PMM_SESSION_SPACE SessionGlobal
2310);
2311
2312VOID
2313NTAPI
2315 IN PEPROCESS NewProcess
2316);
2317
2318ULONG
2319NTAPI
2322);
2323
2324VOID
2325NTAPI
2327 IN ULONG_PTR Va,
2328 IN ULONG_PTR EndingAddress,
2329 IN PMMVAD Vad
2330);
2331
2332VOID
2333NTAPI
2335 IN PMMPTE PointerPte,
2337 IN PEPROCESS CurrentProcess,
2339);
2340
2341ULONG
2342NTAPI
2344 IN PVOID PageTableVirtualAddress,
2345 IN PEPROCESS CurrentProcess
2346);
2347
2348ULONG
2349NTAPI
2353);
2354
2355VOID
2356NTAPI
2358 IN PEPROCESS CurrentProcess,
2359 IN PMMVAD Vad
2360);
2361
2363NTAPI
2365 IN PMMVAD Vad,
2366 IN ULONG_PTR Vpn
2367);
2368
2369VOID
2370NTAPI
2372 PVOID ObjectBody
2373);
2374
2376NTAPI
2380 OUT PVOID MemoryInformation,
2381 IN SIZE_T MemoryInformationLength,
2383);
2384
2386NTAPI
2389);
2390
2391VOID
2392NTAPI
2394 IN PMMPDE PointerPde,
2395 IN PEPROCESS TargetProcess,
2397);
2398
2399VOID
2400NTAPI
2402 _In_ PVOID ImageBase);
2403
2404//
2405// MiRemoveZeroPage will use inline code to zero out the page manually if only
2406// free pages are available. In some scenarios, we don't/can't run that piece of
2407// code and would rather only have a real zero page. If we can't have a zero page,
2408// then we'd like to have our own code to grab a free page and zero it out, by
2409// using MiRemoveAnyPage. This macro implements this.
2410//
2414{
2416 return 0;
2417}
2418
2419#if (_MI_PAGING_LEVELS == 2)
2421BOOLEAN
2422MiSynchronizeSystemPde(PMMPDE PointerPde)
2423{
2424 ULONG Index;
2425
2426 /* Get the Index from the PDE */
2427 Index = ((ULONG_PTR)PointerPde & (SYSTEM_PD_SIZE - 1)) / sizeof(MMPTE);
2428 if (PointerPde->u.Hard.Valid != 0)
2429 {
2430 NT_ASSERT(PointerPde->u.Long == MmSystemPagePtes[Index].u.Long);
2431 return TRUE;
2432 }
2433
2434 if (MmSystemPagePtes[Index].u.Hard.Valid == 0)
2435 {
2436 return FALSE;
2437 }
2438
2439 /* Copy the PDE from the double-mapped system page directory */
2441
2442 /* Make sure we re-read the PDE and PTE */
2444
2445 /* Return success */
2446 return TRUE;
2447}
2448#endif
2449
2450#if _MI_PAGING_LEVELS == 2
2452USHORT
2454{
2455 PUSHORT RefCount;
2456
2458
2459 *RefCount += 1;
2460 ASSERT(*RefCount <= PTE_PER_PAGE);
2461 return *RefCount;
2462}
2463
2465USHORT
2467{
2468 PUSHORT RefCount;
2469
2471
2472 *RefCount -= 1;
2473 ASSERT(*RefCount < PTE_PER_PAGE);
2474 return *RefCount;
2475}
2476#else
2478USHORT
2480{
2481 PMMPDE PointerPde = MiAddressToPde(Address);
2482 PMMPFN Pfn;
2483
2484 /* We should not tinker with this one. */
2485 ASSERT(PointerPde != (PMMPDE)PXE_SELFMAP);
2486 DPRINT("Incrementing %p from %p\n", Address, _ReturnAddress());
2487
2488 /* Make sure we're locked */
2489 ASSERT(PsGetCurrentThread()->OwnsProcessWorkingSetExclusive);
2490
2491 /* If we're bumping refcount, then it must be valid! */
2492 ASSERT(PointerPde->u.Hard.Valid == 1);
2493
2494 /* This lies on the PFN */
2495 Pfn = MiGetPfnEntry(PFN_FROM_PDE(PointerPde));
2497
2499
2501}
2502
2504USHORT
2506{
2507 PMMPDE PointerPde = MiAddressToPde(Address);
2508 PMMPFN Pfn;
2509
2510 /* We should not tinker with this one. */
2511 ASSERT(PointerPde != (PMMPDE)PXE_SELFMAP);
2512
2513 DPRINT("Decrementing %p from %p\n", PointerPde, _ReturnAddress());
2514
2515 /* Make sure we're locked */
2516 ASSERT(PsGetCurrentThread()->OwnsProcessWorkingSetExclusive);
2517
2518 /* If we're decreasing refcount, then it must be valid! */
2519 ASSERT(PointerPde->u.Hard.Valid == 1);
2520
2521 /* This lies on the PFN */
2522 Pfn = MiGetPfnEntry(PFN_FROM_PDE(PointerPde));
2523
2526
2528
2530}
2531#endif
2532
2533#ifdef __cplusplus
2534} // extern "C"
2535#endif
2536
2538VOID
2540 _In_ PMMPDE PointerPde,
2541 _In_ PEPROCESS CurrentProcess)
2542{
2543 /* Only for user-mode ones */
2544 ASSERT(MiIsUserPde(PointerPde));
2545
2546 /* Kill this one as a PTE */
2547 MiDeletePte((PMMPTE)PointerPde, MiPdeToPte(PointerPde), CurrentProcess, NULL);
2548#if _MI_PAGING_LEVELS >= 3
2549 /* Cascade down */
2550 if (MiDecrementPageTableReferences(MiPdeToPte(PointerPde)) == 0)
2551 {
2552 MiDeletePte(MiPdeToPpe(PointerPde), PointerPde, CurrentProcess, NULL);
2553#if _MI_PAGING_LEVELS == 4
2554 if (MiDecrementPageTableReferences(PointerPde) == 0)
2555 {
2556 MiDeletePte(MiPdeToPxe(PointerPde), MiPdeToPpe(PointerPde), CurrentProcess, NULL);
2557 }
2558#endif
2559 }
2560#endif
2561}
2562
2563/* EOF */
#define CODE_SEG(...)
unsigned char BOOLEAN
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
Definition: acpixf.h:732
HARDWARE_PTE_ARMV6 TempPte
Definition: winldr.c:76
#define PDE_BASE
Definition: winldr.c:21
HARDWARE_PDE_ARMV6 TempPde
Definition: winldr.c:78
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define ULONG_PTR
Definition: config.h:101
IN CINT OUT PVOID IN ULONG OUT PULONG ReturnLength
Definition: dumpinfo.c:43
UCHAR KIRQL
Definition: env_spec_w32.h:591
ULONG KSPIN_LOCK
Definition: env_spec_w32.h:72
#define PsGetCurrentThread()
Definition: env_spec_w32.h:81
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
#define APC_LEVEL
Definition: env_spec_w32.h:695
#define PAGE_SIZE
Definition: env_spec_w32.h:49
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
#define KeGetCurrentIrql()
Definition: env_spec_w32.h:706
#define NonPagedPool
Definition: env_spec_w32.h:307
#define PagedPool
Definition: env_spec_w32.h:308
FORCEINLINE VOID ExAcquirePushLockExclusive(PEX_PUSH_LOCK PushLock)
Definition: ex.h:1039
FORCEINLINE VOID ExAcquirePushLockShared(PEX_PUSH_LOCK PushLock)
Definition: ex.h:1108
FORCEINLINE VOID ExReleasePushLockShared(PEX_PUSH_LOCK PushLock)
Definition: ex.h:1216
FORCEINLINE BOOLEAN ExConvertPushLockSharedToExclusive(IN PEX_PUSH_LOCK PushLock)
Definition: ex.h:1142
FORCEINLINE VOID ExReleasePushLockExclusive(PEX_PUSH_LOCK PushLock)
Definition: ex.h:1255
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
Definition: fltkernel.h:2653
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:223
ASMGENDATA Table[]
Definition: genincdata.c:61
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
#define KeGetCurrentThread
Definition: hal.h:55
_In_ ULONG Mode
Definition: hubbusif.h:303
#define InterlockedCompareExchange16
Definition: interlocked.h:109
#define InterlockedDecrementSizeT(a)
Definition: interlocked.h:153
#define InterlockedIncrement16
Definition: interlocked.h:206
#define InterlockedIncrementSizeT(a)
Definition: interlocked.h:220
#define _ReturnAddress()
Definition: intrin_arm.h:35
#define C_ASSERT(e)
Definition: intsafe.h:73
#define KeLeaveGuardedRegion()
Definition: ke_x.h:68
#define KeEnterGuardedRegion()
Definition: ke_x.h:39
PMMVAD NTAPI MiLocateAddress(IN PVOID VirtualAddress)
Definition: vadnode.c:116
MMPTE ValidKernelPte
Definition: init.c:29
_MMSYSTEM_PTE_POOL_TYPE
Definition: miarm.h:416
@ SystemPteSpace
Definition: miarm.h:417
@ MaximumPtePoolTypes
Definition: miarm.h:419
@ NonPagedPoolExpansion
Definition: miarm.h:418
FORCEINLINE VOID MI_MAKE_SUBSECTION_PTE(IN PMMPTE NewPte, IN PVOID Segment)
Definition: miarm.h:897
VOID NTAPI MiInitializeSystemPtes(IN PMMPTE StartingPte, IN ULONG NumberOfPtes, IN MMSYSTEM_PTE_POOL_TYPE PoolType)
Definition: syspte.c:388
SIZE_T MmMinimumNonPagedPoolSize
Definition: mminit.c:39
BOOLEAN MmTrackLockedPages
Definition: mdlsup.c:21
PMMPTE MiHighestUserPte
Definition: mminit.c:233
PETHREAD MiExpansionLockOwner
Definition: session.c:33
PMMWSL MmWorkingSetList
Definition: wslist.cpp:19
#define MI_IS_ROS_PFN(x)
Definition: miarm.h:1116
ULONG MmMaximumNonPagedPoolPercent
Definition: init.c:20
FORCEINLINE KIRQL MiAcquireExpansionLock(VOID)
Definition: miarm.h:1544
PMMPTE MmSharedUserDataPte
Definition: mminit.c:26
PFN_COUNT MiExpansionPoolPagesInitialCharge
Definition: pool.c:21
VOID NTAPI MiDeleteVirtualAddresses(IN ULONG_PTR Va, IN ULONG_PTR EndingAddress, IN PMMVAD Vad)
Definition: virtual.c:530
KGUARDED_MUTEX MmSectionBasedMutex
Definition: section.c:110
NTSTATUS NTAPI MiQueryMemorySectionName(IN HANDLE ProcessHandle, IN PVOID BaseAddress, OUT PVOID MemoryInformation, IN SIZE_T MemoryInformationLength, OUT PSIZE_T ReturnLength)
Definition: section.c:1752
PFN_NUMBER MiNumberOfFreePages
Definition: mminit.c:384
PVOID MmNonPagedSystemStart
Definition: miarm.h:590
VOID NTAPI MiInsertNode(IN PMM_AVL_TABLE Table, IN PMMADDRESS_NODE NewNode, PMMADDRESS_NODE Parent, TABLE_SEARCH_RESULT Result)
FORCEINLINE PMMPTE MI_GET_PROTOTYPE_PTE_FOR_VPN(IN PMMVAD Vad, IN ULONG_PTR Vpn)
Definition: miarm.h:1570
PMMPTE MiSessionBasePte
Definition: mminit.c:145
FORCEINLINE BOOLEAN MM_ANY_WS_LOCK_HELD_EXCLUSIVE(_In_ PETHREAD Thread)
Definition: miarm.h:1078
FORCEINLINE BOOLEAN MI_IS_PHYSICAL_ADDRESS(IN PVOID Address)
Definition: miarm.h:959
struct _POOL_TRACKER_TABLE POOL_TRACKER_TABLE
PMDL NTAPI MiAllocatePagesForMdl(IN PHYSICAL_ADDRESS LowAddress, IN PHYSICAL_ADDRESS HighAddress, IN PHYSICAL_ADDRESS SkipBytes, IN SIZE_T TotalBytes, IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute, IN ULONG Flags)
Definition: freelist.c:182
FORCEINLINE VOID MiLockProcessWorkingSetShared(IN PEPROCESS Process, IN PETHREAD Thread)
Definition: miarm.h:1159
PMMPTE MmSystemPtesStart[MaximumPtePoolTypes]
Definition: syspte.c:22
FORCEINLINE BOOLEAN MiIsMemoryTypeInvisible(TYPE_OF_MEMORY MemoryType)
Definition: miarm.h:692
FORCEINLINE VOID MiDeletePde(_In_ PMMPDE PointerPde, _In_ PEPROCESS CurrentProcess)
Definition: miarm.h:2539
PMMPTE MmLastReservedMappingPte
Definition: miarm.h:575
PVOID MmPagedPoolStart
Definition: miarm.h:588
PMEMORY_ALLOCATION_DESCRIPTOR MxFreeDescriptor
Definition: init.c:46
PFN_NUMBER NTAPI MiRemoveZeroPage(IN ULONG Color)
Definition: pfnlist.c:537
FORCEINLINE VOID MiLockWorkingSet(IN PETHREAD Thread, IN PMMSUPPORT WorkingSet)
Definition: miarm.h:1278
FORCEINLINE VOID MI_MAKE_HARDWARE_PTE_USER(IN PMMPTE NewPte, IN PMMPTE MappingPte, IN ULONG_PTR ProtectionMask, IN PFN_NUMBER PageFrameNumber)
Definition: miarm.h:841
ULONG MmProcessColorSeed
Definition: procsup.c:20
struct _MMSESSION MMSESSION
struct _MM_SESSION_SPACE * PMM_SESSION_SPACE
PFN_NUMBER MmLowMemoryThreshold
Definition: mminit.c:300
ULONG MmVerifyDriverBufferType
Definition: drvmgmt.c:25
VOID NTAPI MiInitializePfnDatabase(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: mminit.c:1065
SIZE_T MmMinimumStackCommitInBytes
Definition: mminit.c:370
VOID NTAPI ExInitializePoolDescriptor(IN PPOOL_DESCRIPTOR PoolDescriptor, IN POOL_TYPE PoolType, IN ULONG PoolIndex, IN ULONG Threshold, IN PVOID PoolLock)
Definition: expool.c:969
ULONG NTAPI MiGetPageProtection(IN PMMPTE PointerPte)
Definition: virtual.c:1355
VOID NTAPI MiInsertBasedSection(IN PSECTION Section)
Definition: vadnode.c:423
VOID NTAPI MiRemoveNode(IN PMMADDRESS_NODE Node, IN PMM_AVL_TABLE Table)
Definition: vadnode.c:440
PMMPTE MmSystemPtesEnd[MaximumPtePoolTypes]
Definition: syspte.c:23
VOID NTAPI MiInitializePoolEvents(VOID)
Definition: pool.c:203
FORCEINLINE VOID MiUnlockProcessWorkingSetForFault(IN PEPROCESS Process, IN PETHREAD Thread, OUT PBOOLEAN Safe, OUT PBOOLEAN Shared)
Definition: miarm.h:1481
SLIST_HEADER MmDeadStackSListHead
Definition: procsup.c:22
MM_SYSTEMSIZE MmSystemSize
Definition: mminit.c:326
BOOLEAN MmDynamicPfn
Definition: pfnlist.c:34
struct _MI_LARGE_PAGE_RANGES MI_LARGE_PAGE_RANGES
ULONG MmSecondaryColorMask
Definition: mminit.c:257
FORCEINLINE BOOLEAN MI_IS_WS_UNSAFE(IN PEPROCESS Process)
Definition: miarm.h:1127
ULONG_PTR MmSubsectionBase
Definition: section.c:196
VOID NTAPI InitializePool(IN POOL_TYPE PoolType, IN ULONG Threshold)
Definition: expool.c:1020
SIZE_T MmBootImageSize
Definition: init.c:49
VOID NTAPI MiDeletePte(IN PMMPTE PointerPte, IN PVOID VirtualAddress, IN PEPROCESS CurrentProcess, IN PMMPTE PrototypePte)
Definition: virtual.c:369
VOID NTAPI MiReleaseProcessReferenceToSessionDataPage(IN PMM_SESSION_SPACE SessionGlobal)
Definition: session.c:209
PMMPDE MmSystemPagePtes
Definition: init.c:41
FORCEINLINE BOOLEAN MiIsRosSectionObject(IN PSECTION Section)
Definition: miarm.h:1111
#define MM_GUARDPAGE
Definition: miarm.h:57
FORCEINLINE VOID MiLockProcessWorkingSetForFault(IN PEPROCESS Process, IN PETHREAD Thread, IN BOOLEAN Safe, IN BOOLEAN Shared)
Definition: miarm.h:1514
struct _PHYSICAL_MEMORY_RUN * PPHYSICAL_MEMORY_RUN
PVOID MmNonPagedPoolEnd
Definition: mminit.c:99
PMMPDE MiHighestUserPde
Definition: mminit.c:234
VOID NTAPI MiUnlinkFreeOrZeroedPage(IN PMMPFN Entry)
Definition: pfnlist.c:137
MI_PFN_CACHE_ATTRIBUTE MiPlatformCacheAttributes[2][MmMaximumCacheType]
Definition: iosup.c:27
struct _MMCOLOR_TABLES MMCOLOR_TABLES
VOID NTAPI MiZeroPhysicalPage(IN PFN_NUMBER PageFrameIndex)
Definition: pfnlist.c:122
ULONG NTAPI MiMakeSystemAddressValidPfn(IN PVOID VirtualAddress, IN KIRQL OldIrql)
Definition: virtual.c:235
struct _MI_LARGE_PAGE_DRIVER_ENTRY MI_LARGE_PAGE_DRIVER_ENTRY
ULONG_PTR MxPfnAllocation
Definition: init.c:43
SIZE_T MmSessionViewSize
Definition: init.c:35
BOOLEAN NTAPI MiInitializeMemoryEvents(VOID)
Definition: mminit.c:1330
FORCEINLINE BOOLEAN MI_IS_PROCESS_WORKING_SET(PMMSUPPORT WorkingSet)
Definition: miarm.h:675
#define POOL_LISTS_PER_PAGE
Definition: miarm.h:285
PFN_NUMBER MmMinimumFreePages
Definition: mminit.c:314
SIZE_T MmSizeOfNonPagedPoolInBytes
Definition: init.c:21
VOID NTAPI MiSessionAddProcess(IN PEPROCESS NewProcess)
Definition: session.c:423
PFN_NUMBER MiLowPagedPoolThreshold
Definition: mminit.c:302
MMPTE ValidKernelPteLocal
Definition: init.c:33
FORCEINLINE VOID MI_MAKE_PROTOTYPE_PTE(IN PMMPTE NewPte, IN PMMPTE PointerPte)
Definition: miarm.h:868
PMM_SESSION_SPACE MmSessionSpace
Definition: session.c:21
VOID NTAPI MiInitializeColorTables(VOID)
Definition: mminit.c:553
FORCEINLINE VOID MiReferenceUsedPageAndBumpLockCount(IN PMMPFN Pfn1)
Definition: miarm.h:1755
struct _MI_LARGE_PAGE_RANGES * PMI_LARGE_PAGE_RANGES
PFN_NUMBER NTAPI MxGetNextPage(IN PFN_NUMBER PageCount)
Definition: mminit.c:474
NTSTATUS NTAPI MiFindEmptyAddressRangeDownBasedTree(IN SIZE_T Length, IN ULONG_PTR BoundaryAddress, IN ULONG_PTR Alignment, IN PMM_AVL_TABLE Table, OUT PULONG_PTR Base)
Definition: vadnode.c:799
#define MI_IS_SESSION_ADDRESS(Address)
Definition: miarm.h:185
SIZE_T MmSessionImageSize
Definition: init.c:37
struct _PHYSICAL_MEMORY_DESCRIPTOR * PPHYSICAL_MEMORY_DESCRIPTOR
BOOLEAN MmProtectFreedNonPagedPool
Definition: pool.c:31
BOOLEAN MmEnforceWriteProtection
Definition: sysldr.c:34
ULONG MmVerifyDriverLevel
Definition: drvmgmt.c:26
ULONG MmSecondaryColors
Definition: mminit.c:256
PMMPTE MiFirstReservedZeroingPte
Definition: hypermap.c:21
PVOID MiSessionViewStart
Definition: init.c:30
PMMPTE MiSessionImagePteEnd
Definition: mminit.c:144
VOID NTAPI MiInsertPageInFreeList(IN PFN_NUMBER PageFrameIndex)
Definition: pfnlist.c:611
PFN_NUMBER NTAPI MiRemoveAnyPage(IN ULONG Color)
Definition: pfnlist.c:477
KGUARDED_MUTEX MmPagedPoolMutex
Definition: pool.c:24
LIST_ENTRY MmProcessList
Definition: largepag.c:20
MMPDE DemandZeroPde
Definition: init.c:36
#define POOL_BLOCK_SIZE
Definition: miarm.h:283
VOID NTAPI MiReleaseSystemPtes(IN PMMPTE StartingPte, IN ULONG NumberOfPtes, IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType)
Definition: syspte.c:264
enum _MI_PFN_CACHE_ATTRIBUTE MI_PFN_CACHE_ATTRIBUTE
BOOLEAN NTAPI MmArmInitSystem(IN ULONG Phase, IN PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: mminit.c:2037
MMPTE HyperTemplatePte
Definition: hypermap.c:22
VOID NTAPI MiRemoveMappedView(IN PEPROCESS CurrentProcess, IN PMMVAD Vad)
Definition: section.c:766
#define MM_EXECUTE_READWRITE
Definition: miarm.h:49
PFN_NUMBER MmResidentAvailableAtInit
Definition: freelist.c:28
struct _POOL_TRACKER_TABLE * PPOOL_TRACKER_TABLE
struct _POOL_DESCRIPTOR POOL_DESCRIPTOR
PFN_NUMBER MmMaximumNonPagedPoolInPages
Definition: mminit.c:30
ULONG ExpNumberOfPagedPools
Definition: expool.c:41
VOID NTAPI MiInitializeSessionIds(VOID)
Definition: session.c:116
FORCEINLINE BOOLEAN MiIsUserPte(PVOID Address)
Definition: miarm.h:739
MMPDE ValidKernelPdeLocal
Definition: init.c:32
PMMADDRESS_NODE NTAPI MiGetPreviousNode(IN PMMADDRESS_NODE Node)
Definition: vadnode.c:513
FORCEINLINE VOID MiUnlockProcessWorkingSetShared(IN PEPROCESS Process, IN PETHREAD Thread)
Definition: miarm.h:1228
VOID NTAPI MiInitializePfnAndMakePteValid(IN PFN_NUMBER PageFrameIndex, IN PMMPTE PointerPte, IN MMPTE TempPte)
Definition: pfnlist.c:1041
PVOID MiSessionImageStart
Definition: init.c:29
MMPTE MmDecommittedPte
Definition: init.c:44
struct _POOL_TRACKER_BIG_PAGES * PPOOL_TRACKER_BIG_PAGES
VOID NTAPI MiWriteProtectSystemImage(_In_ PVOID ImageBase)
Definition: sysldr.c:2481
FORCEINLINE VOID MI_MAKE_HARDWARE_PTE_KERNEL(IN PMMPTE NewPte, IN PMMPTE MappingPte, IN ULONG_PTR ProtectionMask, IN PFN_NUMBER PageFrameNumber)
Definition: miarm.h:787
PVOID NTAPI MiCheckForContiguousMemory(IN PVOID BaseAddress, IN PFN_NUMBER BaseAddressPages, IN PFN_NUMBER SizeInPages, IN PFN_NUMBER LowestPfn, IN PFN_NUMBER HighestPfn, IN PFN_NUMBER BoundaryPfn, IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute)
Definition: contmem.c:214
PFN_NUMBER MmPlentyFreePages
Definition: mminit.c:322
ULONG MmVerifyDriverBufferLength
Definition: drvmgmt.c:24
PMMWSL MmSystemCacheWorkingSetList
Definition: mminit.c:174
BOOLEAN MmMakeLowMemory
Definition: sysldr.c:33
MM_PAGED_POOL_INFO MmPagedPoolInfo
Definition: pool.c:25
WCHAR MmVerifyDriverBuffer[512]
Definition: drvmgmt.c:23
VOID NTAPI MiDeleteARM3Section(PVOID ObjectBody)
Definition: section.c:2949
KSPIN_LOCK MmExpansionLock
Definition: session.c:32
NTSTATUS NTAPI MiInitializeAndChargePfn(OUT PPFN_NUMBER PageFrameIndex, IN PMMPDE PointerPde, IN PFN_NUMBER ContainingPageFrame, IN BOOLEAN SessionAllocation)
Definition: pfnlist.c:1101
SIZE_T MmSessionSize
Definition: init.c:34
FORCEINLINE VOID MiReleaseExpansionLock(KIRQL OldIrql)
Definition: miarm.h:1557
PFN_NUMBER MiHighPagedPoolThreshold
Definition: mminit.c:303
PMMPTE MiSessionLastPte
Definition: mminit.c:146
FORCEINLINE VOID MI_ERASE_PTE(IN PMMPTE PointerPte)
Definition: miarm.h:1019
#define MI_IS_SESSION_PTE(Pte)
Definition: miarm.h:188
#define MI_IS_PAGE_TABLE_ADDRESS(Address)
Definition: miarm.h:191
VOID NTAPI MiInitializeNonPagedPoolThresholds(VOID)
Definition: pool.c:186
VOID NTAPI MiInitializeSessionSpaceLayout(VOID)
Definition: init.c:63
SIZE_T MmSessionPoolSize
Definition: init.c:36
VOID NTAPI MiInitializePfnForOtherProcess(IN PFN_NUMBER PageFrameIndex, IN PVOID PteAddress, IN PFN_NUMBER PteFrame)
Definition: pfnlist.c:1301
PMMPTE MiSessionImagePteStart
Definition: mminit.c:143
FORCEINLINE USHORT MiDecrementPageTableReferences(IN PVOID Address)
Definition: miarm.h:2505
PVOID MiSessionPoolStart
Definition: init.c:32
ULONG MmNumberOfSystemPtes
Definition: init.c:42
struct _POOL_DESCRIPTOR * PPOOL_DESCRIPTOR
NTSTATUS NTAPI MmArmAccessFault(IN ULONG FaultCode, IN PVOID Address, IN KPROCESSOR_MODE Mode, IN PVOID TrapInformation)
Definition: pagfault.c:1698
BOOLEAN MmLargeSystemCache
Definition: mminit.c:340
FORCEINLINE VOID MI_WRITE_VALID_PDE(IN PMMPDE PointerPde, IN MMPDE TempPde)
Definition: miarm.h:1031
VOID NTAPI MiDecrementShareCount(IN PMMPFN Pfn1, IN PFN_NUMBER PageFrameIndex)
Definition: pfnlist.c:1141
FORCEINLINE VOID MiUnlockProcessWorkingSet(IN PEPROCESS Process, IN PETHREAD Thread)
Definition: miarm.h:1207
struct _MMVIEW * PMMVIEW
PKEVENT MiLowNonPagedPoolEvent
Definition: mminit.c:296
FORCEINLINE VOID MiUnlockProcessWorkingSetUnsafe(IN PEPROCESS Process, IN PETHREAD Thread)
Definition: miarm.h:1252
struct _MMCOLOR_TABLES * PMMCOLOR_TABLES
const ULONG MmProtectToValue[32]
Definition: page.c:71
VOID NTAPI MiInitializeDriverLargePageList(VOID)
Definition: largepag.c:68
#define _1MB
Definition: miarm.h:19
ULONG MmTotalFreeSystemPtes[MaximumPtePoolTypes]
Definition: syspte.c:25
PKEVENT MiHighMemoryEvent
Definition: mminit.c:293
PKEVENT MiLowMemoryEvent
Definition: mminit.c:292
struct _MI_LARGE_PAGE_DRIVER_ENTRY * PMI_LARGE_PAGE_DRIVER_ENTRY
ULONG MmProductType
Definition: mminit.c:325
VOID FASTCALL MiSyncARM3WithROS(IN PVOID AddressStart, IN PVOID AddressEnd)
FORCEINLINE VOID MiReferenceUnusedPageAndBumpLockCount(IN PMMPFN Pfn1)
Definition: miarm.h:1800
_MI_PFN_CACHE_ATTRIBUTE
Definition: miarm.h:423
@ MiWriteCombined
Definition: miarm.h:426
@ MiCached
Definition: miarm.h:425
@ MiNotMapped
Definition: miarm.h:427
@ MiNonCached
Definition: miarm.h:424
FORCEINLINE VOID MI_WRITE_INVALID_PTE(IN PMMPTE PointerPte, IN MMPTE InvalidPte)
Definition: miarm.h:1006
BOOLEAN MmZeroPageFile
Definition: pagefile.c:71
enum _MI_PFN_CACHE_ATTRIBUTE * PMI_PFN_CACHE_ATTRIBUTE
PPHYSICAL_MEMORY_DESCRIPTOR NTAPI MmInitializeMemoryLimits(IN PLOADER_PARAMETER_BLOCK LoaderBlock, IN PBOOLEAN IncludeType)
Definition: mminit.c:1613
FORCEINLINE VOID MiUnlockWorkingSet(IN PETHREAD Thread, IN PMMSUPPORT WorkingSet)
Definition: miarm.h:1364
VOID NTAPI MiMakePdeExistAndMakeValid(IN PMMPDE PointerPde, IN PEPROCESS TargetProcess, IN KIRQL OldIrql)
Definition: virtual.c:2481
ULONG NTAPI MiMakeSystemAddressValid(IN PVOID PageTableVirtualAddress, IN PEPROCESS CurrentProcess)
Definition: virtual.c:183
VOID NTAPI MiSessionRemoveProcess(VOID)
Definition: session.c:392
FORCEINLINE VOID MiDereferencePfnAndDropLockCount(IN PMMPFN Pfn1)
Definition: miarm.h:1628
MMPFNLIST MmStandbyPageListByPriority[8]
Definition: pfnlist.c:44
PFN_NUMBER MmTotalSystemDriverPages
Definition: sysldr.c:28
struct _PHYSICAL_MEMORY_RUN PHYSICAL_MEMORY_RUN
ULONG MmLargePageDriverBufferLength
Definition: largepag.c:25
NTSTATUS NTAPI MiRosUnmapViewInSystemSpace(IN PVOID MappedBase)
Definition: section.c:4562
SIZE_T MmMaximumNonPagedPoolInBytes
Definition: init.c:22
ULONG MmMaxAdditionNonPagedPoolPerMb
Definition: mminit.c:42
PVOID MmNonPagedPoolExpansionStart
Definition: init.c:25
PMMPTE NTAPI MiReserveSystemPtes(IN ULONG NumberOfPtes, IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType)
Definition: syspte.c:246
VOID NTAPI MiUnlinkPageFromList(IN PMMPFN Pfn)
Definition: pfnlist.c:265
PVOID MmHighSectionBase
Definition: section.c:111
PVOID MmSessionBase
Definition: miarm.h:593
FORCEINLINE VOID MiReferenceProbedPageAndBumpLockCount(IN PMMPFN Pfn1)
Definition: miarm.h:1700
MMPTE PrototypePte
Definition: init.c:40
PSUBSECTION NTAPI MiLocateSubsection(IN PMMVAD Vad, IN ULONG_PTR Vpn)
Definition: section.c:556
BOOLEAN MiLargePageAllDrivers
Definition: largepag.c:27
PFN_NUMBER NTAPI MiPagesInLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock, IN PBOOLEAN IncludeType)
MMPTE DemandZeroPte
Definition: init.c:37
FORCEINLINE BOOLEAN MI_IS_MAPPED_PTE(PMMPTE PointerPte)
Definition: miarm.h:933
POOL_DESCRIPTOR NonPagedPoolDescriptor
Definition: expool.c:42
FORCEINLINE BOOLEAN MM_ANY_WS_LOCK_HELD(IN PETHREAD Thread)
Definition: miarm.h:1065
#define SYSTEM_PD_SIZE
Definition: miarm.h:32
BOOLEAN NTAPI MiIsPfnInUse(IN PMMPFN Pfn1)
Definition: freelist.c:174
PPOOL_TRACKER_TABLE PoolTrackTable
Definition: expool.c:49
NTSTATUS NTAPI MiRosUnmapViewOfSection(IN PEPROCESS Process, IN PVOID BaseAddress, IN BOOLEAN SkipDebuggerNotify)
Definition: section.c:3594
SIZE_T MmAllocatedNonPagedPool
Definition: pool.c:26
PPOOL_DESCRIPTOR ExpPagedPoolDescriptor[16+1]
Definition: expool.c:43
NTSTATUS NTAPI MiInsertVadEx(_Inout_ PMMVAD Vad, _In_ ULONG_PTR *BaseAddress, _In_ SIZE_T ViewSize, _In_ ULONG_PTR HighestAddress, _In_ ULONG_PTR Alignment, _In_ ULONG AllocationType)
Definition: vadnode.c:282
PVOID MiSystemViewStart
Definition: miarm.h:656
ULONG MmMinAdditionNonPagedPoolPerMb
Definition: mminit.c:40
LIST_ENTRY MiLargePageDriverList
Definition: largepag.c:26
ULONG MmSpecialPoolTag
Definition: pool.c:29
PVOID MmHyperSpaceEnd
Definition: init.c:56
struct _PHYSICAL_MEMORY_DESCRIPTOR PHYSICAL_MEMORY_DESCRIPTOR
TABLE_SEARCH_RESULT NTAPI MiFindEmptyAddressRangeDownTree(IN SIZE_T Length, IN ULONG_PTR BoundaryAddress, IN ULONG_PTR Alignment, IN PMM_AVL_TABLE Table, OUT PULONG_PTR Base, OUT PMMADDRESS_NODE *Parent)
Definition: vadnode.c:681
VOID NTAPI MiMapPfnDatabase(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: mminit.c:663
FORCEINLINE BOOLEAN MiIsMemoryTypeFree(TYPE_OF_MEMORY MemoryType)
Definition: miarm.h:682
struct _MMVIEW MMVIEW
KGUARDED_MUTEX MmSectionCommitMutex
Definition: section.c:108
BOOLEAN NTAPI MiInitializeSystemSpaceMap(IN PMMSESSION InputSession OPTIONAL)
Definition: section.c:222
PFN_NUMBER MiLowNonPagedPoolThreshold
Definition: mminit.c:304
FORCEINLINE VOID MiLockWorkingSetShared(_In_ PETHREAD Thread, _In_ PMMSUPPORT WorkingSet)
Definition: miarm.h:1319
MMSUPPORT MmSystemCacheWs
Definition: init.c:55
FORCEINLINE VOID MI_WRITE_INVALID_PDE(IN PMMPDE PointerPde, IN MMPDE InvalidPde)
Definition: miarm.h:1048
PFN_NUMBER MiHighNonPagedPoolThreshold
Definition: mminit.c:305
MEMORY_ALLOCATION_DESCRIPTOR MxOldFreeDescriptor
Definition: init.c:47
BOOLEAN MmMirroring
Definition: pfnlist.c:35
struct _MM_SESSION_SPACE_FLAGS MM_SESSION_SPACE_FLAGS
ULONG MmLargeStackSize
Definition: mminit.c:262
VOID NTAPI MiComputeColorInformation(VOID)
Definition: mminit.c:499
FORCEINLINE VOID MI_MAKE_HARDWARE_PTE(IN PMMPTE NewPte, IN PMMPTE MappingPte, IN ULONG_PTR ProtectionMask, IN PFN_NUMBER PageFrameNumber)
Definition: miarm.h:821
struct _POOL_HEADER POOL_HEADER
VOID NTAPI MiInsertPageInList(IN PMMPFNLIST ListHead, IN PFN_NUMBER PageFrameIndex)
Definition: pfnlist.c:779
NTSTATUS NTAPI MiCheckSecuredVad(IN PMMVAD Vad, IN PVOID Base, IN SIZE_T Size, IN ULONG ProtectionMask)
Definition: vadnode.c:903
PKEVENT MiHighPagedPoolEvent
Definition: mminit.c:295
FORCEINLINE BOOLEAN MI_WS_OWNER(IN PEPROCESS Process)
Definition: miarm.h:1090
FORCEINLINE BOOLEAN MiIsUserPde(PVOID Address)
Definition: miarm.h:731
PVOID MmNonPagedPoolStart
Definition: init.c:24
PVOID MiSessionImageEnd
Definition: init.c:28
FORCEINLINE VOID MI_UPDATE_VALID_PTE(IN PMMPTE PointerPte, IN MMPTE TempPte)
Definition: miarm.h:991
VOID NTAPI MiInitializeLargePageSupport(VOID)
Definition: largepag.c:34
SIZE_T MmSystemLockPagesCount
Definition: mdlsup.c:22
NTSTATUS FASTCALL MiCheckPdeForPagedPool(IN PVOID Address)
Definition: pagfault.c:479
VOID NTAPI MiDecrementReferenceCount(IN PMMPFN Pfn1, IN PFN_NUMBER PageFrameIndex)
Definition: pfnlist.c:1236
WCHAR MmLargePageDriverBuffer[512]
Definition: largepag.c:24
MM_AVL_TABLE MmSectionBasedRoot
Definition: section.c:109
FORCEINLINE BOOLEAN MiConvertSharedWorkingSetLockToExclusive(_In_ PETHREAD Thread, _In_ PMMSUPPORT Vm)
Definition: miarm.h:1441
enum _MMSYSTEM_PTE_POOL_TYPE MMSYSTEM_PTE_POOL_TYPE
TABLE_SEARCH_RESULT NTAPI MiFindEmptyAddressRangeInTree(IN SIZE_T Length, IN ULONG_PTR Alignment, IN PMM_AVL_TABLE Table, OUT PMMADDRESS_NODE *PreviousVad, OUT PULONG_PTR Base)
Definition: vadnode.c:584
FORCEINLINE VOID MI_MAKE_TRANSITION_PTE(_Out_ PMMPTE NewPte, _In_ PFN_NUMBER Page, _In_ ULONG Protection)
Definition: miarm.h:943
FORCEINLINE VOID MI_WRITE_VALID_PTE(IN PMMPTE PointerPte, IN MMPTE TempPte)
Definition: miarm.h:973
FORCEINLINE VOID MiDropLockCount(IN PMMPFN Pfn1)
Definition: miarm.h:1598
PMMPTE MmFirstReservedMappingPte
Definition: hypermap.c:20
FORCEINLINE ULONG_PTR MiDetermineUserGlobalPteMask(IN PVOID PointerPte)
Definition: miarm.h:750
KEVENT MmZeroingPageEvent
Definition: zeropage.c:20
SIZE_T MmDefaultMaximumNonPagedPool
Definition: mminit.c:41
NTSTATUS NTAPI MiInitializeSessionPool(VOID)
Definition: pool.c:1276
VOID NTAPI MiInitializePfn(IN PFN_NUMBER PageFrameIndex, IN PMMPTE PointerPte, IN BOOLEAN Modified)
Definition: pfnlist.c:970
SIZE_T MmAllocationFragment
Definition: mminit.c:352
struct _POOL_TRACKER_BIG_PAGES POOL_TRACKER_BIG_PAGES
PFN_COUNT NTAPI MiDeleteSystemPageableVm(IN PMMPTE PointerPte, IN PFN_NUMBER PageCount, IN ULONG Flags, OUT PPFN_NUMBER ValidPages)
Definition: virtual.c:275
PKEVENT MiLowPagedPoolEvent
Definition: mminit.c:294
TABLE_SEARCH_RESULT NTAPI MiCheckForConflictingNode(IN ULONG_PTR StartVpn, IN ULONG_PTR EndVpn, IN PMM_AVL_TABLE Table, OUT PMMADDRESS_NODE *NodeOrParent)
Definition: vadnode.c:150
PFN_NUMBER MmSizeOfPagedPoolInPages
Definition: mminit.c:111
ULONG NTAPI MiMakeProtectionMask(IN ULONG Protect)
Definition: section.c:140
FORCEINLINE USHORT MiIncrementPageTableReferences(IN PVOID Address)
Definition: miarm.h:2479
LIST_ENTRY MmWorkingSetExpansionHead
Definition: session.c:30
LARGE_INTEGER MmCriticalSectionTimeout
Definition: mminit.c:388
#define MM_PROTECT_ACCESS
Definition: miarm.h:51
PVOID MiSessionSpaceWs
Definition: mminit.c:130
struct _MMSESSION * PMMSESSION
PMMADDRESS_NODE NTAPI MiGetNextNode(IN PMMADDRESS_NODE Node)
Definition: vadnode.c:549
VOID NTAPI MiInsertVad(_Inout_ PMMVAD Vad, _Inout_ PMM_AVL_TABLE VadRoot)
PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock
Definition: init.c:45
PFN_NUMBER NTAPI MiFindContiguousPages(IN PFN_NUMBER LowestPfn, IN PFN_NUMBER HighestPfn, IN PFN_NUMBER BoundaryPfn, IN PFN_NUMBER SizeInPages, IN MEMORY_CACHING_TYPE CacheType)
Definition: contmem.c:22
NTSTATUS NTAPI MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: init.c:697
ULONG MmConsumedPoolPercentage
Definition: pool.c:30
BOOLEAN MmTrackPtes
Definition: mdlsup.c:20
FORCEINLINE PMMPFN MI_PFN_ELEMENT(IN PFN_NUMBER Pfn)
Definition: miarm.h:1587
SIZE_T MmSystemViewSize
Definition: init.c:39
PVOID MiSessionSpaceEnd
Definition: init.c:27
VOID NTAPI MiSyncCachedRanges(VOID)
Definition: largepag.c:54
const ULONG_PTR MmProtectToPteMask[32]
Definition: page.c:22
SIZE_T MmSizeOfPagedPoolInBytes
Definition: miarm.h:599
MMPDE ValidKernelPde
Definition: init.c:28
FORCEINLINE VOID MiLockProcessWorkingSet(IN PEPROCESS Process, IN PETHREAD Thread)
Definition: miarm.h:1137
PMMCOLOR_TABLES MmFreePagesByColor[FreePageList+1]
Definition: mminit.c:286
struct _MM_SESSION_SPACE MM_SESSION_SPACE
PVOID MmSystemCacheStart
Definition: init.c:53
ULONG MmSystemPageColor
Definition: pfnlist.c:36
FORCEINLINE PFN_NUMBER MiRemoveZeroPageSafe(IN ULONG Color)
Definition: miarm.h:2413
PFN_NUMBER MmHighMemoryThreshold
Definition: mminit.c:301
PVOID MiSessionPoolEnd
Definition: init.c:31
NTSTATUS NTAPI MiRosProtectVirtualMemory(IN PEPROCESS Process, IN OUT PVOID *BaseAddress, IN OUT PSIZE_T NumberOfBytesToProtect, IN ULONG NewAccessProtection, OUT PULONG OldAccessProtection OPTIONAL)
Definition: virtual.c:2158
struct _POOL_HEADER * PPOOL_HEADER
ULONG MmMaximumDeadKernelStacks
Definition: procsup.c:21
VOID NTAPI MiInitializeSessionWsSupport(VOID)
Definition: session.c:40
PVOID MmSystemCacheEnd
Definition: init.c:54
PLDR_DATA_TABLE_ENTRY NTAPI MiLookupDataTableEntry(IN PVOID Address)
Definition: sysldr.c:3517
PKEVENT MiHighNonPagedPoolEvent
Definition: mminit.c:297
PFN_NUMBER MmSystemPageDirectory[PPE_PER_PAGE]
Definition: init.c:40
FORCEINLINE VOID MiLockProcessWorkingSetUnsafe(IN PEPROCESS Process, IN PETHREAD Thread)
Definition: miarm.h:1182
PVOID MmPagedPoolEnd
Definition: miarm.h:589
FORCEINLINE VOID MiUnlockWorkingSetShared(_In_ PETHREAD Thread, _In_ PMMSUPPORT WorkingSet)
Definition: miarm.h:1402
ULONG MmCritsectTimeoutSeconds
Definition: mminit.c:387
#define PTE_BASE
Definition: mmx86.c:14
#define MiAddressToPde(x)
Definition: mmx86.c:20
#define ASSERT(a)
Definition: mode.c:44
#define KF_GLOBAL_PAGE
Definition: ketypes.h:35
_In_ HANDLE ProcessHandle
Definition: mmfuncs.h:403
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER _Inout_ PSIZE_T _In_ SECTION_INHERIT _In_ ULONG AllocationType
Definition: mmfuncs.h:410
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER _Inout_ PSIZE_T ViewSize
Definition: mmfuncs.h:408
@ ZeroedPageList
Definition: mmtypes.h:153
@ FreePageList
Definition: mmtypes.h:154
@ ActiveAndValid
Definition: mmtypes.h:159
_In_opt_ ULONG Base
Definition: rtlfuncs.h:2451
#define _Inout_
Definition: no_sal2.h:162
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define FASTCALL
Definition: nt_native.h:50
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
FORCEINLINE PMMPXE MiPdeToPxe(PMMPDE PointerPde)
Definition: mm.h:300
#define MI_MAKE_OWNER_PAGE(x)
Definition: mm.h:113
FORCEINLINE PMMPDE MiPdeToPpe(PMMPDE PointerPde)
Definition: mm.h:292
#define MiGetPdeOffset(x)
Definition: mm.h:195
#define MI_MAKE_ACCESSED_PAGE(x)
Definition: mm.h:100
#define _MI_PAGING_LEVELS
Definition: mm.h:6
#define SESSION_POOL_LOOKASIDES
Definition: mm.h:84
#define PFN_FROM_PDE(v)
Definition: mm.h:93
#define PTE_PER_PAGE
Definition: mm.h:20
#define PPE_PER_PAGE
Definition: mm.h:22
#define MiPteToAddress(_Pte)
Definition: mm.h:116
#define MiPdeToPte(_Pde)
Definition: mm.h:120
#define PDE_TOP
Definition: mm.h:168
ULONG KeFeatureBits
Definition: krnlinit.c:22
FORCEINLINE PMMPFN MiGetPfnEntry(IN PFN_NUMBER Pfn)
Definition: mm.h:1054
FORCEINLINE PFN_NUMBER MiGetPfnEntryIndex(IN PMMPFN Pfn1)
Definition: mm.h:1074
PMMPFN MmPfnDatabase
Definition: freelist.c:24
_In_ PVOID _Out_opt_ BOOLEAN _Out_opt_ PPFN_NUMBER Page
Definition: mm.h:1313
_Out_ PKAPC_STATE ApcState
Definition: mm.h:1772
BOOLEAN NTAPI KeAreAllApcsDisabled(VOID)
Definition: apc.c:985
long LONG
Definition: pedump.c:60
unsigned short USHORT
Definition: pedump.c:61
static WCHAR Address[46]
Definition: ping.c:68
DWORD LCID
Definition: nls.h:13
@ LoaderFree
Definition: arc.h:176
@ LoaderFirmwareTemporary
Definition: arc.h:179
@ LoaderLoadedProgram
Definition: arc.h:178
@ LoaderHALCachedMemory
Definition: arc.h:200
@ LoaderFirmwarePermanent
Definition: arc.h:180
@ LoaderOsloaderStack
Definition: arc.h:182
@ LoaderSpecialMemory
Definition: arc.h:196
@ LoaderBBTMemory
Definition: arc.h:197
enum _TYPE_OF_MEMORY TYPE_OF_MEMORY
#define KeMemoryBarrierWithoutFence()
Definition: ke.h:66
#define PXE_SELFMAP
ULONG * PPFN_NUMBER
Definition: ke.h:9
ULONG PFN_NUMBER
Definition: ke.h:9
#define DPRINT
Definition: sndvol32.h:73
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
base of all file and directory entries
Definition: entries.h:83
ULONG OwnsSessionWorkingSetExclusive
Definition: pstypes.h:1226
ULONG OwnsSessionWorkingSetShared
Definition: pstypes.h:1227
ULONG OwnsSystemWorkingSetShared
Definition: pstypes.h:1225
ULONG OwnsProcessWorkingSetShared
Definition: pstypes.h:1223
ULONG OwnsProcessWorkingSetExclusive
Definition: pstypes.h:1222
ULONG OwnsSystemWorkingSetExclusive
Definition: pstypes.h:1224
ULONG PageFrameNumber
Definition: mmtypes.h:109
Definition: btrfs_drv.h:1876
Definition: typedefs.h:120
Definition: miarm.h:410
LIST_ENTRY Links
Definition: miarm.h:411
UNICODE_STRING BaseName
Definition: miarm.h:412
PFN_NUMBER LastFrame
Definition: miarm.h:453
PFN_NUMBER StartFrame
Definition: miarm.h:452
PFN_NUMBER Count
Definition: miarm.h:447
PVOID Blink
Definition: miarm.h:446
PFN_NUMBER Flink
Definition: miarm.h:445
Definition: mm.h:449
Definition: mm.h:381
MMPTE OriginalPte
Definition: mm.h:414
ULONG64 LargePage
Definition: mmtypes.h:165
ULONG64 Valid
Definition: mmtypes.h:150
ULONG64 UsedPageTableEntries
Definition: mmtypes.h:91
union _MMPTE::@2341 u
MMPTE_SOFTWARE Soft
Definition: mmtypes.h:219
MMPTE_HARDWARE Hard
Definition: mmtypes.h:217
ULONG_PTR Long
Definition: mmtypes.h:215
ULONG SystemSpaceHashKey
Definition: miarm.h:470
ULONG SystemSpaceHashEntries
Definition: miarm.h:469
ULONG BitmapFailures
Definition: miarm.h:471
PKGUARDED_MUTEX SystemSpaceViewLockPointer
Definition: miarm.h:465
PRTL_BITMAP SystemSpaceBitMap
Definition: miarm.h:472
PCHAR SystemSpaceViewStart
Definition: miarm.h:466
ULONG SystemSpaceHashSize
Definition: miarm.h:468
PMMVIEW SystemSpaceViewTable
Definition: miarm.h:467
KGUARDED_MUTEX SystemSpaceViewLock
Definition: miarm.h:464
ULONG SessionSpace
Definition: mmtypes.h:905
EX_PUSH_LOCK WorkingSetMutex
Definition: mmtypes.h:961
MMSUPPORT_FLAGS Flags
Definition: mmtypes.h:933
Definition: miarm.h:457
PCONTROL_AREA ControlArea
Definition: miarm.h:459
ULONG_PTR Entry
Definition: miarm.h:458
USHORT UsedPageTableEntries[768]
Definition: mmtypes.h:886
union _MM_SESSION_SPACE::@1844 u
ULONG SessionId
Definition: miarm.h:491
ULONG LongFlags
Definition: miarm.h:488
PFN_NUMBER SessionPageDirectoryIndex
Definition: miarm.h:494
PMMPDE PageTables
Definition: miarm.h:521
LONG ResidentProcessCount
Definition: miarm.h:501
KGUARDED_MUTEX PagedPoolMutex
Definition: miarm.h:512
LARGE_INTEGER LastProcessSwappedOutTime
Definition: miarm.h:493
PVOID PagedPoolStart
Definition: miarm.h:497
MM_PAGED_POOL_INFO PagedPoolInfo
Definition: miarm.h:513
struct _MM_SESSION_SPACE * GlobalVirtualAddress
Definition: miarm.h:484
MM_SESSION_SPACE_FLAGS Flags
Definition: miarm.h:489
ULONG SessionPoolAllocationFailures[4]
Definition: miarm.h:502
PVOID PagedPoolEnd
Definition: miarm.h:498
MMSESSION Session
Definition: miarm.h:511
LONG ImageLoadingCount
Definition: miarm.h:530
LONG ProcessReferenceToSession
Definition: miarm.h:508
ULONG AttachCount
Definition: miarm.h:505
KEVENT AttachEvent
Definition: miarm.h:506
MMSUPPORT Vm
Definition: miarm.h:514
SIZE_T CommittedPages
Definition: miarm.h:496
LIST_ENTRY WsListEntry
Definition: miarm.h:509
LIST_ENTRY ProcessList
Definition: miarm.h:492
SIZE_T NonPageablePages
Definition: miarm.h:495
POOL_DESCRIPTOR PagedPool
Definition: miarm.h:517
LONG ReferenceCount
Definition: miarm.h:485
PEPROCESS LastProcess
Definition: miarm.h:507
PMMWSLE Wsle
Definition: miarm.h:515
PDRIVER_UNLOAD Win32KDriverUnload
Definition: miarm.h:516
LIST_ENTRY ImageList
Definition: miarm.h:503
PMMPDE PagedPoolBasePde
Definition: miarm.h:499
PFN_NUMBER NumberOfPages
Definition: miarm.h:439
PFN_NUMBER PageCount
Definition: miarm.h:433
PFN_NUMBER BasePage
Definition: miarm.h:432
LIST_ENTRY ListHeads[POOL_LISTS_PER_PAGE]
Definition: miarm.h:337
POOL_TYPE PoolType
Definition: miarm.h:325
ULONG Threshold
Definition: miarm.h:331
ULONG RunningAllocs
Definition: miarm.h:327
ULONG TotalPages
Definition: miarm.h:329
SIZE_T TotalBytes
Definition: miarm.h:335
LONG PendingFreeDepth
Definition: miarm.h:334
ULONG PoolIndex
Definition: miarm.h:326
PVOID PendingFrees
Definition: miarm.h:333
ULONG RunningDeAllocs
Definition: miarm.h:328
SIZE_T Spare0
Definition: miarm.h:336
ULONG TotalBigPages
Definition: miarm.h:330
PVOID LockAddress
Definition: miarm.h:332
USHORT PoolTagHash
USHORT AllocatorBackTraceIndex
USHORT PreviousSize
LONG NonPagedAllocs
Definition: miarm.h:384
SIZE_T NonPagedBytes
Definition: miarm.h:386
LONG NonPagedFrees
Definition: miarm.h:385
SIZE_T PagedBytes
Definition: miarm.h:389
Definition: bidi.c:434
#define LIST_HEAD(name, type)
Definition: queue.h:167
ULONG_PTR * PSIZE_T
Definition: typedefs.h:80
uint32_t * PULONG_PTR
Definition: typedefs.h:65
uint32_t * PULONG
Definition: typedefs.h:59
unsigned char * PBOOLEAN
Definition: typedefs.h:53
INT POOL_TYPE
Definition: typedefs.h:78
int16_t * PSHORT
Definition: typedefs.h:55
#define NTAPI
Definition: typedefs.h:36
void * PVOID
Definition: typedefs.h:50
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint16_t * PUSHORT
Definition: typedefs.h:56
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
char * PCHAR
Definition: typedefs.h:51
Definition: dlist.c:348
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ _Strict_type_match_ POOL_TYPE PoolType
Definition: wdfdevice.h:3815
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4533
_Must_inspect_result_ _In_ WDFDMATRANSACTION _In_ PFN_WDF_PROGRAM_DMA _In_ WDF_DMA_DIRECTION _In_ PMDL _In_ PVOID VirtualAddress
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ _In_ _Strict_type_match_ POOL_TYPE _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_opt_ ULONG _Out_ WDFLOOKASIDE * Lookaside
Definition: wdfmemory.h:414
#define FORCEINLINE
Definition: wdftypes.h:67
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:409
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
_Inout_ PVOID Segment
Definition: exfuncs.h:1101
struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE GENERAL_LOOKASIDE
DRIVER_UNLOAD * PDRIVER_UNLOAD
Definition: iotypes.h:2253
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
Definition: kefuncs.h:778
CCHAR KPROCESSOR_MODE
Definition: ketypes.h:7
_Must_inspect_result_ _Outptr_result_bytebuffer_ ViewSize PVOID * MappedBase
Definition: mmfuncs.h:492
_Must_inspect_result_ _In_ PHYSICAL_ADDRESS HighAddress
Definition: mmfuncs.h:226
_Must_inspect_result_ _In_ PHYSICAL_ADDRESS _In_ PHYSICAL_ADDRESS SkipBytes
Definition: mmfuncs.h:227
_Must_inspect_result_ _In_ PHYSICAL_ADDRESS _In_ PHYSICAL_ADDRESS _In_opt_ PHYSICAL_ADDRESS _In_ MEMORY_CACHING_TYPE CacheType
Definition: mmfuncs.h:217
_Must_inspect_result_ _In_ PHYSICAL_ADDRESS _In_ PHYSICAL_ADDRESS _In_ SIZE_T TotalBytes
Definition: mmfuncs.h:228
enum _MM_SYSTEM_SIZE MM_SYSTEMSIZE
enum _MEMORY_CACHING_TYPE MEMORY_CACHING_TYPE
@ MmMaximumCacheType
Definition: mmtypes.h:135
ULONG PFN_COUNT
Definition: mmtypes.h:102
#define NT_ASSERT
Definition: rtlfuncs.h:3327
TABLE_SEARCH_RESULT
Definition: rtltypes.h:386
__wchar_t WCHAR
Definition: xmlstorage.h:180
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID _In_ ULONG_PTR _In_ SIZE_T _Inout_opt_ PLARGE_INTEGER _Inout_ PSIZE_T _In_ SECTION_INHERIT _In_ ULONG _In_ ULONG Protect
Definition: zwfuncs.h:221