ReactOS 0.4.16-dev-2332-g4cba65d
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#define LIST_HEAD ULONG_PTR_MAX
224
225//
226// Because GCC cannot automatically downcast 0xFFFFFFFF to lesser-width bits,
227// we need a manual definition suited to the number of bits in the PteFrame.
228// This is used as a LIST_HEAD for the colored list
229//
230#define COLORED_LIST_HEAD (((ULONG_PTR)1 << MI_PTE_FRAME_BITS) - 1)
231
232//
233// Returns the color of a page
234//
235#define MI_GET_PAGE_COLOR(x) ((x) & MmSecondaryColorMask)
236#define MI_GET_NEXT_COLOR() (MI_GET_PAGE_COLOR(++MmSystemPageColor))
237#define MI_GET_NEXT_PROCESS_COLOR(x) (MI_GET_PAGE_COLOR(++(x)->NextPageColor))
238
239//
240// Prototype PTEs that don't yet have a pagefile association
241//
242#ifdef _WIN64
243#define MI_PTE_LOOKUP_NEEDED 0xffffffffULL
244#else
245#define MI_PTE_LOOKUP_NEEDED 0xFFFFF
246#endif
247
248//
249// Number of session data and tag pages
250//
251#define MI_SESSION_DATA_PAGES_MAXIMUM (MM_ALLOCATION_GRANULARITY / PAGE_SIZE)
252#define MI_SESSION_TAG_PAGES_MAXIMUM (MM_ALLOCATION_GRANULARITY / PAGE_SIZE)
253
254//
255// Used by MiCheckSecuredVad
256//
257#define MM_READ_WRITE_ALLOWED 11
258#define MM_READ_ONLY_ALLOWED 10
259#define MM_NO_ACCESS_ALLOWED 01
260#define MM_DELETE_CHECK 85
261
262//
263// System views are binned into 64K chunks
264//
265#define MI_SYSTEM_VIEW_BUCKET_SIZE _64K
266
267//
268// FIXFIX: These should go in ex.h after the pool merge
269//
270#ifdef _WIN64
271#define POOL_BLOCK_SIZE 16
272#else
273#define POOL_BLOCK_SIZE 8
274#endif
275#define POOL_LISTS_PER_PAGE (PAGE_SIZE / POOL_BLOCK_SIZE)
276#define BASE_POOL_TYPE_MASK 1
277#define POOL_MAX_ALLOC (PAGE_SIZE - (sizeof(POOL_HEADER) + POOL_BLOCK_SIZE))
278
279//
280// Pool debugging/analysis/tracing flags
281//
282#define POOL_FLAG_CHECK_TIMERS 0x1
283#define POOL_FLAG_CHECK_WORKERS 0x2
284#define POOL_FLAG_CHECK_RESOURCES 0x4
285#define POOL_FLAG_VERIFIER 0x8
286#define POOL_FLAG_CHECK_DEADLOCK 0x10
287#define POOL_FLAG_SPECIAL_POOL 0x20
288#define POOL_FLAG_DBGPRINT_ON_FAILURE 0x40
289#define POOL_FLAG_CRASH_ON_FAILURE 0x80
290
291//
292// BAD_POOL_HEADER codes during pool bugcheck
293//
294#define POOL_CORRUPTED_LIST 3
295#define POOL_SIZE_OR_INDEX_MISMATCH 5
296#define POOL_ENTRIES_NOT_ALIGNED_PREVIOUS 6
297#define POOL_HEADER_NOT_ALIGNED 7
298#define POOL_HEADER_IS_ZERO 8
299#define POOL_ENTRIES_NOT_ALIGNED_NEXT 9
300#define POOL_ENTRY_NOT_FOUND 10
301
302//
303// BAD_POOL_CALLER codes during pool bugcheck
304//
305#define POOL_ENTRY_CORRUPTED 1
306#define POOL_ENTRY_ALREADY_FREE 6
307#define POOL_ENTRY_NOT_ALLOCATED 7
308#define POOL_ALLOC_IRQL_INVALID 8
309#define POOL_FREE_IRQL_INVALID 9
310#define POOL_BILLED_PROCESS_INVALID 13
311#define POOL_HEADER_SIZE_INVALID 32
312
313typedef struct _POOL_DESCRIPTOR
314{
329
330typedef struct _POOL_HEADER
331{
332 union
333 {
334 struct
335 {
336#ifdef _WIN64
341#else
346#endif
347 };
349 };
350#ifdef _WIN64
352#endif
353 union
354 {
355#ifdef _WIN64
356 PEPROCESS ProcessBilled;
357#else
359#endif
360 struct
361 {
364 };
365 };
367
370
372{
381
383{
389
394
395//
396// END FIXFIX
397//
398
400{
404
406{
411
413{
419
421{
425
427{
432
433typedef struct _MMCOLOR_TABLES
434{
439
441{
445
446typedef struct _MMVIEW
447{
451
452typedef struct _MMSESSION
453{
464
466{
471
472typedef struct _MM_SESSION_SPACE
473{
476 union
477 {
480 } u;
508#if defined (_M_AMD64)
509 MMPDE PageDirectory;
510#else
512#endif
513#if defined (_M_AMD64)
514 PMMPTE SpecialPoolFirstPte;
515 PMMPTE SpecialPoolLastPte;
516 PMMPTE NextPdeForSpecialPoolExpansion;
517 PMMPTE LastPdeForSpecialPoolExpansion;
518 PFN_NUMBER SpecialPagesInUse;
519#endif
522
525extern MMPDE ValidKernelPde;
526extern MMPTE ValidKernelPte;
529extern MMPDE DemandZeroPde;
530extern MMPTE DemandZeroPte;
531extern MMPTE PrototypePte;
537extern BOOLEAN MmTrackPtes;
538extern BOOLEAN MmDynamicPfn;
539extern BOOLEAN MmMirroring;
546extern WCHAR MmVerifyDriverBuffer[512];
563extern PVOID MmPagedPoolEnd;
564extern PVOID MmSessionBase;
565extern SIZE_T MmSessionSize;
610extern ULONG MmProductType;
648extern PVOID MiSessionPoolEnd; // 0xBE000000
649extern PVOID MiSessionPoolStart; // 0xBD000000
650extern PVOID MiSessionViewStart; // 0xBE000000
663
667{
668 return (WorkingSet != &MmSystemCacheWs) && !WorkingSet->Flags.SessionSpace;
669}
670
674{
675 return ((MemoryType == LoaderFree) ||
676 (MemoryType == LoaderLoadedProgram) ||
677 (MemoryType == LoaderFirmwareTemporary) ||
678 (MemoryType == LoaderOsloaderStack));
679}
680
684{
685 return ((MemoryType == LoaderFirmwarePermanent) ||
686 (MemoryType == LoaderSpecialMemory) ||
687 (MemoryType == LoaderHALCachedMemory) ||
688 (MemoryType == LoaderBBTMemory));
689}
690
691#ifdef _M_AMD64
694MiIsUserPxe(PVOID Address)
695{
696 return ((ULONG_PTR)Address >> 7) == 0x1FFFFEDF6FB7DA0ULL;
697}
698
701MiIsUserPpe(PVOID Address)
702{
703 return ((ULONG_PTR)Address >> 16) == 0xFFFFF6FB7DA0ULL;
704}
705
709{
710 return ((ULONG_PTR)Address >> 25) == 0x7FFFFB7DA0ULL;
711}
712
716{
717 return ((ULONG_PTR)Address >> 34) == 0x3FFFFDA0ULL;
718}
719#else
723{
724 return ((Address >= (PVOID)MiAddressToPde(NULL)) &&
726}
727
731{
732 return (Address >= (PVOID)PTE_BASE) && (Address <= (PVOID)MiHighestUserPte);
733}
734#endif
735
736//
737// Figures out the hardware bits for a PTE
738//
742{
744
745 /* Start fresh */
746 TempPte.u.Long = 0;
747
748 /* Make it valid and accessed */
749 TempPte.u.Hard.Valid = TRUE;
751
752 /* Is this for user-mode? */
753 if (
754#if (_MI_PAGING_LEVELS == 4)
755 MiIsUserPxe(PointerPte) ||
756#endif
757#if (_MI_PAGING_LEVELS >= 3)
758 MiIsUserPpe(PointerPte) ||
759#endif
760 MiIsUserPde(PointerPte) ||
761 MiIsUserPte(PointerPte))
762 {
763 /* Set the owner bit */
765 }
766
767 /* FIXME: We should also set the global bit */
768
769 /* Return the protection */
770 return TempPte.u.Long;
771}
772
773//
774// Creates a valid kernel PTE with the given protection
775//
777VOID
779 IN PMMPTE MappingPte,
780 IN ULONG_PTR ProtectionMask,
781 IN PFN_NUMBER PageFrameNumber)
782{
783 /* Only valid for kernel, non-session PTEs */
784 ASSERT(MappingPte > MiHighestUserPte);
785 ASSERT(!MI_IS_SESSION_PTE(MappingPte));
786 ASSERT((MappingPte < (PMMPTE)PDE_BASE) || (MappingPte > (PMMPTE)PDE_TOP));
787
788 /* Check that we are not setting valid a page that should not be */
789 ASSERT(ProtectionMask & MM_PROTECT_ACCESS);
790 ASSERT((ProtectionMask & MM_PROTECT_SPECIAL) != MM_GUARDPAGE);
791 ASSERT(ProtectionMask != MM_OUTSWAPPED_KSTACK && ((ProtectionMask & ~MM_OUTSWAPPED_KSTACK) == 0));
792
793 /* Start fresh */
794 NewPte->u.Long = 0;
795
796 /* Set the protection and page */
797 NewPte->u.Hard.PageFrameNumber = PageFrameNumber;
798 NewPte->u.Long |= MmProtectToPteMask[ProtectionMask];
799
800 /* Make this valid & global */
801#ifdef _GLOBAL_PAGES_ARE_AWESOME_
803 NewPte->u.Hard.Global = 1;
804#endif
805 NewPte->u.Hard.Valid = 1;
806}
807
808//
809// Creates a valid PTE with the given protection
810//
812VOID
814 IN PMMPTE MappingPte,
815 IN ULONG_PTR ProtectionMask,
816 IN PFN_NUMBER PageFrameNumber)
817{
818 /* Check that we are not setting valid a page that should not be */
819 ASSERT(ProtectionMask & MM_PROTECT_ACCESS);
820 ASSERT((ProtectionMask & MM_PROTECT_SPECIAL) != MM_GUARDPAGE);
821 ASSERT(ProtectionMask != MM_OUTSWAPPED_KSTACK && ((ProtectionMask & ~MM_OUTSWAPPED_KSTACK) == 0));
822
823 /* Set the protection and page */
824 NewPte->u.Long = MiDetermineUserGlobalPteMask(MappingPte);
825 NewPte->u.Long |= MmProtectToPteMask[ProtectionMask];
826 NewPte->u.Hard.PageFrameNumber = PageFrameNumber;
827}
828
829//
830// Creates a valid user PTE with the given protection
831//
833VOID
835 IN PMMPTE MappingPte,
836 IN ULONG_PTR ProtectionMask,
837 IN PFN_NUMBER PageFrameNumber)
838{
839 /* Only valid for kernel, non-session PTEs */
840 ASSERT(MappingPte <= MiHighestUserPte);
841
842 /* Start fresh */
843 NewPte->u.Long = 0;
844
845 /* Check that we are not setting valid a page that should not be */
846 ASSERT(ProtectionMask & MM_PROTECT_ACCESS);
847 ASSERT((ProtectionMask & MM_PROTECT_SPECIAL) != MM_GUARDPAGE);
848 ASSERT(ProtectionMask != MM_OUTSWAPPED_KSTACK && ((ProtectionMask & ~MM_OUTSWAPPED_KSTACK) == 0));
849
850 NewPte->u.Hard.Valid = TRUE;
851 NewPte->u.Hard.Owner = TRUE;
852 NewPte->u.Hard.PageFrameNumber = PageFrameNumber;
853 NewPte->u.Long |= MmProtectToPteMask[ProtectionMask];
854}
855
856#ifndef _M_AMD64
857//
858// Builds a Prototype PTE for the address of the PTE
859//
861VOID
863 IN PMMPTE PointerPte)
864{
866
867 /* Mark this as a prototype */
868 NewPte->u.Long = 0;
869 NewPte->u.Proto.Prototype = 1;
870
871 /*
872 * Prototype PTEs are only valid in paged pool by design, this little trick
873 * lets us only use 30 bits for the address of the PTE, as long as the area
874 * stays 1024MB At most.
875 */
877
878 /*
879 * 7 bits go in the "low" (but we assume the bottom 2 are zero)
880 * and the other 21 bits go in the "high"
881 */
882 NewPte->u.Proto.ProtoAddressLow = (Offset & 0x1FC) >> 2;
883 NewPte->u.Proto.ProtoAddressHigh = (Offset & 0x3FFFFE00) >> 9;
884}
885
886//
887// Builds a Subsection PTE for the address of the Segment
888//
890VOID
893{
895
896 /* Mark this as a prototype */
897 NewPte->u.Long = 0;
898 NewPte->u.Subsect.Prototype = 1;
899
900 /*
901 * Segments are only valid either in nonpaged pool. We store the 20 bit
902 * difference either from the top or bottom of nonpaged pool, giving a
903 * maximum of 128MB to each delta, meaning nonpaged pool cannot exceed
904 * 256MB.
905 */
906 if ((ULONG_PTR)Segment < ((ULONG_PTR)MmSubsectionBase + (128 * _1MB)))
907 {
909 NewPte->u.Subsect.WhichPool = PagedPool;
910 }
911 else
912 {
914 NewPte->u.Subsect.WhichPool = NonPagedPool;
915 }
916
917 /*
918 * 4 bits go in the "low" (but we assume the bottom 3 are zero)
919 * and the other 20 bits go in the "high"
920 */
921 NewPte->u.Subsect.SubsectionAddressLow = (Offset & 0x78) >> 3;
922 NewPte->u.Subsect.SubsectionAddressHigh = (Offset & 0xFFFFF80) >> 7;
923}
924
928{
930 return ((PointerPte->u.Long & 0xFFFFFC01) != 0);
931}
932
933#endif
934
936VOID
939 _In_ ULONG Protection)
940{
941 NewPte->u.Long = 0;
942 NewPte->u.Trans.Transition = 1;
943 NewPte->u.Trans.Protection = Protection;
944 NewPte->u.Trans.PageFrameNumber = Page;
945}
946
947//
948// Returns if the page is physically resident (ie: a large page)
949// FIXFIX: CISC/x86 only?
950//
954{
955 PMMPDE PointerPde;
956
957 /* Large pages are never paged out, always physically resident */
958 PointerPde = MiAddressToPde(Address);
959 return ((PointerPde->u.Hard.LargePage) && (PointerPde->u.Hard.Valid));
960}
961
962//
963// Writes a valid PTE
964//
966VOID
969{
970 /* Write the valid PTE */
971 ASSERT(PointerPte->u.Hard.Valid == 0);
972 ASSERT(TempPte.u.Hard.Valid == 1);
973#if _M_AMD64
975 (TempPte.u.Hard.NoExecute == 0));
976#endif
977 *PointerPte = TempPte;
978}
979
980//
981// Updates a valid PTE
982//
984VOID
987{
988 /* Write the valid PTE */
989 ASSERT(PointerPte->u.Hard.Valid == 1);
990 ASSERT(TempPte.u.Hard.Valid == 1);
991 ASSERT(PointerPte->u.Hard.PageFrameNumber == TempPte.u.Hard.PageFrameNumber);
992 *PointerPte = TempPte;
993}
994
995//
996// Writes an invalid PTE
997//
999VOID
1001 IN MMPTE InvalidPte)
1002{
1003 /* Write the invalid PTE */
1004 ASSERT(InvalidPte.u.Hard.Valid == 0);
1005 *PointerPte = InvalidPte;
1006}
1007
1008//
1009// Erase the PTE completely
1010//
1012VOID
1014{
1015 /* Zero out the PTE */
1016 ASSERT(PointerPte->u.Long != 0);
1017 PointerPte->u.Long = 0;
1018}
1019
1020//
1021// Writes a valid PDE
1022//
1024VOID
1027{
1028 /* Write the valid PDE */
1029 ASSERT(PointerPde->u.Hard.Valid == 0);
1030#ifdef _M_AMD64
1031 ASSERT(PointerPde->u.Hard.NoExecute == 0);
1032#endif
1033 ASSERT(TempPde.u.Hard.Valid == 1);
1034 *PointerPde = TempPde;
1035}
1036
1037//
1038// Writes an invalid PDE
1039//
1041VOID
1043 IN MMPDE InvalidPde)
1044{
1045 /* Write the invalid PDE */
1046 ASSERT(InvalidPde.u.Hard.Valid == 0);
1047 ASSERT(InvalidPde.u.Long != 0);
1048#ifdef _M_AMD64
1049 ASSERT(InvalidPde.u.Soft.Protection == MM_EXECUTE_READWRITE);
1050#endif
1051 *PointerPde = InvalidPde;
1052}
1053
1054//
1055// Checks if the thread already owns a working set
1056//
1058BOOLEAN
1060{
1061 /* If any of these are held, return TRUE */
1068}
1069
1071BOOLEAN
1073{
1077}
1078
1079//
1080// Checks if the process owns the working set lock
1081//
1083BOOLEAN
1085{
1086 /* Check if this process is the owner, and that the thread owns the WS */
1087 if (PsGetCurrentThread()->OwnsProcessWorkingSetExclusive == 0)
1088 {
1089 DPRINT("Thread: %p is not an owner\n", PsGetCurrentThread());
1090 }
1091 if (KeGetCurrentThread()->ApcState.Process != &Process->Pcb)
1092 {
1093 DPRINT("Current thread %p is attached to another process %p\n", PsGetCurrentThread(), Process);
1094 }
1095 return ((KeGetCurrentThread()->ApcState.Process == &Process->Pcb) &&
1096 ((PsGetCurrentThread()->OwnsProcessWorkingSetExclusive) ||
1097 (PsGetCurrentThread()->OwnsProcessWorkingSetShared)));
1098}
1099
1100//
1101// New ARM3<->RosMM PAGE Architecture
1102//
1104BOOLEAN
1106{
1107 return Section->u.Flags.filler;
1108}
1109
1110#define MI_IS_ROS_PFN(x) ((x)->u4.AweAllocation == TRUE)
1111
1112VOID
1113NTAPI
1115 IN PMMPFN Pfn1,
1116 IN PFN_NUMBER PageFrameIndex
1117);
1118
1120BOOLEAN
1122{
1123 return (Process->Vm.Flags.AcquiredUnsafe == TRUE);
1124}
1125
1126//
1127// Locks the working set for the given process
1128//
1130VOID
1133{
1134 /* Shouldn't already be owning the process working set */
1137
1138 /* Block APCs, make sure that still nothing is already held */
1141
1142 /* Lock the working set */
1143 ExAcquirePushLockExclusive(&Process->Vm.WorkingSetMutex);
1144
1145 /* Now claim that we own the lock */
1149}
1150
1152VOID
1155{
1156 /* Shouldn't already be owning the process working set */
1159
1160 /* Block APCs, make sure that still nothing is already held */
1163
1164 /* Lock the working set */
1165 ExAcquirePushLockShared(&Process->Vm.WorkingSetMutex);
1166
1167 /* Now claim that we own the lock */
1172}
1173
1175VOID
1178{
1179 /* Shouldn't already be owning the process working set */
1181
1182 /* APCs must be blocked, make sure that still nothing is already held */
1185
1186 /* Lock the working set */
1187 ExAcquirePushLockExclusive(&Process->Vm.WorkingSetMutex);
1188
1189 /* Now claim that we own the lock */
1191 Process->Vm.Flags.AcquiredUnsafe = 1;
1194}
1195
1196//
1197// Unlocks the working set for the given process
1198//
1200VOID
1203{
1204 /* Make sure we are the owner of a safe acquisition */
1207
1208 /* The thread doesn't own it anymore */
1211
1212 /* Release the lock and re-enable APCs */
1213 ExReleasePushLockExclusive(&Process->Vm.WorkingSetMutex);
1215}
1216
1217//
1218// Unlocks the working set for the given process
1219//
1221VOID
1224{
1225 /* Make sure we are the owner of a safe acquisition (because shared) */
1228
1229 /* Ensure we are in a shared acquisition */
1232
1233 /* Don't claim the lock anylonger */
1235
1236 /* Release the lock and re-enable APCs */
1237 ExReleasePushLockShared(&Process->Vm.WorkingSetMutex);
1239}
1240
1241//
1242// Unlocks the working set for the given process
1243//
1245VOID
1248{
1249 /* Make sure we are the owner of an unsafe acquisition */
1254
1255 /* No longer unsafe */
1256 Process->Vm.Flags.AcquiredUnsafe = 0;
1257
1258 /* The thread doesn't own it anymore */
1261
1262 /* Release the lock but don't touch APC state */
1263 ExReleasePushLockExclusive(&Process->Vm.WorkingSetMutex);
1265}
1266
1267//
1268// Locks the working set
1269//
1271VOID
1273 IN PMMSUPPORT WorkingSet)
1274{
1275 /* Block APCs */
1277
1278 /* Working set should be in global memory */
1279 ASSERT(MI_IS_SESSION_ADDRESS((PVOID)WorkingSet) == FALSE);
1280
1281 /* Thread shouldn't already be owning something */
1283
1284 /* Lock this working set */
1285 ExAcquirePushLockExclusive(&WorkingSet->WorkingSetMutex);
1286
1287 /* Which working set is this? */
1288 if (WorkingSet == &MmSystemCacheWs)
1289 {
1290 /* Own the system working set */
1294 }
1295 else if (WorkingSet->Flags.SessionSpace)
1296 {
1297 /* Own the session working set */
1301 }
1302 else
1303 {
1304 /* Own the process working set */
1308 }
1309}
1310
1312VOID
1315 _In_ PMMSUPPORT WorkingSet)
1316{
1317 /* Block APCs */
1319
1320 /* Working set should be in global memory */
1321 ASSERT(MI_IS_SESSION_ADDRESS((PVOID)WorkingSet) == FALSE);
1322
1323 /* Thread shouldn't already be owning something */
1325
1326 /* Lock this working set */
1327 ExAcquirePushLockShared(&WorkingSet->WorkingSetMutex);
1328
1329 /* Which working set is this? */
1330 if (WorkingSet == &MmSystemCacheWs)
1331 {
1332 /* Own the system working set */
1336 }
1337 else if (WorkingSet->Flags.SessionSpace)
1338 {
1339 /* Own the session working set */
1343 }
1344 else
1345 {
1346 /* Own the process working set */
1350 }
1351}
1352
1353//
1354// Unlocks the working set
1355//
1357VOID
1359 IN PMMSUPPORT WorkingSet)
1360{
1361 /* Working set should be in global memory */
1362 ASSERT(MI_IS_SESSION_ADDRESS((PVOID)WorkingSet) == FALSE);
1363
1364 /* Which working set is this? */
1365 if (WorkingSet == &MmSystemCacheWs)
1366 {
1367 /* Release the system working set */
1371 }
1372 else if (WorkingSet->Flags.SessionSpace)
1373 {
1374 /* Release the session working set */
1378 }
1379 else
1380 {
1381 /* Release the process working set */
1385 }
1386
1387 /* Release the working set lock */
1388 ExReleasePushLockExclusive(&WorkingSet->WorkingSetMutex);
1389
1390 /* Unblock APCs */
1392}
1393
1395VOID
1398 _In_ PMMSUPPORT WorkingSet)
1399{
1400 /* Working set should be in global memory */
1401 ASSERT(MI_IS_SESSION_ADDRESS((PVOID)WorkingSet) == FALSE);
1402
1403 /* Which working set is this? */
1404 if (WorkingSet == &MmSystemCacheWs)
1405 {
1406 /* Release the system working set */
1410 }
1411 else if (WorkingSet->Flags.SessionSpace)
1412 {
1413 /* Release the session working set */
1417 }
1418 else
1419 {
1420 /* Release the process working set */
1424 }
1425
1426 /* Release the working set lock */
1427 ExReleasePushLockShared(&WorkingSet->WorkingSetMutex);
1428
1429 /* Unblock APCs */
1431}
1432
1434BOOLEAN
1438{
1439 /* Sanity check: No exclusive lock. */
1443
1444 /* And it should have one and only one shared lock */
1446
1447 /* Try. */
1449 return FALSE;
1450
1451 if (Vm == &MmSystemCacheWs)
1452 {
1456 }
1457 else if (Vm->Flags.SessionSpace)
1458 {
1462 }
1463 else
1464 {
1468 }
1469
1470 return TRUE;
1471}
1472
1474VOID
1477 OUT PBOOLEAN Safe,
1478 OUT PBOOLEAN Shared)
1479{
1481
1482 /* Check if the current owner is unsafe */
1484 {
1485 /* Release unsafely */
1487 *Safe = FALSE;
1488 *Shared = FALSE;
1489 }
1491 {
1492 /* Owner is safe and exclusive, release normally */
1494 *Safe = TRUE;
1495 *Shared = FALSE;
1496 }
1497 else
1498 {
1499 /* Owner is shared (implies safe), release normally */
1501 *Safe = TRUE;
1502 *Shared = TRUE;
1503 }
1504}
1505
1507VOID
1510 IN BOOLEAN Safe,
1511 IN BOOLEAN Shared)
1512{
1513 /* Check if this was a safe lock or not */
1514 if (Safe)
1515 {
1516 if (Shared)
1517 {
1518 /* Reacquire safely & shared */
1520 }
1521 else
1522 {
1523 /* Reacquire safely */
1525 }
1526 }
1527 else
1528 {
1529 /* Unsafe lock cannot be shared */
1530 ASSERT(Shared == FALSE);
1531 /* Reacquire unsafely */
1533 }
1534}
1535
1537KIRQL
1539{
1540 KIRQL OldIrql;
1541
1546 return OldIrql;
1547}
1548
1550VOID
1552{
1557}
1558
1559//
1560// Returns the ProtoPTE inside a VAD for the given VPN
1561//
1563PMMPTE
1565 IN ULONG_PTR Vpn)
1566{
1567 PMMPTE ProtoPte;
1568
1569 /* Find the offset within the VAD's prototype PTEs */
1570 ProtoPte = Vad->FirstPrototypePte + (Vpn - Vad->StartingVpn);
1571 ASSERT(ProtoPte <= Vad->LastContiguousPte);
1572 return ProtoPte;
1573}
1574
1575//
1576// Returns the PFN Database entry for the given page number
1577// Warning: This is not necessarily a valid PFN database entry!
1578//
1580PMMPFN
1582{
1583 /* Get the entry */
1584 return &MmPfnDatabase[Pfn];
1585};
1586
1587//
1588// Drops a locked page without dereferencing it
1589//
1591VOID
1593{
1594 /* This page shouldn't be locked, but it should be valid */
1595 ASSERT(Pfn1->u3.e2.ReferenceCount != 0);
1596 ASSERT(Pfn1->u2.ShareCount == 0);
1597
1598 /* Is this the last reference to the page */
1599 if (Pfn1->u3.e2.ReferenceCount == 1)
1600 {
1601 /* It better not be valid */
1602 ASSERT(Pfn1->u3.e1.PageLocation != ActiveAndValid);
1603
1604 /* Is it a prototype PTE? */
1605 if ((Pfn1->u3.e1.PrototypePte == 1) &&
1606 (Pfn1->OriginalPte.u.Soft.Prototype == 1))
1607 {
1608 /* FIXME: We should return commit */
1609 DPRINT1("Not returning commit for prototype PTE\n");
1610 }
1611
1612 /* Update the counter */
1614 }
1615}
1616
1617//
1618// Drops a locked page and dereferences it
1619//
1621VOID
1623{
1624 USHORT RefCount, OldRefCount;
1625 PFN_NUMBER PageFrameIndex;
1626
1627 /* Loop while we decrement the page successfully */
1628 do
1629 {
1630 /* There should be at least one reference */
1631 OldRefCount = Pfn1->u3.e2.ReferenceCount;
1632 ASSERT(OldRefCount != 0);
1633
1634 /* Are we the last one */
1635 if (OldRefCount == 1)
1636 {
1637 /* The page shoudln't be shared not active at this point */
1638 ASSERT(Pfn1->u3.e2.ReferenceCount == 1);
1639 ASSERT(Pfn1->u3.e1.PageLocation != ActiveAndValid);
1640 ASSERT(Pfn1->u2.ShareCount == 0);
1641
1642 /* Is it a prototype PTE? */
1643 if ((Pfn1->u3.e1.PrototypePte == 1) &&
1644 (Pfn1->OriginalPte.u.Soft.Prototype == 1))
1645 {
1646 /* FIXME: We should return commit */
1647 DPRINT1("Not returning commit for prototype PTE\n");
1648 }
1649
1650 /* Update the counter, and drop a reference the long way */
1652 PageFrameIndex = MiGetPfnEntryIndex(Pfn1);
1653 MiDecrementReferenceCount(Pfn1, PageFrameIndex);
1654 return;
1655 }
1656
1657 /* Drop a reference the short way, and that's it */
1658 RefCount = InterlockedCompareExchange16((PSHORT)&Pfn1->u3.e2.ReferenceCount,
1659 OldRefCount - 1,
1660 OldRefCount);
1661 ASSERT(RefCount != 0);
1662 } while (OldRefCount != RefCount);
1663
1664 /* If we got here, there should be more than one reference */
1665 ASSERT(RefCount > 1);
1666 if (RefCount == 2)
1667 {
1668 /* Is it still being shared? */
1669 if (Pfn1->u2.ShareCount >= 1)
1670 {
1671 /* Then it should be valid */
1672 ASSERT(Pfn1->u3.e1.PageLocation == ActiveAndValid);
1673
1674 /* Is it a prototype PTE? */
1675 if ((Pfn1->u3.e1.PrototypePte == 1) &&
1676 (Pfn1->OriginalPte.u.Soft.Prototype == 1))
1677 {
1678 /* We don't handle ethis */
1679 ASSERT(FALSE);
1680 }
1681
1682 /* Update the counter */
1684 }
1685 }
1686}
1687
1688//
1689// References a locked page and updates the counter
1690// Used in MmProbeAndLockPages to handle different edge cases
1691//
1693VOID
1695{
1696 USHORT RefCount, OldRefCount;
1697
1698 /* Sanity check */
1699 ASSERT(Pfn1->u3.e2.ReferenceCount != 0);
1700
1701 /* Does ARM3 own the page? */
1702 if (MI_IS_ROS_PFN(Pfn1))
1703 {
1704 /* ReactOS Mm doesn't track share count */
1705 ASSERT(Pfn1->u3.e1.PageLocation == ActiveAndValid);
1706 }
1707 else
1708 {
1709 /* On ARM3 pages, we should see a valid share count */
1710 ASSERT((Pfn1->u2.ShareCount != 0) && (Pfn1->u3.e1.PageLocation == ActiveAndValid));
1711
1712 /* Is it a prototype PTE? */
1713 if ((Pfn1->u3.e1.PrototypePte == 1) &&
1714 (Pfn1->OriginalPte.u.Soft.Prototype == 1))
1715 {
1716 /* FIXME: We should charge commit */
1717 DPRINT1("Not charging commit for prototype PTE\n");
1718 }
1719 }
1720
1721 /* More locked pages! */
1723
1724 /* Loop trying to update the reference count */
1725 do
1726 {
1727 /* Get the current reference count, make sure it's valid */
1728 OldRefCount = Pfn1->u3.e2.ReferenceCount;
1729 ASSERT(OldRefCount != 0);
1730 ASSERT(OldRefCount < 2500);
1731
1732 /* Bump it up by one */
1733 RefCount = InterlockedCompareExchange16((PSHORT)&Pfn1->u3.e2.ReferenceCount,
1734 OldRefCount + 1,
1735 OldRefCount);
1736 ASSERT(RefCount != 0);
1737 } while (OldRefCount != RefCount);
1738
1739 /* Was this the first lock attempt? If not, undo our bump */
1740 if (OldRefCount != 1) InterlockedDecrementSizeT(&MmSystemLockPagesCount);
1741}
1742
1743//
1744// References a locked page and updates the counter
1745// Used in all other cases except MmProbeAndLockPages
1746//
1748VOID
1750{
1751 USHORT NewRefCount;
1752
1753 /* Is it a prototype PTE? */
1754 if ((Pfn1->u3.e1.PrototypePte == 1) &&
1755 (Pfn1->OriginalPte.u.Soft.Prototype == 1))
1756 {
1757 /* FIXME: We should charge commit */
1758 DPRINT1("Not charging commit for prototype PTE\n");
1759 }
1760
1761 /* More locked pages! */
1763
1764 /* Update the reference count */
1765 NewRefCount = InterlockedIncrement16((PSHORT)&Pfn1->u3.e2.ReferenceCount);
1766 if (NewRefCount == 2)
1767 {
1768 /* Is it locked or shared? */
1769 if (Pfn1->u2.ShareCount)
1770 {
1771 /* It's shared, so make sure it's active */
1772 ASSERT(Pfn1->u3.e1.PageLocation == ActiveAndValid);
1773 }
1774 else
1775 {
1776 /* It's locked, so we shouldn't lock again */
1778 }
1779 }
1780 else
1781 {
1782 /* Someone had already locked the page, so undo our bump */
1783 ASSERT(NewRefCount < 2500);
1785 }
1786}
1787
1788//
1789// References a locked page and updates the counter
1790// Used in all other cases except MmProbeAndLockPages
1791//
1793VOID
1795{
1796 USHORT NewRefCount;
1797
1798 /* Make sure the page isn't used yet */
1799 ASSERT(Pfn1->u2.ShareCount == 0);
1800 ASSERT(Pfn1->u3.e1.PageLocation != ActiveAndValid);
1801
1802 /* Is it a prototype PTE? */
1803 if ((Pfn1->u3.e1.PrototypePte == 1) &&
1804 (Pfn1->OriginalPte.u.Soft.Prototype == 1))
1805 {
1806 /* FIXME: We should charge commit */
1807 DPRINT1("Not charging commit for prototype PTE\n");
1808 }
1809
1810 /* More locked pages! */
1812
1813 /* Update the reference count */
1814 NewRefCount = InterlockedIncrement16((PSHORT)&Pfn1->u3.e2.ReferenceCount);
1815 if (NewRefCount != 1)
1816 {
1817 /* Someone had already locked the page, so undo our bump */
1818 ASSERT(NewRefCount < 2500);
1820 }
1821}
1822
1823
1824
1825CODE_SEG("INIT")
1826BOOLEAN
1827NTAPI
1829 IN ULONG Phase,
1830 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1831);
1832
1833CODE_SEG("INIT")
1834VOID
1835NTAPI
1837
1838CODE_SEG("INIT")
1840NTAPI
1842 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1843);
1844
1845CODE_SEG("INIT")
1846VOID
1847NTAPI
1849 VOID
1850);
1851
1852CODE_SEG("INIT")
1853VOID
1854NTAPI
1856 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1857);
1858
1859CODE_SEG("INIT")
1860VOID
1861NTAPI
1863 VOID
1864);
1865
1866CODE_SEG("INIT")
1867VOID
1868NTAPI
1870 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1871);
1872
1873VOID
1874NTAPI
1876 VOID
1877);
1878
1879VOID
1880NTAPI
1882 VOID
1883);
1884
1885CODE_SEG("INIT")
1886BOOLEAN
1887NTAPI
1889 VOID
1890);
1891
1892CODE_SEG("INIT")
1894NTAPI
1896 IN PFN_NUMBER PageCount
1897);
1898
1899CODE_SEG("INIT")
1901NTAPI
1903 IN PLOADER_PARAMETER_BLOCK LoaderBlock,
1904 IN PBOOLEAN IncludeType
1905);
1906
1908NTAPI
1910 IN PLOADER_PARAMETER_BLOCK LoaderBlock,
1911 IN PBOOLEAN IncludeType
1912);
1913
1914VOID
1917 IN PVOID AddressStart,
1918 IN PVOID AddressEnd
1919);
1920
1922NTAPI
1926 IN OUT PSIZE_T NumberOfBytesToProtect,
1927 IN ULONG NewAccessProtection,
1928 OUT PULONG OldAccessProtection OPTIONAL
1929);
1930
1932NTAPI
1934 IN ULONG FaultCode,
1937 IN PVOID TrapInformation
1938);
1939
1944);
1945
1946CODE_SEG("INIT")
1947VOID
1948NTAPI
1950 VOID
1951);
1952
1953CODE_SEG("INIT")
1954VOID
1955NTAPI
1957 VOID
1958);
1959
1960CODE_SEG("INIT")
1961VOID //
1962NTAPI //
1964 IN POOL_TYPE PoolType,// FIXFIX: This should go in ex.h after the pool merge
1965 IN ULONG Threshold //
1966); //
1967
1968// FIXFIX: THIS ONE TOO
1969CODE_SEG("INIT")
1970VOID
1971NTAPI
1973 IN PPOOL_DESCRIPTOR PoolDescriptor,
1975 IN ULONG PoolIndex,
1976 IN ULONG Threshold,
1977 IN PVOID PoolLock
1978);
1979
1981NTAPI
1983 VOID
1984);
1985
1986CODE_SEG("INIT")
1987VOID
1988NTAPI
1990 IN PMMPTE StartingPte,
1991 IN ULONG NumberOfPtes,
1993);
1994
1995PMMPTE
1996NTAPI
1998 IN ULONG NumberOfPtes,
1999 IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType
2000);
2001
2002VOID
2003NTAPI
2005 IN PMMPTE StartingPte,
2006 IN ULONG NumberOfPtes,
2007 IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType
2008);
2009
2010
2012NTAPI
2014 IN PFN_NUMBER LowestPfn,
2015 IN PFN_NUMBER HighestPfn,
2016 IN PFN_NUMBER BoundaryPfn,
2017 IN PFN_NUMBER SizeInPages,
2019);
2020
2021PVOID
2022NTAPI
2025 IN PFN_NUMBER BaseAddressPages,
2026 IN PFN_NUMBER SizeInPages,
2027 IN PFN_NUMBER LowestPfn,
2028 IN PFN_NUMBER HighestPfn,
2029 IN PFN_NUMBER BoundaryPfn,
2030 IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute
2031);
2032
2033PMDL
2034NTAPI
2036 IN PHYSICAL_ADDRESS LowAddress,
2040 IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute,
2041 IN ULONG Flags
2042);
2043
2044VOID
2045NTAPI
2047 IN PMMPFNLIST ListHead,
2048 IN PFN_NUMBER PageFrameIndex
2049);
2050
2051VOID
2052NTAPI
2055);
2056
2057VOID
2058NTAPI
2060 IN PMMPFN Pfn
2061);
2062
2063VOID
2064NTAPI
2066 IN PFN_NUMBER PageFrameIndex,
2067 IN PMMPTE PointerPte,
2068 IN BOOLEAN Modified
2069);
2070
2072NTAPI
2074 OUT PPFN_NUMBER PageFrameIndex,
2075 IN PMMPDE PointerPde,
2076 IN PFN_NUMBER ContainingPageFrame,
2077 IN BOOLEAN SessionAllocation
2078);
2079
2080VOID
2081NTAPI
2083 IN PFN_NUMBER PageFrameIndex,
2084 IN PMMPTE PointerPte,
2086);
2087
2088VOID
2089NTAPI
2091 IN PFN_NUMBER PageFrameIndex,
2092 IN PVOID PteAddress,
2093 IN PFN_NUMBER PteFrame
2094);
2095
2096VOID
2097NTAPI
2099 IN PMMPFN Pfn1,
2100 IN PFN_NUMBER PageFrameIndex
2101);
2102
2104NTAPI
2106 IN ULONG Color
2107);
2108
2110NTAPI
2112 IN ULONG Color
2113);
2114
2115VOID
2116NTAPI
2118 IN PFN_NUMBER PageFrameIndex
2119);
2120
2121VOID
2122NTAPI
2124 IN PFN_NUMBER PageFrameIndex
2125);
2126
2128NTAPI
2130 IN PMMPTE PointerPte,
2131 IN PFN_NUMBER PageCount,
2132 IN ULONG Flags,
2133 OUT PPFN_NUMBER ValidPages
2134);
2135
2136ULONG
2137NTAPI
2139 IN PMMPTE PointerPte
2140);
2141
2143NTAPI
2146);
2147
2148CODE_SEG("INIT")
2149VOID
2150NTAPI
2152 VOID
2153);
2154
2155CODE_SEG("INIT")
2156VOID
2157NTAPI
2159 VOID
2160);
2161
2162CODE_SEG("INIT")
2163VOID
2164NTAPI
2166 VOID
2167);
2168
2169BOOLEAN
2170NTAPI
2172 IN PMMPFN Pfn1
2173);
2174
2175PMMVAD
2176NTAPI
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
2264 _In_ BOOLEAN SkipDebuggerNotify);
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_opt_ 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(...)
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG ReturnLength
ULONG_PTR PFN_NUMBER
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
unsigned char BOOLEAN
Definition: actypes.h:127
ULONG64 KeFeatureBits
Definition: krnlinit.c:22
HARDWARE_PTE_ARMV6 TempPte
Definition: winldr.c:76
#define PDE_BASE
Definition: winldr.c:21
HARDWARE_PDE_ARMV6 TempPde
Definition: winldr.c:78
#define PTE_BASE
Definition: winldr.c:20
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
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:124
#define InterlockedDecrementSizeT(a)
Definition: interlocked.h:168
#define InterlockedIncrement16
Definition: interlocked.h:221
#define InterlockedIncrementSizeT(a)
Definition: interlocked.h:235
#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)
MMPTE ValidKernelPte
Definition: init.c:29
_MMSYSTEM_PTE_POOL_TYPE
Definition: miarm.h:406
@ SystemPteSpace
Definition: miarm.h:407
@ MaximumPtePoolTypes
Definition: miarm.h:409
@ NonPagedPoolExpansion
Definition: miarm.h:408
PVOID MmSystemPteSpaceStart
Definition: mminit.c:97
FORCEINLINE VOID MI_MAKE_SUBSECTION_PTE(IN PMMPTE NewPte, IN PVOID Segment)
Definition: miarm.h:891
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:234
PETHREAD MiExpansionLockOwner
Definition: session.c:33
PMMWSL MmWorkingSetList
Definition: wslist.cpp:19
#define MI_IS_ROS_PFN(x)
Definition: miarm.h:1110
ULONG MmMaximumNonPagedPoolPercent
Definition: init.c:20
FORCEINLINE KIRQL MiAcquireExpansionLock(VOID)
Definition: miarm.h:1538
PMMPTE MmSharedUserDataPte
Definition: mminit.c:26
PFN_COUNT MiExpansionPoolPagesInitialCharge
Definition: pool.c:21
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:1756
PFN_NUMBER MiNumberOfFreePages
Definition: mminit.c:385
PVOID MmNonPagedSystemStart
Definition: miarm.h:581
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:1564
PMMPTE MiSessionBasePte
Definition: mminit.c:146
FORCEINLINE BOOLEAN MM_ANY_WS_LOCK_HELD_EXCLUSIVE(_In_ PETHREAD Thread)
Definition: miarm.h:1072
FORCEINLINE BOOLEAN MI_IS_PHYSICAL_ADDRESS(IN PVOID Address)
Definition: miarm.h:953
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:1153
PMMPTE MmSystemPtesStart[MaximumPtePoolTypes]
Definition: syspte.c:22
FORCEINLINE BOOLEAN MiIsMemoryTypeInvisible(TYPE_OF_MEMORY MemoryType)
Definition: miarm.h:683
FORCEINLINE VOID MiDeletePde(_In_ PMMPDE PointerPde, _In_ PEPROCESS CurrentProcess)
Definition: miarm.h:2539
PMMPTE MmLastReservedMappingPte
Definition: miarm.h:566
PVOID MmPagedPoolStart
Definition: miarm.h:579
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:1272
FORCEINLINE VOID MI_MAKE_HARDWARE_PTE_USER(IN PMMPTE NewPte, IN PMMPTE MappingPte, IN ULONG_PTR ProtectionMask, IN PFN_NUMBER PageFrameNumber)
Definition: miarm.h:834
ULONG MmProcessColorSeed
Definition: procsup.c:20
struct _MMSESSION MMSESSION
struct _MM_SESSION_SPACE * PMM_SESSION_SPACE
PFN_NUMBER MmLowMemoryThreshold
Definition: mminit.c:301
ULONG MmVerifyDriverBufferType
Definition: drvmgmt.c:25
VOID NTAPI MiInitializePfnDatabase(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: mminit.c:1066
SIZE_T MmMinimumStackCommitInBytes
Definition: mminit.c:371
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:1361
VOID NTAPI MiInsertBasedSection(IN PSECTION Section)
Definition: vadnode.c:386
VOID NTAPI MiRemoveNode(IN PMMADDRESS_NODE Node, IN PMM_AVL_TABLE Table)
Definition: vadnode.c:403
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:1475
SLIST_HEADER MmDeadStackSListHead
Definition: procsup.c:22
MM_SYSTEMSIZE MmSystemSize
Definition: mminit.c:327
BOOLEAN MmDynamicPfn
Definition: pfnlist.c:34
struct _MI_LARGE_PAGE_RANGES MI_LARGE_PAGE_RANGES
ULONG MmSecondaryColorMask
Definition: mminit.c:258
FORCEINLINE BOOLEAN MI_IS_WS_UNSAFE(IN PEPROCESS Process)
Definition: miarm.h:1121
ULONG_PTR MmSubsectionBase
Definition: section.c:194
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:1105
#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:1508
struct _PHYSICAL_MEMORY_RUN * PPHYSICAL_MEMORY_RUN
PMMVAD NTAPI MiLocateVad(_In_ PMM_AVL_TABLE Table, _In_ PVOID VirtualAddress)
Definition: vadnode.c:116
PVOID MmNonPagedPoolEnd
Definition: mminit.c:100
PMMPDE MiHighestUserPde
Definition: mminit.c:235
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:1331
FORCEINLINE BOOLEAN MI_IS_PROCESS_WORKING_SET(PMMSUPPORT WorkingSet)
Definition: miarm.h:666
#define POOL_LISTS_PER_PAGE
Definition: miarm.h:275
PFN_NUMBER MmMinimumFreePages
Definition: mminit.c:315
SIZE_T MmSizeOfNonPagedPoolInBytes
Definition: init.c:21
VOID NTAPI MiSessionAddProcess(IN PEPROCESS NewProcess)
Definition: session.c:423
PFN_NUMBER MiLowPagedPoolThreshold
Definition: mminit.c:303
MMPTE ValidKernelPteLocal
Definition: init.c:33
FORCEINLINE VOID MI_MAKE_PROTOTYPE_PTE(IN PMMPTE NewPte, IN PMMPTE PointerPte)
Definition: miarm.h:862
PMM_SESSION_SPACE MmSessionSpace
Definition: session.c:21
VOID NTAPI MiInitializeColorTables(VOID)
Definition: mminit.c:554
FORCEINLINE VOID MiReferenceUsedPageAndBumpLockCount(IN PMMPFN Pfn1)
Definition: miarm.h:1749
struct _MI_LARGE_PAGE_RANGES * PMI_LARGE_PAGE_RANGES
PFN_NUMBER NTAPI MxGetNextPage(IN PFN_NUMBER PageCount)
Definition: mminit.c:475
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:711
#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:257
PMMPTE MiFirstReservedZeroingPte
Definition: hypermap.c:21
PVOID MiSessionViewStart
Definition: init.c:30
PMMPTE MiSessionImagePteEnd
Definition: mminit.c:145
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:273
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:2049
MMPTE HyperTemplatePte
Definition: hypermap.c:22
VOID NTAPI MiRemoveMappedView(IN PEPROCESS CurrentProcess, IN PMMVAD Vad)
Definition: section.c:768
#define MM_EXECUTE_READWRITE
Definition: miarm.h:49
#define MM_OUTSWAPPED_KSTACK
Definition: miarm.h:66
#define LIST_HEAD
Definition: miarm.h:223
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:730
MMPDE ValidKernelPdeLocal
Definition: init.c:32
PMMADDRESS_NODE NTAPI MiGetPreviousNode(IN PMMADDRESS_NODE Node)
Definition: vadnode.c:425
FORCEINLINE VOID MiUnlockProcessWorkingSetShared(IN PEPROCESS Process, IN PETHREAD Thread)
Definition: miarm.h:1222
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:778
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:323
ULONG MmVerifyDriverBufferLength
Definition: drvmgmt.c:24
PMMWSL MmSystemCacheWorkingSetList
Definition: mminit.c:175
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:2953
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:1551
PFN_NUMBER MiHighPagedPoolThreshold
Definition: mminit.c:304
PMMPTE MiSessionLastPte
Definition: mminit.c:147
FORCEINLINE VOID MI_ERASE_PTE(IN PMMPTE PointerPte)
Definition: miarm.h:1013
#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:144
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:341
FORCEINLINE VOID MI_WRITE_VALID_PDE(IN PMMPDE PointerPde, IN MMPDE TempPde)
Definition: miarm.h:1025
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:1201
struct _MMVIEW * PMMVIEW
PKEVENT MiLowNonPagedPoolEvent
Definition: mminit.c:297
FORCEINLINE VOID MiUnlockProcessWorkingSetUnsafe(IN PEPROCESS Process, IN PETHREAD Thread)
Definition: miarm.h:1246
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:294
PKEVENT MiLowMemoryEvent
Definition: mminit.c:293
struct _MI_LARGE_PAGE_DRIVER_ENTRY * PMI_LARGE_PAGE_DRIVER_ENTRY
ULONG MmProductType
Definition: mminit.c:326
VOID FASTCALL MiSyncARM3WithROS(IN PVOID AddressStart, IN PVOID AddressEnd)
FORCEINLINE VOID MiReferenceUnusedPageAndBumpLockCount(IN PMMPFN Pfn1)
Definition: miarm.h:1794
_MI_PFN_CACHE_ATTRIBUTE
Definition: miarm.h:413
@ MiWriteCombined
Definition: miarm.h:416
@ MiCached
Definition: miarm.h:415
@ MiNotMapped
Definition: miarm.h:417
@ MiNonCached
Definition: miarm.h:414
FORCEINLINE VOID MI_WRITE_INVALID_PTE(IN PMMPTE PointerPte, IN MMPTE InvalidPte)
Definition: miarm.h:1000
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:1614
FORCEINLINE VOID MiUnlockWorkingSet(IN PETHREAD Thread, IN PMMSUPPORT WorkingSet)
Definition: miarm.h:1358
VOID NTAPI MiMakePdeExistAndMakeValid(IN PMMPDE PointerPde, IN PEPROCESS TargetProcess, IN KIRQL OldIrql)
Definition: virtual.c:2446
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:1622
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:4608
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:584
FORCEINLINE VOID MiReferenceProbedPageAndBumpLockCount(IN PMMPFN Pfn1)
Definition: miarm.h:1694
MMPTE PrototypePte
Definition: init.c:40
PSUBSECTION NTAPI MiLocateSubsection(IN PMMVAD Vad, IN ULONG_PTR Vpn)
Definition: section.c:558
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:927
POOL_DESCRIPTOR NonPagedPoolDescriptor
Definition: expool.c:42
FORCEINLINE BOOLEAN MM_ANY_WS_LOCK_HELD(IN PETHREAD Thread)
Definition: miarm.h:1059
#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
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:245
PVOID MiSystemViewStart
Definition: miarm.h:647
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:593
VOID NTAPI MiMapPfnDatabase(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
Definition: mminit.c:664
FORCEINLINE BOOLEAN MiIsMemoryTypeFree(TYPE_OF_MEMORY MemoryType)
Definition: miarm.h:673
VOID NTAPI MiDeleteVirtualAddresses(_In_ ULONG_PTR Va, _In_ ULONG_PTR EndingAddress, _In_opt_ PMMVAD Vad)
Definition: virtual.c:530
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:305
FORCEINLINE VOID MiLockWorkingSetShared(_In_ PETHREAD Thread, _In_ PMMSUPPORT WorkingSet)
Definition: miarm.h:1313
MMSUPPORT MmSystemCacheWs
Definition: init.c:55
FORCEINLINE VOID MI_WRITE_INVALID_PDE(IN PMMPDE PointerPde, IN MMPDE InvalidPde)
Definition: miarm.h:1042
PFN_NUMBER MiHighNonPagedPoolThreshold
Definition: mminit.c:306
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:263
#define MM_PROTECT_SPECIAL
Definition: miarm.h:59
VOID NTAPI MiComputeColorInformation(VOID)
Definition: mminit.c:500
FORCEINLINE VOID MI_MAKE_HARDWARE_PTE(IN PMMPTE NewPte, IN PMMPTE MappingPte, IN ULONG_PTR ProtectionMask, IN PFN_NUMBER PageFrameNumber)
Definition: miarm.h:813
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:815
PKEVENT MiHighPagedPoolEvent
Definition: mminit.c:296
FORCEINLINE BOOLEAN MI_WS_OWNER(IN PEPROCESS Process)
Definition: miarm.h:1084
FORCEINLINE BOOLEAN MiIsUserPde(PVOID Address)
Definition: miarm.h:722
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:985
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:1435
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:496
FORCEINLINE VOID MI_MAKE_TRANSITION_PTE(_Out_ PMMPTE NewPte, _In_ PFN_NUMBER Page, _In_ ULONG Protection)
Definition: miarm.h:937
FORCEINLINE VOID MI_WRITE_VALID_PTE(IN PMMPTE PointerPte, IN MMPTE TempPte)
Definition: miarm.h:967
FORCEINLINE VOID MiDropLockCount(IN PMMPFN Pfn1)
Definition: miarm.h:1592
PMMPTE MmFirstReservedMappingPte
Definition: hypermap.c:20
FORCEINLINE ULONG_PTR MiDetermineUserGlobalPteMask(IN PVOID PointerPte)
Definition: miarm.h:741
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:353
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:295
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:157
PFN_NUMBER MmSizeOfPagedPoolInPages
Definition: mminit.c:112
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:389
#define MM_PROTECT_ACCESS
Definition: miarm.h:51
PVOID MiSessionSpaceWs
Definition: mminit.c:131
struct _MMSESSION * PMMSESSION
PMMADDRESS_NODE NTAPI MiGetNextNode(IN PMMADDRESS_NODE Node)
Definition: vadnode.c:461
VOID NTAPI MiInsertVad(_Inout_ PMMVAD Vad, _Inout_ PMM_AVL_TABLE VadRoot)
NTSTATUS NTAPI MiRosUnmapViewOfSection(_In_ PEPROCESS Process, _In_ PMEMORY_AREA MemoryArea, _In_ PVOID BaseAddress, _In_ BOOLEAN SkipDebuggerNotify)
Definition: section.c:3626
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:1581
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:590
MMPDE ValidKernelPde
Definition: init.c:28
FORCEINLINE VOID MiLockProcessWorkingSet(IN PEPROCESS Process, IN PETHREAD Thread)
Definition: miarm.h:1131
PMMCOLOR_TABLES MmFreePagesByColor[FreePageList+1]
Definition: mminit.c:287
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:302
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)
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:3528
PKEVENT MiHighNonPagedPoolEvent
Definition: mminit.c:298
PFN_NUMBER MmSystemPageDirectory[PPE_PER_PAGE]
Definition: init.c:40
FORCEINLINE VOID MiLockProcessWorkingSetUnsafe(IN PEPROCESS Process, IN PETHREAD Thread)
Definition: miarm.h:1176
PVOID MmPagedPoolEnd
Definition: miarm.h:580
FORCEINLINE VOID MiUnlockWorkingSetShared(_In_ PETHREAD Thread, _In_ PMMSUPPORT WorkingSet)
Definition: miarm.h:1396
ULONG MmCritsectTimeoutSeconds
Definition: mminit.c:388
#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:2486
_In_ PMEMORY_AREA MemoryArea
Definition: newmm.h:207
#define _Inout_
Definition: no_sal2.h:162
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#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 MiAddressToPde(x)
Definition: mm.h:156
#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
FORCEINLINE PMMPFN MiGetPfnEntry(IN PFN_NUMBER Pfn)
Definition: mm.h:1046
FORCEINLINE PFN_NUMBER MiGetPfnEntryIndex(IN PMMPFN Pfn1)
Definition: mm.h:1066
PMMPFN MmPfnDatabase
Definition: freelist.c:24
_In_ PVOID _Out_opt_ BOOLEAN _Out_opt_ PPFN_NUMBER Page
Definition: mm.h:1305
_Out_ PKAPC_STATE ApcState
Definition: mm.h:1769
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:295
@ LoaderFirmwareTemporary
Definition: arc.h:298
@ LoaderLoadedProgram
Definition: arc.h:297
@ LoaderHALCachedMemory
Definition: arc.h:319
@ LoaderFirmwarePermanent
Definition: arc.h:299
@ LoaderOsloaderStack
Definition: arc.h:301
@ LoaderSpecialMemory
Definition: arc.h:315
@ LoaderBBTMemory
Definition: arc.h:316
enum _TYPE_OF_MEMORY TYPE_OF_MEMORY
#define KeMemoryBarrierWithoutFence()
Definition: ke.h:66
#define PXE_SELFMAP
ULONG * PPFN_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:1314
ULONG OwnsSessionWorkingSetShared
Definition: pstypes.h:1315
ULONG OwnsSystemWorkingSetShared
Definition: pstypes.h:1313
ULONG OwnsProcessWorkingSetShared
Definition: pstypes.h:1311
ULONG OwnsProcessWorkingSetExclusive
Definition: pstypes.h:1310
ULONG OwnsSystemWorkingSetExclusive
Definition: pstypes.h:1312
ULONG PageFrameNumber
Definition: mmtypes.h:109
Definition: btrfs_drv.h:1876
Definition: typedefs.h:120
Definition: miarm.h:400
LIST_ENTRY Links
Definition: miarm.h:401
UNICODE_STRING BaseName
Definition: miarm.h:402
PFN_NUMBER LastFrame
Definition: miarm.h:443
PFN_NUMBER StartFrame
Definition: miarm.h:442
PFN_NUMBER Count
Definition: miarm.h:437
PVOID Blink
Definition: miarm.h:436
PFN_NUMBER Flink
Definition: miarm.h:435
Definition: mm.h:461
Definition: mm.h:390
MMPTE OriginalPte
Definition: mm.h:426
ULONG64 LargePage
Definition: mmtypes.h:165
ULONG64 Valid
Definition: mmtypes.h:150
ULONG64 UsedPageTableEntries
Definition: mmtypes.h:91
union _MMPTE::@2499 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:460
ULONG SystemSpaceHashEntries
Definition: miarm.h:459
ULONG BitmapFailures
Definition: miarm.h:461
PKGUARDED_MUTEX SystemSpaceViewLockPointer
Definition: miarm.h:455
PRTL_BITMAP SystemSpaceBitMap
Definition: miarm.h:462
PCHAR SystemSpaceViewStart
Definition: miarm.h:456
ULONG SystemSpaceHashSize
Definition: miarm.h:458
PMMVIEW SystemSpaceViewTable
Definition: miarm.h:457
KGUARDED_MUTEX SystemSpaceViewLock
Definition: miarm.h:454
ULONG SessionSpace
Definition: mmtypes.h:905
EX_PUSH_LOCK WorkingSetMutex
Definition: mmtypes.h:961
MMSUPPORT_FLAGS Flags
Definition: mmtypes.h:933
Definition: miarm.h:447
PCONTROL_AREA ControlArea
Definition: miarm.h:449
ULONG_PTR Entry
Definition: miarm.h:448
USHORT UsedPageTableEntries[768]
Definition: mmtypes.h:886
ULONG SessionId
Definition: miarm.h:481
ULONG LongFlags
Definition: miarm.h:478
PFN_NUMBER SessionPageDirectoryIndex
Definition: miarm.h:484
PMMPDE PageTables
Definition: miarm.h:511
LONG ResidentProcessCount
Definition: miarm.h:491
KGUARDED_MUTEX PagedPoolMutex
Definition: miarm.h:502
LARGE_INTEGER LastProcessSwappedOutTime
Definition: miarm.h:483
PVOID PagedPoolStart
Definition: miarm.h:487
MM_PAGED_POOL_INFO PagedPoolInfo
Definition: miarm.h:503
struct _MM_SESSION_SPACE * GlobalVirtualAddress
Definition: miarm.h:474
MM_SESSION_SPACE_FLAGS Flags
Definition: miarm.h:479
ULONG SessionPoolAllocationFailures[4]
Definition: miarm.h:492
PVOID PagedPoolEnd
Definition: miarm.h:488
MMSESSION Session
Definition: miarm.h:501
LONG ImageLoadingCount
Definition: miarm.h:520
LONG ProcessReferenceToSession
Definition: miarm.h:498
ULONG AttachCount
Definition: miarm.h:495
union _MM_SESSION_SPACE::@1953 u
KEVENT AttachEvent
Definition: miarm.h:496
MMSUPPORT Vm
Definition: miarm.h:504
SIZE_T CommittedPages
Definition: miarm.h:486
LIST_ENTRY WsListEntry
Definition: miarm.h:499
LIST_ENTRY ProcessList
Definition: miarm.h:482
SIZE_T NonPageablePages
Definition: miarm.h:485
POOL_DESCRIPTOR PagedPool
Definition: miarm.h:507
LONG ReferenceCount
Definition: miarm.h:475
PEPROCESS LastProcess
Definition: miarm.h:497
PMMWSLE Wsle
Definition: miarm.h:505
PDRIVER_UNLOAD Win32KDriverUnload
Definition: miarm.h:506
LIST_ENTRY ImageList
Definition: miarm.h:493
PMMPDE PagedPoolBasePde
Definition: miarm.h:489
PFN_NUMBER NumberOfPages
Definition: miarm.h:429
PFN_NUMBER PageCount
Definition: miarm.h:423
PFN_NUMBER BasePage
Definition: miarm.h:422
LIST_ENTRY ListHeads[POOL_LISTS_PER_PAGE]
Definition: miarm.h:327
POOL_TYPE PoolType
Definition: miarm.h:315
ULONG Threshold
Definition: miarm.h:321
ULONG RunningAllocs
Definition: miarm.h:317
ULONG TotalPages
Definition: miarm.h:319
SIZE_T TotalBytes
Definition: miarm.h:325
LONG PendingFreeDepth
Definition: miarm.h:324
ULONG PoolIndex
Definition: miarm.h:316
PVOID PendingFrees
Definition: miarm.h:323
ULONG RunningDeAllocs
Definition: miarm.h:318
SIZE_T Spare0
Definition: miarm.h:326
ULONG TotalBigPages
Definition: miarm.h:320
PVOID LockAddress
Definition: miarm.h:322
USHORT AllocatorBackTraceIndex
USHORT PreviousSize
LONG NonPagedAllocs
Definition: miarm.h:374
SIZE_T NonPagedBytes
Definition: miarm.h:376
LONG NonPagedFrees
Definition: miarm.h:375
SIZE_T PagedBytes
Definition: miarm.h:379
Definition: bidi.c:434
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:3821
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_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:2255
_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