ReactOS 0.4.16-dev-2104-gb84fa49
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];
562extern PVOID MmPagedPoolEnd;
563extern PVOID MmSessionBase;
564extern SIZE_T MmSessionSize;
609extern ULONG MmProductType;
647extern PVOID MiSessionPoolEnd; // 0xBE000000
648extern PVOID MiSessionPoolStart; // 0xBD000000
649extern PVOID MiSessionViewStart; // 0xBE000000
662
666{
667 return (WorkingSet != &MmSystemCacheWs) && !WorkingSet->Flags.SessionSpace;
668}
669
673{
674 return ((MemoryType == LoaderFree) ||
675 (MemoryType == LoaderLoadedProgram) ||
676 (MemoryType == LoaderFirmwareTemporary) ||
677 (MemoryType == LoaderOsloaderStack));
678}
679
683{
684 return ((MemoryType == LoaderFirmwarePermanent) ||
685 (MemoryType == LoaderSpecialMemory) ||
686 (MemoryType == LoaderHALCachedMemory) ||
687 (MemoryType == LoaderBBTMemory));
688}
689
690#ifdef _M_AMD64
693MiIsUserPxe(PVOID Address)
694{
695 return ((ULONG_PTR)Address >> 7) == 0x1FFFFEDF6FB7DA0ULL;
696}
697
700MiIsUserPpe(PVOID Address)
701{
702 return ((ULONG_PTR)Address >> 16) == 0xFFFFF6FB7DA0ULL;
703}
704
708{
709 return ((ULONG_PTR)Address >> 25) == 0x7FFFFB7DA0ULL;
710}
711
715{
716 return ((ULONG_PTR)Address >> 34) == 0x3FFFFDA0ULL;
717}
718#else
722{
723 return ((Address >= (PVOID)MiAddressToPde(NULL)) &&
725}
726
730{
731 return (Address >= (PVOID)PTE_BASE) && (Address <= (PVOID)MiHighestUserPte);
732}
733#endif
734
735//
736// Figures out the hardware bits for a PTE
737//
741{
743
744 /* Start fresh */
745 TempPte.u.Long = 0;
746
747 /* Make it valid and accessed */
748 TempPte.u.Hard.Valid = TRUE;
750
751 /* Is this for user-mode? */
752 if (
753#if (_MI_PAGING_LEVELS == 4)
754 MiIsUserPxe(PointerPte) ||
755#endif
756#if (_MI_PAGING_LEVELS >= 3)
757 MiIsUserPpe(PointerPte) ||
758#endif
759 MiIsUserPde(PointerPte) ||
760 MiIsUserPte(PointerPte))
761 {
762 /* Set the owner bit */
764 }
765
766 /* FIXME: We should also set the global bit */
767
768 /* Return the protection */
769 return TempPte.u.Long;
770}
771
772//
773// Creates a valid kernel PTE with the given protection
774//
776VOID
778 IN PMMPTE MappingPte,
779 IN ULONG_PTR ProtectionMask,
780 IN PFN_NUMBER PageFrameNumber)
781{
782 /* Only valid for kernel, non-session PTEs */
783 ASSERT(MappingPte > MiHighestUserPte);
784 ASSERT(!MI_IS_SESSION_PTE(MappingPte));
785 ASSERT((MappingPte < (PMMPTE)PDE_BASE) || (MappingPte > (PMMPTE)PDE_TOP));
786
787 /* Check that we are not setting valid a page that should not be */
788 ASSERT(ProtectionMask & MM_PROTECT_ACCESS);
789 ASSERT((ProtectionMask & MM_PROTECT_SPECIAL) != MM_GUARDPAGE);
790 ASSERT(ProtectionMask != MM_OUTSWAPPED_KSTACK && ((ProtectionMask & ~MM_OUTSWAPPED_KSTACK) == 0));
791
792 /* Start fresh */
793 NewPte->u.Long = 0;
794
795 /* Set the protection and page */
796 NewPte->u.Hard.PageFrameNumber = PageFrameNumber;
797 NewPte->u.Long |= MmProtectToPteMask[ProtectionMask];
798
799 /* Make this valid & global */
800#ifdef _GLOBAL_PAGES_ARE_AWESOME_
802 NewPte->u.Hard.Global = 1;
803#endif
804 NewPte->u.Hard.Valid = 1;
805}
806
807//
808// Creates a valid PTE with the given protection
809//
811VOID
813 IN PMMPTE MappingPte,
814 IN ULONG_PTR ProtectionMask,
815 IN PFN_NUMBER PageFrameNumber)
816{
817 /* Check that we are not setting valid a page that should not be */
818 ASSERT(ProtectionMask & MM_PROTECT_ACCESS);
819 ASSERT((ProtectionMask & MM_PROTECT_SPECIAL) != MM_GUARDPAGE);
820 ASSERT(ProtectionMask != MM_OUTSWAPPED_KSTACK && ((ProtectionMask & ~MM_OUTSWAPPED_KSTACK) == 0));
821
822 /* Set the protection and page */
823 NewPte->u.Long = MiDetermineUserGlobalPteMask(MappingPte);
824 NewPte->u.Long |= MmProtectToPteMask[ProtectionMask];
825 NewPte->u.Hard.PageFrameNumber = PageFrameNumber;
826}
827
828//
829// Creates a valid user PTE with the given protection
830//
832VOID
834 IN PMMPTE MappingPte,
835 IN ULONG_PTR ProtectionMask,
836 IN PFN_NUMBER PageFrameNumber)
837{
838 /* Only valid for kernel, non-session PTEs */
839 ASSERT(MappingPte <= MiHighestUserPte);
840
841 /* Start fresh */
842 NewPte->u.Long = 0;
843
844 /* Check that we are not setting valid a page that should not be */
845 ASSERT(ProtectionMask & MM_PROTECT_ACCESS);
846 ASSERT((ProtectionMask & MM_PROTECT_SPECIAL) != MM_GUARDPAGE);
847 ASSERT(ProtectionMask != MM_OUTSWAPPED_KSTACK && ((ProtectionMask & ~MM_OUTSWAPPED_KSTACK) == 0));
848
849 NewPte->u.Hard.Valid = TRUE;
850 NewPte->u.Hard.Owner = TRUE;
851 NewPte->u.Hard.PageFrameNumber = PageFrameNumber;
852 NewPte->u.Long |= MmProtectToPteMask[ProtectionMask];
853}
854
855#ifndef _M_AMD64
856//
857// Builds a Prototype PTE for the address of the PTE
858//
860VOID
862 IN PMMPTE PointerPte)
863{
865
866 /* Mark this as a prototype */
867 NewPte->u.Long = 0;
868 NewPte->u.Proto.Prototype = 1;
869
870 /*
871 * Prototype PTEs are only valid in paged pool by design, this little trick
872 * lets us only use 30 bits for the address of the PTE, as long as the area
873 * stays 1024MB At most.
874 */
876
877 /*
878 * 7 bits go in the "low" (but we assume the bottom 2 are zero)
879 * and the other 21 bits go in the "high"
880 */
881 NewPte->u.Proto.ProtoAddressLow = (Offset & 0x1FC) >> 2;
882 NewPte->u.Proto.ProtoAddressHigh = (Offset & 0x3FFFFE00) >> 9;
883}
884
885//
886// Builds a Subsection PTE for the address of the Segment
887//
889VOID
892{
894
895 /* Mark this as a prototype */
896 NewPte->u.Long = 0;
897 NewPte->u.Subsect.Prototype = 1;
898
899 /*
900 * Segments are only valid either in nonpaged pool. We store the 20 bit
901 * difference either from the top or bottom of nonpaged pool, giving a
902 * maximum of 128MB to each delta, meaning nonpaged pool cannot exceed
903 * 256MB.
904 */
905 if ((ULONG_PTR)Segment < ((ULONG_PTR)MmSubsectionBase + (128 * _1MB)))
906 {
908 NewPte->u.Subsect.WhichPool = PagedPool;
909 }
910 else
911 {
913 NewPte->u.Subsect.WhichPool = NonPagedPool;
914 }
915
916 /*
917 * 4 bits go in the "low" (but we assume the bottom 3 are zero)
918 * and the other 20 bits go in the "high"
919 */
920 NewPte->u.Subsect.SubsectionAddressLow = (Offset & 0x78) >> 3;
921 NewPte->u.Subsect.SubsectionAddressHigh = (Offset & 0xFFFFF80) >> 7;
922}
923
927{
929 return ((PointerPte->u.Long & 0xFFFFFC01) != 0);
930}
931
932#endif
933
935VOID
938 _In_ ULONG Protection)
939{
940 NewPte->u.Long = 0;
941 NewPte->u.Trans.Transition = 1;
942 NewPte->u.Trans.Protection = Protection;
943 NewPte->u.Trans.PageFrameNumber = Page;
944}
945
946//
947// Returns if the page is physically resident (ie: a large page)
948// FIXFIX: CISC/x86 only?
949//
953{
954 PMMPDE PointerPde;
955
956 /* Large pages are never paged out, always physically resident */
957 PointerPde = MiAddressToPde(Address);
958 return ((PointerPde->u.Hard.LargePage) && (PointerPde->u.Hard.Valid));
959}
960
961//
962// Writes a valid PTE
963//
965VOID
968{
969 /* Write the valid PTE */
970 ASSERT(PointerPte->u.Hard.Valid == 0);
971 ASSERT(TempPte.u.Hard.Valid == 1);
972#if _M_AMD64
974 (TempPte.u.Hard.NoExecute == 0));
975#endif
976 *PointerPte = TempPte;
977}
978
979//
980// Updates a valid PTE
981//
983VOID
986{
987 /* Write the valid PTE */
988 ASSERT(PointerPte->u.Hard.Valid == 1);
989 ASSERT(TempPte.u.Hard.Valid == 1);
990 ASSERT(PointerPte->u.Hard.PageFrameNumber == TempPte.u.Hard.PageFrameNumber);
991 *PointerPte = TempPte;
992}
993
994//
995// Writes an invalid PTE
996//
998VOID
1000 IN MMPTE InvalidPte)
1001{
1002 /* Write the invalid PTE */
1003 ASSERT(InvalidPte.u.Hard.Valid == 0);
1004 *PointerPte = InvalidPte;
1005}
1006
1007//
1008// Erase the PTE completely
1009//
1011VOID
1013{
1014 /* Zero out the PTE */
1015 ASSERT(PointerPte->u.Long != 0);
1016 PointerPte->u.Long = 0;
1017}
1018
1019//
1020// Writes a valid PDE
1021//
1023VOID
1026{
1027 /* Write the valid PDE */
1028 ASSERT(PointerPde->u.Hard.Valid == 0);
1029#ifdef _M_AMD64
1030 ASSERT(PointerPde->u.Hard.NoExecute == 0);
1031#endif
1032 ASSERT(TempPde.u.Hard.Valid == 1);
1033 *PointerPde = TempPde;
1034}
1035
1036//
1037// Writes an invalid PDE
1038//
1040VOID
1042 IN MMPDE InvalidPde)
1043{
1044 /* Write the invalid PDE */
1045 ASSERT(InvalidPde.u.Hard.Valid == 0);
1046 ASSERT(InvalidPde.u.Long != 0);
1047#ifdef _M_AMD64
1048 ASSERT(InvalidPde.u.Soft.Protection == MM_EXECUTE_READWRITE);
1049#endif
1050 *PointerPde = InvalidPde;
1051}
1052
1053//
1054// Checks if the thread already owns a working set
1055//
1057BOOLEAN
1059{
1060 /* If any of these are held, return TRUE */
1067}
1068
1070BOOLEAN
1072{
1076}
1077
1078//
1079// Checks if the process owns the working set lock
1080//
1082BOOLEAN
1084{
1085 /* Check if this process is the owner, and that the thread owns the WS */
1086 if (PsGetCurrentThread()->OwnsProcessWorkingSetExclusive == 0)
1087 {
1088 DPRINT("Thread: %p is not an owner\n", PsGetCurrentThread());
1089 }
1090 if (KeGetCurrentThread()->ApcState.Process != &Process->Pcb)
1091 {
1092 DPRINT("Current thread %p is attached to another process %p\n", PsGetCurrentThread(), Process);
1093 }
1094 return ((KeGetCurrentThread()->ApcState.Process == &Process->Pcb) &&
1095 ((PsGetCurrentThread()->OwnsProcessWorkingSetExclusive) ||
1096 (PsGetCurrentThread()->OwnsProcessWorkingSetShared)));
1097}
1098
1099//
1100// New ARM3<->RosMM PAGE Architecture
1101//
1103BOOLEAN
1105{
1106 return Section->u.Flags.filler;
1107}
1108
1109#define MI_IS_ROS_PFN(x) ((x)->u4.AweAllocation == TRUE)
1110
1111VOID
1112NTAPI
1114 IN PMMPFN Pfn1,
1115 IN PFN_NUMBER PageFrameIndex
1116);
1117
1119BOOLEAN
1121{
1122 return (Process->Vm.Flags.AcquiredUnsafe == TRUE);
1123}
1124
1125//
1126// Locks the working set for the given process
1127//
1129VOID
1132{
1133 /* Shouldn't already be owning the process working set */
1136
1137 /* Block APCs, make sure that still nothing is already held */
1140
1141 /* Lock the working set */
1142 ExAcquirePushLockExclusive(&Process->Vm.WorkingSetMutex);
1143
1144 /* Now claim that we own the lock */
1148}
1149
1151VOID
1154{
1155 /* Shouldn't already be owning the process working set */
1158
1159 /* Block APCs, make sure that still nothing is already held */
1162
1163 /* Lock the working set */
1164 ExAcquirePushLockShared(&Process->Vm.WorkingSetMutex);
1165
1166 /* Now claim that we own the lock */
1171}
1172
1174VOID
1177{
1178 /* Shouldn't already be owning the process working set */
1180
1181 /* APCs must be blocked, make sure that still nothing is already held */
1184
1185 /* Lock the working set */
1186 ExAcquirePushLockExclusive(&Process->Vm.WorkingSetMutex);
1187
1188 /* Now claim that we own the lock */
1190 Process->Vm.Flags.AcquiredUnsafe = 1;
1193}
1194
1195//
1196// Unlocks the working set for the given process
1197//
1199VOID
1202{
1203 /* Make sure we are the owner of a safe acquisition */
1206
1207 /* The thread doesn't own it anymore */
1210
1211 /* Release the lock and re-enable APCs */
1212 ExReleasePushLockExclusive(&Process->Vm.WorkingSetMutex);
1214}
1215
1216//
1217// Unlocks the working set for the given process
1218//
1220VOID
1223{
1224 /* Make sure we are the owner of a safe acquisition (because shared) */
1227
1228 /* Ensure we are in a shared acquisition */
1231
1232 /* Don't claim the lock anylonger */
1234
1235 /* Release the lock and re-enable APCs */
1236 ExReleasePushLockShared(&Process->Vm.WorkingSetMutex);
1238}
1239
1240//
1241// Unlocks the working set for the given process
1242//
1244VOID
1247{
1248 /* Make sure we are the owner of an unsafe acquisition */
1253
1254 /* No longer unsafe */
1255 Process->Vm.Flags.AcquiredUnsafe = 0;
1256
1257 /* The thread doesn't own it anymore */
1260
1261 /* Release the lock but don't touch APC state */
1262 ExReleasePushLockExclusive(&Process->Vm.WorkingSetMutex);
1264}
1265
1266//
1267// Locks the working set
1268//
1270VOID
1272 IN PMMSUPPORT WorkingSet)
1273{
1274 /* Block APCs */
1276
1277 /* Working set should be in global memory */
1278 ASSERT(MI_IS_SESSION_ADDRESS((PVOID)WorkingSet) == FALSE);
1279
1280 /* Thread shouldn't already be owning something */
1282
1283 /* Lock this working set */
1284 ExAcquirePushLockExclusive(&WorkingSet->WorkingSetMutex);
1285
1286 /* Which working set is this? */
1287 if (WorkingSet == &MmSystemCacheWs)
1288 {
1289 /* Own the system working set */
1293 }
1294 else if (WorkingSet->Flags.SessionSpace)
1295 {
1296 /* Own the session working set */
1300 }
1301 else
1302 {
1303 /* Own the process working set */
1307 }
1308}
1309
1311VOID
1314 _In_ PMMSUPPORT WorkingSet)
1315{
1316 /* Block APCs */
1318
1319 /* Working set should be in global memory */
1320 ASSERT(MI_IS_SESSION_ADDRESS((PVOID)WorkingSet) == FALSE);
1321
1322 /* Thread shouldn't already be owning something */
1324
1325 /* Lock this working set */
1326 ExAcquirePushLockShared(&WorkingSet->WorkingSetMutex);
1327
1328 /* Which working set is this? */
1329 if (WorkingSet == &MmSystemCacheWs)
1330 {
1331 /* Own the system working set */
1335 }
1336 else if (WorkingSet->Flags.SessionSpace)
1337 {
1338 /* Own the session working set */
1342 }
1343 else
1344 {
1345 /* Own the process working set */
1349 }
1350}
1351
1352//
1353// Unlocks the working set
1354//
1356VOID
1358 IN PMMSUPPORT WorkingSet)
1359{
1360 /* Working set should be in global memory */
1361 ASSERT(MI_IS_SESSION_ADDRESS((PVOID)WorkingSet) == FALSE);
1362
1363 /* Which working set is this? */
1364 if (WorkingSet == &MmSystemCacheWs)
1365 {
1366 /* Release the system working set */
1370 }
1371 else if (WorkingSet->Flags.SessionSpace)
1372 {
1373 /* Release the session working set */
1377 }
1378 else
1379 {
1380 /* Release the process working set */
1384 }
1385
1386 /* Release the working set lock */
1387 ExReleasePushLockExclusive(&WorkingSet->WorkingSetMutex);
1388
1389 /* Unblock APCs */
1391}
1392
1394VOID
1397 _In_ PMMSUPPORT WorkingSet)
1398{
1399 /* Working set should be in global memory */
1400 ASSERT(MI_IS_SESSION_ADDRESS((PVOID)WorkingSet) == FALSE);
1401
1402 /* Which working set is this? */
1403 if (WorkingSet == &MmSystemCacheWs)
1404 {
1405 /* Release the system working set */
1409 }
1410 else if (WorkingSet->Flags.SessionSpace)
1411 {
1412 /* Release the session working set */
1416 }
1417 else
1418 {
1419 /* Release the process working set */
1423 }
1424
1425 /* Release the working set lock */
1426 ExReleasePushLockShared(&WorkingSet->WorkingSetMutex);
1427
1428 /* Unblock APCs */
1430}
1431
1433BOOLEAN
1437{
1438 /* Sanity check: No exclusive lock. */
1442
1443 /* And it should have one and only one shared lock */
1445
1446 /* Try. */
1448 return FALSE;
1449
1450 if (Vm == &MmSystemCacheWs)
1451 {
1455 }
1456 else if (Vm->Flags.SessionSpace)
1457 {
1461 }
1462 else
1463 {
1467 }
1468
1469 return TRUE;
1470}
1471
1473VOID
1476 OUT PBOOLEAN Safe,
1477 OUT PBOOLEAN Shared)
1478{
1480
1481 /* Check if the current owner is unsafe */
1483 {
1484 /* Release unsafely */
1486 *Safe = FALSE;
1487 *Shared = FALSE;
1488 }
1490 {
1491 /* Owner is safe and exclusive, release normally */
1493 *Safe = TRUE;
1494 *Shared = FALSE;
1495 }
1496 else
1497 {
1498 /* Owner is shared (implies safe), release normally */
1500 *Safe = TRUE;
1501 *Shared = TRUE;
1502 }
1503}
1504
1506VOID
1509 IN BOOLEAN Safe,
1510 IN BOOLEAN Shared)
1511{
1512 /* Check if this was a safe lock or not */
1513 if (Safe)
1514 {
1515 if (Shared)
1516 {
1517 /* Reacquire safely & shared */
1519 }
1520 else
1521 {
1522 /* Reacquire safely */
1524 }
1525 }
1526 else
1527 {
1528 /* Unsafe lock cannot be shared */
1529 ASSERT(Shared == FALSE);
1530 /* Reacquire unsafely */
1532 }
1533}
1534
1536KIRQL
1538{
1539 KIRQL OldIrql;
1540
1545 return OldIrql;
1546}
1547
1549VOID
1551{
1556}
1557
1558//
1559// Returns the ProtoPTE inside a VAD for the given VPN
1560//
1562PMMPTE
1564 IN ULONG_PTR Vpn)
1565{
1566 PMMPTE ProtoPte;
1567
1568 /* Find the offset within the VAD's prototype PTEs */
1569 ProtoPte = Vad->FirstPrototypePte + (Vpn - Vad->StartingVpn);
1570 ASSERT(ProtoPte <= Vad->LastContiguousPte);
1571 return ProtoPte;
1572}
1573
1574//
1575// Returns the PFN Database entry for the given page number
1576// Warning: This is not necessarily a valid PFN database entry!
1577//
1579PMMPFN
1581{
1582 /* Get the entry */
1583 return &MmPfnDatabase[Pfn];
1584};
1585
1586//
1587// Drops a locked page without dereferencing it
1588//
1590VOID
1592{
1593 /* This page shouldn't be locked, but it should be valid */
1594 ASSERT(Pfn1->u3.e2.ReferenceCount != 0);
1595 ASSERT(Pfn1->u2.ShareCount == 0);
1596
1597 /* Is this the last reference to the page */
1598 if (Pfn1->u3.e2.ReferenceCount == 1)
1599 {
1600 /* It better not be valid */
1601 ASSERT(Pfn1->u3.e1.PageLocation != ActiveAndValid);
1602
1603 /* Is it a prototype PTE? */
1604 if ((Pfn1->u3.e1.PrototypePte == 1) &&
1605 (Pfn1->OriginalPte.u.Soft.Prototype == 1))
1606 {
1607 /* FIXME: We should return commit */
1608 DPRINT1("Not returning commit for prototype PTE\n");
1609 }
1610
1611 /* Update the counter */
1613 }
1614}
1615
1616//
1617// Drops a locked page and dereferences it
1618//
1620VOID
1622{
1623 USHORT RefCount, OldRefCount;
1624 PFN_NUMBER PageFrameIndex;
1625
1626 /* Loop while we decrement the page successfully */
1627 do
1628 {
1629 /* There should be at least one reference */
1630 OldRefCount = Pfn1->u3.e2.ReferenceCount;
1631 ASSERT(OldRefCount != 0);
1632
1633 /* Are we the last one */
1634 if (OldRefCount == 1)
1635 {
1636 /* The page shoudln't be shared not active at this point */
1637 ASSERT(Pfn1->u3.e2.ReferenceCount == 1);
1638 ASSERT(Pfn1->u3.e1.PageLocation != ActiveAndValid);
1639 ASSERT(Pfn1->u2.ShareCount == 0);
1640
1641 /* Is it a prototype PTE? */
1642 if ((Pfn1->u3.e1.PrototypePte == 1) &&
1643 (Pfn1->OriginalPte.u.Soft.Prototype == 1))
1644 {
1645 /* FIXME: We should return commit */
1646 DPRINT1("Not returning commit for prototype PTE\n");
1647 }
1648
1649 /* Update the counter, and drop a reference the long way */
1651 PageFrameIndex = MiGetPfnEntryIndex(Pfn1);
1652 MiDecrementReferenceCount(Pfn1, PageFrameIndex);
1653 return;
1654 }
1655
1656 /* Drop a reference the short way, and that's it */
1657 RefCount = InterlockedCompareExchange16((PSHORT)&Pfn1->u3.e2.ReferenceCount,
1658 OldRefCount - 1,
1659 OldRefCount);
1660 ASSERT(RefCount != 0);
1661 } while (OldRefCount != RefCount);
1662
1663 /* If we got here, there should be more than one reference */
1664 ASSERT(RefCount > 1);
1665 if (RefCount == 2)
1666 {
1667 /* Is it still being shared? */
1668 if (Pfn1->u2.ShareCount >= 1)
1669 {
1670 /* Then it should be valid */
1671 ASSERT(Pfn1->u3.e1.PageLocation == ActiveAndValid);
1672
1673 /* Is it a prototype PTE? */
1674 if ((Pfn1->u3.e1.PrototypePte == 1) &&
1675 (Pfn1->OriginalPte.u.Soft.Prototype == 1))
1676 {
1677 /* We don't handle ethis */
1678 ASSERT(FALSE);
1679 }
1680
1681 /* Update the counter */
1683 }
1684 }
1685}
1686
1687//
1688// References a locked page and updates the counter
1689// Used in MmProbeAndLockPages to handle different edge cases
1690//
1692VOID
1694{
1695 USHORT RefCount, OldRefCount;
1696
1697 /* Sanity check */
1698 ASSERT(Pfn1->u3.e2.ReferenceCount != 0);
1699
1700 /* Does ARM3 own the page? */
1701 if (MI_IS_ROS_PFN(Pfn1))
1702 {
1703 /* ReactOS Mm doesn't track share count */
1704 ASSERT(Pfn1->u3.e1.PageLocation == ActiveAndValid);
1705 }
1706 else
1707 {
1708 /* On ARM3 pages, we should see a valid share count */
1709 ASSERT((Pfn1->u2.ShareCount != 0) && (Pfn1->u3.e1.PageLocation == ActiveAndValid));
1710
1711 /* Is it a prototype PTE? */
1712 if ((Pfn1->u3.e1.PrototypePte == 1) &&
1713 (Pfn1->OriginalPte.u.Soft.Prototype == 1))
1714 {
1715 /* FIXME: We should charge commit */
1716 DPRINT1("Not charging commit for prototype PTE\n");
1717 }
1718 }
1719
1720 /* More locked pages! */
1722
1723 /* Loop trying to update the reference count */
1724 do
1725 {
1726 /* Get the current reference count, make sure it's valid */
1727 OldRefCount = Pfn1->u3.e2.ReferenceCount;
1728 ASSERT(OldRefCount != 0);
1729 ASSERT(OldRefCount < 2500);
1730
1731 /* Bump it up by one */
1732 RefCount = InterlockedCompareExchange16((PSHORT)&Pfn1->u3.e2.ReferenceCount,
1733 OldRefCount + 1,
1734 OldRefCount);
1735 ASSERT(RefCount != 0);
1736 } while (OldRefCount != RefCount);
1737
1738 /* Was this the first lock attempt? If not, undo our bump */
1739 if (OldRefCount != 1) InterlockedDecrementSizeT(&MmSystemLockPagesCount);
1740}
1741
1742//
1743// References a locked page and updates the counter
1744// Used in all other cases except MmProbeAndLockPages
1745//
1747VOID
1749{
1750 USHORT NewRefCount;
1751
1752 /* Is it a prototype PTE? */
1753 if ((Pfn1->u3.e1.PrototypePte == 1) &&
1754 (Pfn1->OriginalPte.u.Soft.Prototype == 1))
1755 {
1756 /* FIXME: We should charge commit */
1757 DPRINT1("Not charging commit for prototype PTE\n");
1758 }
1759
1760 /* More locked pages! */
1762
1763 /* Update the reference count */
1764 NewRefCount = InterlockedIncrement16((PSHORT)&Pfn1->u3.e2.ReferenceCount);
1765 if (NewRefCount == 2)
1766 {
1767 /* Is it locked or shared? */
1768 if (Pfn1->u2.ShareCount)
1769 {
1770 /* It's shared, so make sure it's active */
1771 ASSERT(Pfn1->u3.e1.PageLocation == ActiveAndValid);
1772 }
1773 else
1774 {
1775 /* It's locked, so we shouldn't lock again */
1777 }
1778 }
1779 else
1780 {
1781 /* Someone had already locked the page, so undo our bump */
1782 ASSERT(NewRefCount < 2500);
1784 }
1785}
1786
1787//
1788// References a locked page and updates the counter
1789// Used in all other cases except MmProbeAndLockPages
1790//
1792VOID
1794{
1795 USHORT NewRefCount;
1796
1797 /* Make sure the page isn't used yet */
1798 ASSERT(Pfn1->u2.ShareCount == 0);
1799 ASSERT(Pfn1->u3.e1.PageLocation != ActiveAndValid);
1800
1801 /* Is it a prototype PTE? */
1802 if ((Pfn1->u3.e1.PrototypePte == 1) &&
1803 (Pfn1->OriginalPte.u.Soft.Prototype == 1))
1804 {
1805 /* FIXME: We should charge commit */
1806 DPRINT1("Not charging commit for prototype PTE\n");
1807 }
1808
1809 /* More locked pages! */
1811
1812 /* Update the reference count */
1813 NewRefCount = InterlockedIncrement16((PSHORT)&Pfn1->u3.e2.ReferenceCount);
1814 if (NewRefCount != 1)
1815 {
1816 /* Someone had already locked the page, so undo our bump */
1817 ASSERT(NewRefCount < 2500);
1819 }
1820}
1821
1822
1823
1824CODE_SEG("INIT")
1825BOOLEAN
1826NTAPI
1828 IN ULONG Phase,
1829 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1830);
1831
1832CODE_SEG("INIT")
1833VOID
1834NTAPI
1836
1837CODE_SEG("INIT")
1839NTAPI
1841 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1842);
1843
1844CODE_SEG("INIT")
1845VOID
1846NTAPI
1848 VOID
1849);
1850
1851CODE_SEG("INIT")
1852VOID
1853NTAPI
1855 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1856);
1857
1858CODE_SEG("INIT")
1859VOID
1860NTAPI
1862 VOID
1863);
1864
1865CODE_SEG("INIT")
1866VOID
1867NTAPI
1869 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1870);
1871
1872VOID
1873NTAPI
1875 VOID
1876);
1877
1878VOID
1879NTAPI
1881 VOID
1882);
1883
1884CODE_SEG("INIT")
1885BOOLEAN
1886NTAPI
1888 VOID
1889);
1890
1891CODE_SEG("INIT")
1893NTAPI
1895 IN PFN_NUMBER PageCount
1896);
1897
1898CODE_SEG("INIT")
1900NTAPI
1902 IN PLOADER_PARAMETER_BLOCK LoaderBlock,
1903 IN PBOOLEAN IncludeType
1904);
1905
1907NTAPI
1909 IN PLOADER_PARAMETER_BLOCK LoaderBlock,
1910 IN PBOOLEAN IncludeType
1911);
1912
1913VOID
1916 IN PVOID AddressStart,
1917 IN PVOID AddressEnd
1918);
1919
1921NTAPI
1925 IN OUT PSIZE_T NumberOfBytesToProtect,
1926 IN ULONG NewAccessProtection,
1927 OUT PULONG OldAccessProtection OPTIONAL
1928);
1929
1931NTAPI
1933 IN ULONG FaultCode,
1936 IN PVOID TrapInformation
1937);
1938
1943);
1944
1945CODE_SEG("INIT")
1946VOID
1947NTAPI
1949 VOID
1950);
1951
1952CODE_SEG("INIT")
1953VOID
1954NTAPI
1956 VOID
1957);
1958
1959CODE_SEG("INIT")
1960VOID //
1961NTAPI //
1963 IN POOL_TYPE PoolType,// FIXFIX: This should go in ex.h after the pool merge
1964 IN ULONG Threshold //
1965); //
1966
1967// FIXFIX: THIS ONE TOO
1968CODE_SEG("INIT")
1969VOID
1970NTAPI
1972 IN PPOOL_DESCRIPTOR PoolDescriptor,
1974 IN ULONG PoolIndex,
1975 IN ULONG Threshold,
1976 IN PVOID PoolLock
1977);
1978
1980NTAPI
1982 VOID
1983);
1984
1985CODE_SEG("INIT")
1986VOID
1987NTAPI
1989 IN PMMPTE StartingPte,
1990 IN ULONG NumberOfPtes,
1992);
1993
1994PMMPTE
1995NTAPI
1997 IN ULONG NumberOfPtes,
1998 IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType
1999);
2000
2001VOID
2002NTAPI
2004 IN PMMPTE StartingPte,
2005 IN ULONG NumberOfPtes,
2006 IN MMSYSTEM_PTE_POOL_TYPE SystemPtePoolType
2007);
2008
2009
2011NTAPI
2013 IN PFN_NUMBER LowestPfn,
2014 IN PFN_NUMBER HighestPfn,
2015 IN PFN_NUMBER BoundaryPfn,
2016 IN PFN_NUMBER SizeInPages,
2018);
2019
2020PVOID
2021NTAPI
2024 IN PFN_NUMBER BaseAddressPages,
2025 IN PFN_NUMBER SizeInPages,
2026 IN PFN_NUMBER LowestPfn,
2027 IN PFN_NUMBER HighestPfn,
2028 IN PFN_NUMBER BoundaryPfn,
2029 IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute
2030);
2031
2032PMDL
2033NTAPI
2035 IN PHYSICAL_ADDRESS LowAddress,
2039 IN MI_PFN_CACHE_ATTRIBUTE CacheAttribute,
2040 IN ULONG Flags
2041);
2042
2043VOID
2044NTAPI
2046 IN PMMPFNLIST ListHead,
2047 IN PFN_NUMBER PageFrameIndex
2048);
2049
2050VOID
2051NTAPI
2054);
2055
2056VOID
2057NTAPI
2059 IN PMMPFN Pfn
2060);
2061
2062VOID
2063NTAPI
2065 IN PFN_NUMBER PageFrameIndex,
2066 IN PMMPTE PointerPte,
2067 IN BOOLEAN Modified
2068);
2069
2071NTAPI
2073 OUT PPFN_NUMBER PageFrameIndex,
2074 IN PMMPDE PointerPde,
2075 IN PFN_NUMBER ContainingPageFrame,
2076 IN BOOLEAN SessionAllocation
2077);
2078
2079VOID
2080NTAPI
2082 IN PFN_NUMBER PageFrameIndex,
2083 IN PMMPTE PointerPte,
2085);
2086
2087VOID
2088NTAPI
2090 IN PFN_NUMBER PageFrameIndex,
2091 IN PVOID PteAddress,
2092 IN PFN_NUMBER PteFrame
2093);
2094
2095VOID
2096NTAPI
2098 IN PMMPFN Pfn1,
2099 IN PFN_NUMBER PageFrameIndex
2100);
2101
2103NTAPI
2105 IN ULONG Color
2106);
2107
2109NTAPI
2111 IN ULONG Color
2112);
2113
2114VOID
2115NTAPI
2117 IN PFN_NUMBER PageFrameIndex
2118);
2119
2120VOID
2121NTAPI
2123 IN PFN_NUMBER PageFrameIndex
2124);
2125
2127NTAPI
2129 IN PMMPTE PointerPte,
2130 IN PFN_NUMBER PageCount,
2131 IN ULONG Flags,
2132 OUT PPFN_NUMBER ValidPages
2133);
2134
2135ULONG
2136NTAPI
2138 IN PMMPTE PointerPte
2139);
2140
2142NTAPI
2145);
2146
2147CODE_SEG("INIT")
2148VOID
2149NTAPI
2151 VOID
2152);
2153
2154CODE_SEG("INIT")
2155VOID
2156NTAPI
2158 VOID
2159);
2160
2161CODE_SEG("INIT")
2162VOID
2163NTAPI
2165 VOID
2166);
2167
2168BOOLEAN
2169NTAPI
2171 IN PMMPFN Pfn1
2172);
2173
2174PMMVAD
2175NTAPI
2179
2180PMMVAD
2181NTAPI
2184);
2185
2187NTAPI
2189 IN ULONG_PTR StartVpn,
2190 IN ULONG_PTR EndVpn,
2192 OUT PMMADDRESS_NODE *NodeOrParent
2193);
2194
2196NTAPI
2199 IN ULONG_PTR BoundaryAddress,
2204);
2205
2207NTAPI
2210 IN ULONG_PTR BoundaryAddress,
2214);
2215
2217NTAPI
2222 OUT PMMADDRESS_NODE *PreviousVad,
2224);
2225
2227NTAPI
2229 IN PMMVAD Vad,
2230 IN PVOID Base,
2231 IN SIZE_T Size,
2232 IN ULONG ProtectionMask
2233);
2234
2235VOID
2236NTAPI
2238 _Inout_ PMMVAD Vad,
2239 _Inout_ PMM_AVL_TABLE VadRoot);
2240
2242NTAPI
2244 _Inout_ PMMVAD Vad,
2247 _In_ ULONG_PTR HighestAddress,
2250
2251VOID
2252NTAPI
2254 IN PSECTION Section
2255);
2256
2258NTAPI
2263 _In_ BOOLEAN SkipDebuggerNotify);
2264
2265VOID
2266NTAPI
2269 IN PMMADDRESS_NODE NewNode,
2272);
2273
2274VOID
2275NTAPI
2279);
2280
2282NTAPI
2285);
2286
2288NTAPI
2291);
2292
2293BOOLEAN
2294NTAPI
2296 IN PMMSESSION InputSession OPTIONAL
2297);
2298
2299VOID
2300NTAPI
2302 VOID
2303);
2304
2305VOID
2306NTAPI
2308 IN PMM_SESSION_SPACE SessionGlobal
2309);
2310
2311VOID
2312NTAPI
2314 IN PEPROCESS NewProcess
2315);
2316
2317ULONG
2318NTAPI
2321);
2322
2323VOID
2324NTAPI
2326 _In_ ULONG_PTR Va,
2327 _In_ ULONG_PTR EndingAddress,
2328 _In_opt_ PMMVAD Vad
2329);
2330
2331VOID
2332NTAPI
2334 IN PMMPTE PointerPte,
2336 IN PEPROCESS CurrentProcess,
2338);
2339
2340ULONG
2341NTAPI
2343 IN PVOID PageTableVirtualAddress,
2344 IN PEPROCESS CurrentProcess
2345);
2346
2347ULONG
2348NTAPI
2352);
2353
2354VOID
2355NTAPI
2357 IN PEPROCESS CurrentProcess,
2358 IN PMMVAD Vad
2359);
2360
2362NTAPI
2364 IN PMMVAD Vad,
2365 IN ULONG_PTR Vpn
2366);
2367
2368VOID
2369NTAPI
2371 PVOID ObjectBody
2372);
2373
2375NTAPI
2379 OUT PVOID MemoryInformation,
2380 IN SIZE_T MemoryInformationLength,
2382);
2383
2385NTAPI
2388);
2389
2390VOID
2391NTAPI
2393 IN PMMPDE PointerPde,
2394 IN PEPROCESS TargetProcess,
2396);
2397
2398VOID
2399NTAPI
2401 _In_ PVOID ImageBase);
2402
2403//
2404// MiRemoveZeroPage will use inline code to zero out the page manually if only
2405// free pages are available. In some scenarios, we don't/can't run that piece of
2406// code and would rather only have a real zero page. If we can't have a zero page,
2407// then we'd like to have our own code to grab a free page and zero it out, by
2408// using MiRemoveAnyPage. This macro implements this.
2409//
2413{
2415 return 0;
2416}
2417
2418#if (_MI_PAGING_LEVELS == 2)
2420BOOLEAN
2421MiSynchronizeSystemPde(PMMPDE PointerPde)
2422{
2423 ULONG Index;
2424
2425 /* Get the Index from the PDE */
2426 Index = ((ULONG_PTR)PointerPde & (SYSTEM_PD_SIZE - 1)) / sizeof(MMPTE);
2427 if (PointerPde->u.Hard.Valid != 0)
2428 {
2429 NT_ASSERT(PointerPde->u.Long == MmSystemPagePtes[Index].u.Long);
2430 return TRUE;
2431 }
2432
2433 if (MmSystemPagePtes[Index].u.Hard.Valid == 0)
2434 {
2435 return FALSE;
2436 }
2437
2438 /* Copy the PDE from the double-mapped system page directory */
2440
2441 /* Make sure we re-read the PDE and PTE */
2443
2444 /* Return success */
2445 return TRUE;
2446}
2447#endif
2448
2449#if _MI_PAGING_LEVELS == 2
2451USHORT
2453{
2454 PUSHORT RefCount;
2455
2457
2458 *RefCount += 1;
2459 ASSERT(*RefCount <= PTE_PER_PAGE);
2460 return *RefCount;
2461}
2462
2464USHORT
2466{
2467 PUSHORT RefCount;
2468
2470
2471 *RefCount -= 1;
2472 ASSERT(*RefCount < PTE_PER_PAGE);
2473 return *RefCount;
2474}
2475#else
2477USHORT
2479{
2480 PMMPDE PointerPde = MiAddressToPde(Address);
2481 PMMPFN Pfn;
2482
2483 /* We should not tinker with this one. */
2484 ASSERT(PointerPde != (PMMPDE)PXE_SELFMAP);
2485 DPRINT("Incrementing %p from %p\n", Address, _ReturnAddress());
2486
2487 /* Make sure we're locked */
2488 ASSERT(PsGetCurrentThread()->OwnsProcessWorkingSetExclusive);
2489
2490 /* If we're bumping refcount, then it must be valid! */
2491 ASSERT(PointerPde->u.Hard.Valid == 1);
2492
2493 /* This lies on the PFN */
2494 Pfn = MiGetPfnEntry(PFN_FROM_PDE(PointerPde));
2496
2498
2500}
2501
2503USHORT
2505{
2506 PMMPDE PointerPde = MiAddressToPde(Address);
2507 PMMPFN Pfn;
2508
2509 /* We should not tinker with this one. */
2510 ASSERT(PointerPde != (PMMPDE)PXE_SELFMAP);
2511
2512 DPRINT("Decrementing %p from %p\n", PointerPde, _ReturnAddress());
2513
2514 /* Make sure we're locked */
2515 ASSERT(PsGetCurrentThread()->OwnsProcessWorkingSetExclusive);
2516
2517 /* If we're decreasing refcount, then it must be valid! */
2518 ASSERT(PointerPde->u.Hard.Valid == 1);
2519
2520 /* This lies on the PFN */
2521 Pfn = MiGetPfnEntry(PFN_FROM_PDE(PointerPde));
2522
2525
2527
2529}
2530#endif
2531
2532#ifdef __cplusplus
2533} // extern "C"
2534#endif
2535
2537VOID
2539 _In_ PMMPDE PointerPde,
2540 _In_ PEPROCESS CurrentProcess)
2541{
2542 /* Only for user-mode ones */
2543 ASSERT(MiIsUserPde(PointerPde));
2544
2545 /* Kill this one as a PTE */
2546 MiDeletePte((PMMPTE)PointerPde, MiPdeToPte(PointerPde), CurrentProcess, NULL);
2547#if _MI_PAGING_LEVELS >= 3
2548 /* Cascade down */
2549 if (MiDecrementPageTableReferences(MiPdeToPte(PointerPde)) == 0)
2550 {
2551 MiDeletePte(MiPdeToPpe(PointerPde), PointerPde, CurrentProcess, NULL);
2552#if _MI_PAGING_LEVELS == 4
2553 if (MiDecrementPageTableReferences(PointerPde) == 0)
2554 {
2555 MiDeletePte(MiPdeToPxe(PointerPde), MiPdeToPpe(PointerPde), CurrentProcess, NULL);
2556 }
2557#endif
2558 }
2559#endif
2560}
2561
2562/* EOF */
#define CODE_SEG(...)
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG ReturnLength
ULONG_PTR PFN_NUMBER
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
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
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
FORCEINLINE VOID MI_MAKE_SUBSECTION_PTE(IN PMMPTE NewPte, IN PVOID Segment)
Definition: miarm.h:890
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:1109
ULONG MmMaximumNonPagedPoolPercent
Definition: init.c:20
FORCEINLINE KIRQL MiAcquireExpansionLock(VOID)
Definition: miarm.h:1537
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:1754
PFN_NUMBER MiNumberOfFreePages
Definition: mminit.c:384
PVOID MmNonPagedSystemStart
Definition: miarm.h:580
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:1563
PMMPTE MiSessionBasePte
Definition: mminit.c:145
FORCEINLINE BOOLEAN MM_ANY_WS_LOCK_HELD_EXCLUSIVE(_In_ PETHREAD Thread)
Definition: miarm.h:1071
FORCEINLINE BOOLEAN MI_IS_PHYSICAL_ADDRESS(IN PVOID Address)
Definition: miarm.h:952
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:1152
PMMPTE MmSystemPtesStart[MaximumPtePoolTypes]
Definition: syspte.c:22
FORCEINLINE BOOLEAN MiIsMemoryTypeInvisible(TYPE_OF_MEMORY MemoryType)
Definition: miarm.h:682
FORCEINLINE VOID MiDeletePde(_In_ PMMPDE PointerPde, _In_ PEPROCESS CurrentProcess)
Definition: miarm.h:2538
PMMPTE MmLastReservedMappingPte
Definition: miarm.h:565
PVOID MmPagedPoolStart
Definition: miarm.h:578
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:1271
FORCEINLINE VOID MI_MAKE_HARDWARE_PTE_USER(IN PMMPTE NewPte, IN PMMPTE MappingPte, IN ULONG_PTR ProtectionMask, IN PFN_NUMBER PageFrameNumber)
Definition: miarm.h:833
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: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:1474
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:1120
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:1104
#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:1507
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: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:665
#define POOL_LISTS_PER_PAGE
Definition: miarm.h:275
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:861
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:1748
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: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: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: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: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
#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:729
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:1221
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:777
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:2951
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:1550
PFN_NUMBER MiHighPagedPoolThreshold
Definition: mminit.c:303
PMMPTE MiSessionLastPte
Definition: mminit.c:146
FORCEINLINE VOID MI_ERASE_PTE(IN PMMPTE PointerPte)
Definition: miarm.h:1012
#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:2504
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:1024
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:1200
struct _MMVIEW * PMMVIEW
PKEVENT MiLowNonPagedPoolEvent
Definition: mminit.c:296
FORCEINLINE VOID MiUnlockProcessWorkingSetUnsafe(IN PEPROCESS Process, IN PETHREAD Thread)
Definition: miarm.h:1245
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:1793
_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:999
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:1357
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:1621
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:583
FORCEINLINE VOID MiReferenceProbedPageAndBumpLockCount(IN PMMPFN Pfn1)
Definition: miarm.h:1693
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:926
POOL_DESCRIPTOR NonPagedPoolDescriptor
Definition: expool.c:42
FORCEINLINE BOOLEAN MM_ANY_WS_LOCK_HELD(IN PETHREAD Thread)
Definition: miarm.h:1058
#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:646
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:663
FORCEINLINE BOOLEAN MiIsMemoryTypeFree(TYPE_OF_MEMORY MemoryType)
Definition: miarm.h:672
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:304
FORCEINLINE VOID MiLockWorkingSetShared(_In_ PETHREAD Thread, _In_ PMMSUPPORT WorkingSet)
Definition: miarm.h:1312
MMSUPPORT MmSystemCacheWs
Definition: init.c:55
FORCEINLINE VOID MI_WRITE_INVALID_PDE(IN PMMPDE PointerPde, IN MMPDE InvalidPde)
Definition: miarm.h:1041
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
#define MM_PROTECT_SPECIAL
Definition: miarm.h:59
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:812
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:295
FORCEINLINE BOOLEAN MI_WS_OWNER(IN PEPROCESS Process)
Definition: miarm.h:1083
FORCEINLINE BOOLEAN MiIsUserPde(PVOID Address)
Definition: miarm.h:721
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:984
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:1434
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:936
FORCEINLINE VOID MI_WRITE_VALID_PTE(IN PMMPTE PointerPte, IN MMPTE TempPte)
Definition: miarm.h:966
FORCEINLINE VOID MiDropLockCount(IN PMMPFN Pfn1)
Definition: miarm.h:1591
PMMPTE MmFirstReservedMappingPte
Definition: hypermap.c:20
FORCEINLINE ULONG_PTR MiDetermineUserGlobalPteMask(IN PVOID PointerPte)
Definition: miarm.h:740
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:157
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:2478
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: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:1580
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:589
MMPDE ValidKernelPde
Definition: init.c:28
FORCEINLINE VOID MiLockProcessWorkingSet(IN PEPROCESS Process, IN PETHREAD Thread)
Definition: miarm.h:1130
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:2412
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)
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:297
PFN_NUMBER MmSystemPageDirectory[PPE_PER_PAGE]
Definition: init.c:40
FORCEINLINE VOID MiLockProcessWorkingSetUnsafe(IN PEPROCESS Process, IN PETHREAD Thread)
Definition: miarm.h:1175
PVOID MmPagedPoolEnd
Definition: miarm.h:579
FORCEINLINE VOID MiUnlockWorkingSetShared(_In_ PETHREAD Thread, _In_ PMMSUPPORT WorkingSet)
Definition: miarm.h:1395
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: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 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::@2528 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
union _MM_SESSION_SPACE::@1982 u
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
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