be245aac72a81b7903f74bdac853c09d28725d09
[reactos.git] / reactos / ntoskrnl / include / internal / mm.h
1 #pragma once
2
3 #include <internal/arch/mm.h>
4
5 /* TYPES *********************************************************************/
6
7 struct _EPROCESS;
8
9 extern PMMSUPPORT MmKernelAddressSpace;
10 extern PFN_COUNT MiFreeSwapPages;
11 extern PFN_COUNT MiUsedSwapPages;
12 extern PFN_COUNT MmNumberOfPhysicalPages;
13 extern UCHAR MmDisablePagingExecutive;
14 extern PFN_NUMBER MmLowestPhysicalPage;
15 extern PFN_NUMBER MmHighestPhysicalPage;
16 extern PFN_NUMBER MmAvailablePages;
17 extern PFN_NUMBER MmResidentAvailablePages;
18
19 extern LIST_ENTRY MmLoadedUserImageList;
20
21 extern KMUTANT MmSystemLoadLock;
22
23 extern ULONG MmNumberOfPagingFiles;
24
25 extern PVOID MmUnloadedDrivers;
26 extern PVOID MmLastUnloadedDrivers;
27 extern PVOID MmTriageActionTaken;
28 extern PVOID KernelVerifier;
29 extern MM_DRIVER_VERIFIER_DATA MmVerifierData;
30
31 extern SIZE_T MmTotalCommitLimit;
32 extern SIZE_T MmTotalCommittedPages;
33 extern SIZE_T MmSharedCommit;
34 extern SIZE_T MmDriverCommit;
35 extern SIZE_T MmProcessCommit;
36 extern SIZE_T MmPagedPoolCommit;
37 extern SIZE_T MmPeakCommitment;
38 extern SIZE_T MmtotalCommitLimitMaximum;
39
40 extern PVOID MiDebugMapping; // internal
41 extern PMMPTE MmDebugPte; // internal
42
43 struct _KTRAP_FRAME;
44 struct _EPROCESS;
45 struct _MM_RMAP_ENTRY;
46 typedef ULONG_PTR SWAPENTRY;
47
48 //
49 // MmDbgCopyMemory Flags
50 //
51 #define MMDBG_COPY_WRITE 0x00000001
52 #define MMDBG_COPY_PHYSICAL 0x00000002
53 #define MMDBG_COPY_UNSAFE 0x00000004
54 #define MMDBG_COPY_CACHED 0x00000008
55 #define MMDBG_COPY_UNCACHED 0x00000010
56 #define MMDBG_COPY_WRITE_COMBINED 0x00000020
57
58 //
59 // Maximum chunk size per copy
60 //
61 #define MMDBG_COPY_MAX_SIZE 0x8
62
63 #if defined(_X86_) // intenal for marea.c
64 #define MI_STATIC_MEMORY_AREAS (14)
65 #else
66 #define MI_STATIC_MEMORY_AREAS (13)
67 #endif
68
69 #define MEMORY_AREA_SECTION_VIEW (1)
70 #define MEMORY_AREA_CACHE (2)
71 #define MEMORY_AREA_OWNED_BY_ARM3 (15)
72 #define MEMORY_AREA_STATIC (0x80000000)
73
74 /* Although Microsoft says this isn't hardcoded anymore,
75 they won't be able to change it. Stuff depends on it */
76 #define MM_VIRTMEM_GRANULARITY (64 * 1024)
77
78 #define STATUS_MM_RESTART_OPERATION ((NTSTATUS)0xD0000001)
79
80 /*
81 * Additional flags for protection attributes
82 */
83 #define PAGE_WRITETHROUGH (1024)
84 #define PAGE_SYSTEM (2048)
85
86 #define SEC_PHYSICALMEMORY (0x80000000)
87
88 #define MM_PAGEFILE_SEGMENT (0x1)
89 #define MM_DATAFILE_SEGMENT (0x2)
90
91 #define MC_CACHE (0)
92 #define MC_USER (1)
93 #define MC_SYSTEM (2)
94 #define MC_MAXIMUM (3)
95
96 #define PAGED_POOL_MASK 1
97 #define MUST_SUCCEED_POOL_MASK 2
98 #define CACHE_ALIGNED_POOL_MASK 4
99 #define QUOTA_POOL_MASK 8
100 #define SESSION_POOL_MASK 32
101 #define VERIFIER_POOL_MASK 64
102
103 // FIXME: use ALIGN_UP_BY
104 #define MM_ROUND_UP(x,s) \
105 ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
106
107 #define MM_ROUND_DOWN(x,s) \
108 ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
109
110 #define PAGE_FLAGS_VALID_FOR_SECTION \
111 (PAGE_READONLY | \
112 PAGE_READWRITE | \
113 PAGE_WRITECOPY | \
114 PAGE_EXECUTE | \
115 PAGE_EXECUTE_READ | \
116 PAGE_EXECUTE_READWRITE | \
117 PAGE_EXECUTE_WRITECOPY | \
118 PAGE_NOACCESS | \
119 PAGE_NOCACHE)
120
121 #define PAGE_IS_READABLE \
122 (PAGE_READONLY | \
123 PAGE_READWRITE | \
124 PAGE_WRITECOPY | \
125 PAGE_EXECUTE_READ | \
126 PAGE_EXECUTE_READWRITE | \
127 PAGE_EXECUTE_WRITECOPY)
128
129 #define PAGE_IS_WRITABLE \
130 (PAGE_READWRITE | \
131 PAGE_WRITECOPY | \
132 PAGE_EXECUTE_READWRITE | \
133 PAGE_EXECUTE_WRITECOPY)
134
135 #define PAGE_IS_EXECUTABLE \
136 (PAGE_EXECUTE | \
137 PAGE_EXECUTE_READ | \
138 PAGE_EXECUTE_READWRITE | \
139 PAGE_EXECUTE_WRITECOPY)
140
141 #define PAGE_IS_WRITECOPY \
142 (PAGE_WRITECOPY | \
143 PAGE_EXECUTE_WRITECOPY)
144
145 //
146 // Wait entry for marking pages that are being serviced
147 //
148 #define MM_WAIT_ENTRY 0x7ffffc00
149
150 #define InterlockedCompareExchangePte(PointerPte, Exchange, Comperand) \
151 InterlockedCompareExchange((PLONG)(PointerPte), Exchange, Comperand)
152
153 #define InterlockedExchangePte(PointerPte, Value) \
154 InterlockedExchange((PLONG)(PointerPte), Value)
155
156 typedef struct _MM_SECTION_SEGMENT
157 {
158 FAST_MUTEX Lock; /* lock which protects the page directory */
159 PFILE_OBJECT FileObject;
160 LARGE_INTEGER RawLength; /* length of the segment which is part of the mapped file */
161 LARGE_INTEGER Length; /* absolute length of the segment */
162 ULONG ReferenceCount;
163 ULONG CacheCount;
164 ULONG Protection;
165 ULONG Flags;
166 BOOLEAN WriteCopy;
167 BOOLEAN Locked;
168
169 struct
170 {
171 ULONGLONG FileOffset; /* start offset into the file for image sections */
172 ULONG_PTR VirtualAddress; /* start offset into the address range for image sections */
173 ULONG Characteristics;
174 } Image;
175
176 LIST_ENTRY ListOfSegments;
177 RTL_GENERIC_TABLE PageTable;
178 } MM_SECTION_SEGMENT, *PMM_SECTION_SEGMENT;
179
180 typedef struct _MM_IMAGE_SECTION_OBJECT
181 {
182 SECTION_IMAGE_INFORMATION ImageInformation;
183 PVOID BasedAddress;
184 ULONG NrSegments;
185 PMM_SECTION_SEGMENT Segments;
186 } MM_IMAGE_SECTION_OBJECT, *PMM_IMAGE_SECTION_OBJECT;
187
188 typedef struct _ROS_SECTION_OBJECT
189 {
190 CSHORT Type;
191 CSHORT Size;
192 LARGE_INTEGER MaximumSize;
193 ULONG SectionPageProtection;
194 ULONG AllocationAttributes;
195 PFILE_OBJECT FileObject;
196 union
197 {
198 PMM_IMAGE_SECTION_OBJECT ImageSection;
199 PMM_SECTION_SEGMENT Segment;
200 };
201 } ROS_SECTION_OBJECT, *PROS_SECTION_OBJECT;
202
203 #define MA_GetStartingAddress(_MemoryArea) ((_MemoryArea)->StartingVpn << PAGE_SHIFT)
204 #define MA_GetEndingAddress(_MemoryArea) (((_MemoryArea)->EndingVpn + 1) << PAGE_SHIFT)
205
206 typedef struct _MEMORY_AREA
207 {
208 MMVAD VadNode;
209 ULONG_PTR StartingVpn;
210 ULONG_PTR EndingVpn;
211 struct _MEMORY_AREA *Parent;
212 struct _MEMORY_AREA *LeftChild;
213 struct _MEMORY_AREA *RightChild;
214 ULONG Type;
215 ULONG Protect;
216 ULONG Flags;
217 BOOLEAN DeleteInProgress;
218 ULONG Magic;
219 PVOID Vad;
220 union
221 {
222 struct
223 {
224 ROS_SECTION_OBJECT* Section;
225 LARGE_INTEGER ViewOffset;
226 PMM_SECTION_SEGMENT Segment;
227 LIST_ENTRY RegionListHead;
228 } SectionData;
229 struct
230 {
231 LIST_ENTRY RegionListHead;
232 } VirtualMemoryData;
233 } Data;
234 } MEMORY_AREA, *PMEMORY_AREA;
235
236 typedef struct _MM_RMAP_ENTRY
237 {
238 struct _MM_RMAP_ENTRY* Next;
239 PEPROCESS Process;
240 PVOID Address;
241 #if DBG
242 PVOID Caller;
243 #endif
244 }
245 MM_RMAP_ENTRY, *PMM_RMAP_ENTRY;
246
247 #if MI_TRACE_PFNS
248 extern ULONG MI_PFN_CURRENT_USAGE;
249 extern CHAR MI_PFN_CURRENT_PROCESS_NAME[16];
250 #define MI_SET_USAGE(x) MI_PFN_CURRENT_USAGE = x
251 #define MI_SET_PROCESS2(x) memcpy(MI_PFN_CURRENT_PROCESS_NAME, x, 16)
252 #else
253 #define MI_SET_USAGE(x)
254 #define MI_SET_PROCESS2(x)
255 #endif
256
257 typedef enum _MI_PFN_USAGES
258 {
259 MI_USAGE_NOT_SET = 0,
260 MI_USAGE_PAGED_POOL,
261 MI_USAGE_NONPAGED_POOL,
262 MI_USAGE_NONPAGED_POOL_EXPANSION,
263 MI_USAGE_KERNEL_STACK,
264 MI_USAGE_KERNEL_STACK_EXPANSION,
265 MI_USAGE_SYSTEM_PTE,
266 MI_USAGE_VAD,
267 MI_USAGE_PEB_TEB,
268 MI_USAGE_SECTION,
269 MI_USAGE_PAGE_TABLE,
270 MI_USAGE_PAGE_DIRECTORY,
271 MI_USAGE_LEGACY_PAGE_DIRECTORY,
272 MI_USAGE_DRIVER_PAGE,
273 MI_USAGE_CONTINOUS_ALLOCATION,
274 MI_USAGE_MDL,
275 MI_USAGE_DEMAND_ZERO,
276 MI_USAGE_ZERO_LOOP,
277 MI_USAGE_CACHE,
278 MI_USAGE_PFN_DATABASE,
279 MI_USAGE_BOOT_DRIVER,
280 MI_USAGE_INIT_MEMORY,
281 MI_USAGE_FREE_PAGE
282 } MI_PFN_USAGES;
283
284 //
285 // These two mappings are actually used by Windows itself, based on the ASSERTS
286 //
287 #define StartOfAllocation ReadInProgress
288 #define EndOfAllocation WriteInProgress
289
290 typedef struct _MMPFNENTRY
291 {
292 USHORT Modified:1;
293 USHORT ReadInProgress:1; // StartOfAllocation
294 USHORT WriteInProgress:1; // EndOfAllocation
295 USHORT PrototypePte:1;
296 USHORT PageColor:4;
297 USHORT PageLocation:3;
298 USHORT RemovalRequested:1;
299 USHORT CacheAttribute:2;
300 USHORT Rom:1;
301 USHORT ParityError:1;
302 } MMPFNENTRY;
303
304 // Mm internal
305 typedef struct _MMPFN
306 {
307 union
308 {
309 PFN_NUMBER Flink;
310 ULONG WsIndex;
311 PKEVENT Event;
312 NTSTATUS ReadStatus;
313 SINGLE_LIST_ENTRY NextStackPfn;
314
315 // HACK for ROSPFN
316 SWAPENTRY SwapEntry;
317 } u1;
318 PMMPTE PteAddress;
319 union
320 {
321 PFN_NUMBER Blink;
322 ULONG_PTR ShareCount;
323 } u2;
324 union
325 {
326 struct
327 {
328 USHORT ReferenceCount;
329 MMPFNENTRY e1;
330 };
331 struct
332 {
333 USHORT ReferenceCount;
334 USHORT ShortFlags;
335 } e2;
336 } u3;
337 union
338 {
339 MMPTE OriginalPte;
340 LONG AweReferenceCount;
341
342 // HACK for ROSPFN
343 PMM_RMAP_ENTRY RmapListHead;
344 };
345 union
346 {
347 ULONG_PTR EntireFrame;
348 struct
349 {
350 ULONG_PTR PteFrame:25;
351 ULONG_PTR InPageError:1;
352 ULONG_PTR VerifierAllocation:1;
353 ULONG_PTR AweAllocation:1;
354 ULONG_PTR Priority:3;
355 ULONG_PTR MustBeCached:1;
356 };
357 } u4;
358 #if MI_TRACE_PFNS
359 MI_PFN_USAGES PfnUsage;
360 CHAR ProcessName[16];
361 #endif
362
363 // HACK until WS lists are supported
364 MMWSLE Wsle;
365 } MMPFN, *PMMPFN;
366
367 extern PMMPFN MmPfnDatabase;
368
369 typedef struct _MMPFNLIST
370 {
371 PFN_NUMBER Total;
372 MMLISTS ListName;
373 PFN_NUMBER Flink;
374 PFN_NUMBER Blink;
375 } MMPFNLIST, *PMMPFNLIST;
376
377 extern MMPFNLIST MmZeroedPageListHead;
378 extern MMPFNLIST MmFreePageListHead;
379 extern MMPFNLIST MmStandbyPageListHead;
380 extern MMPFNLIST MmModifiedPageListHead;
381 extern MMPFNLIST MmModifiedNoWritePageListHead;
382
383 typedef struct _MM_MEMORY_CONSUMER
384 {
385 ULONG PagesUsed;
386 ULONG PagesTarget;
387 NTSTATUS (*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed);
388 } MM_MEMORY_CONSUMER, *PMM_MEMORY_CONSUMER;
389
390 typedef struct _MM_REGION
391 {
392 ULONG Type;
393 ULONG Protect;
394 SIZE_T Length;
395 LIST_ENTRY RegionListEntry;
396 } MM_REGION, *PMM_REGION;
397
398 // Mm internal
399 /* Entry describing free pool memory */
400 typedef struct _MMFREE_POOL_ENTRY
401 {
402 LIST_ENTRY List;
403 PFN_COUNT Size;
404 ULONG Signature;
405 struct _MMFREE_POOL_ENTRY *Owner;
406 } MMFREE_POOL_ENTRY, *PMMFREE_POOL_ENTRY;
407
408 /* Signature of a freed block */
409 #define MM_FREE_POOL_SIGNATURE 'ARM3'
410
411 /* Paged pool information */
412 typedef struct _MM_PAGED_POOL_INFO
413 {
414 PRTL_BITMAP PagedPoolAllocationMap;
415 PRTL_BITMAP EndOfPagedPoolBitmap;
416 PMMPTE FirstPteForPagedPool;
417 PMMPTE LastPteForPagedPool;
418 PMMPDE NextPdeForPagedPoolExpansion;
419 ULONG PagedPoolHint;
420 SIZE_T PagedPoolCommit;
421 SIZE_T AllocatedPagedPool;
422 } MM_PAGED_POOL_INFO, *PMM_PAGED_POOL_INFO;
423
424 extern MM_MEMORY_CONSUMER MiMemoryConsumers[MC_MAXIMUM];
425
426 typedef VOID
427 (*PMM_ALTER_REGION_FUNC)(
428 PMMSUPPORT AddressSpace,
429 PVOID BaseAddress,
430 SIZE_T Length,
431 ULONG OldType,
432 ULONG OldProtect,
433 ULONG NewType,
434 ULONG NewProtect
435 );
436
437 typedef VOID
438 (*PMM_FREE_PAGE_FUNC)(
439 PVOID Context,
440 PMEMORY_AREA MemoryArea,
441 PVOID Address,
442 PFN_NUMBER Page,
443 SWAPENTRY SwapEntry,
444 BOOLEAN Dirty
445 );
446
447 //
448 // Mm copy support for Kd
449 //
450 NTSTATUS
451 NTAPI
452 MmDbgCopyMemory(
453 IN ULONG64 Address,
454 IN PVOID Buffer,
455 IN ULONG Size,
456 IN ULONG Flags
457 );
458
459 //
460 // Determines if a given address is a session address
461 //
462 BOOLEAN
463 NTAPI
464 MmIsSessionAddress(
465 IN PVOID Address
466 );
467
468 ULONG
469 NTAPI
470 MmGetSessionId(
471 IN PEPROCESS Process
472 );
473
474 ULONG
475 NTAPI
476 MmGetSessionIdEx(
477 IN PEPROCESS Process
478 );
479
480 /* marea.c *******************************************************************/
481
482 NTSTATUS
483 NTAPI
484 MmCreateMemoryArea(
485 PMMSUPPORT AddressSpace,
486 ULONG Type,
487 PVOID *BaseAddress,
488 SIZE_T Length,
489 ULONG Protection,
490 PMEMORY_AREA *Result,
491 ULONG AllocationFlags,
492 ULONG AllocationGranularity
493 );
494
495 PMEMORY_AREA
496 NTAPI
497 MmLocateMemoryAreaByAddress(
498 PMMSUPPORT AddressSpace,
499 PVOID Address
500 );
501
502 NTSTATUS
503 NTAPI
504 MmFreeMemoryArea(
505 PMMSUPPORT AddressSpace,
506 PMEMORY_AREA MemoryArea,
507 PMM_FREE_PAGE_FUNC FreePage,
508 PVOID FreePageContext
509 );
510
511 VOID
512 NTAPI
513 MiRosCleanupMemoryArea(
514 PEPROCESS Process,
515 PMMVAD Vad);
516
517 NTSTATUS
518 NTAPI
519 MmFreeMemoryAreaByPtr(
520 PMMSUPPORT AddressSpace,
521 PVOID BaseAddress,
522 PMM_FREE_PAGE_FUNC FreePage,
523 PVOID FreePageContext
524 );
525
526 PMEMORY_AREA
527 NTAPI
528 MmLocateMemoryAreaByRegion(
529 PMMSUPPORT AddressSpace,
530 PVOID Address,
531 SIZE_T Length
532 );
533
534 PVOID
535 NTAPI
536 MmFindGap(
537 PMMSUPPORT AddressSpace,
538 SIZE_T Length,
539 ULONG_PTR Granularity,
540 BOOLEAN TopDown
541 );
542
543 VOID
544 NTAPI
545 MiRosCheckMemoryAreas(
546 PMMSUPPORT AddressSpace);
547
548 VOID
549 NTAPI
550 MiCheckAllProcessMemoryAreas(VOID);
551
552 /* npool.c *******************************************************************/
553
554 VOID
555 NTAPI
556 MiInitializeNonPagedPool(VOID);
557
558 PVOID
559 NTAPI
560 MiAllocatePoolPages(
561 IN POOL_TYPE PoolType,
562 IN SIZE_T SizeInBytes
563 );
564
565 POOL_TYPE
566 NTAPI
567 MmDeterminePoolType(
568 IN PVOID VirtualAddress
569 );
570
571 ULONG
572 NTAPI
573 MiFreePoolPages(
574 IN PVOID StartingAddress
575 );
576
577 /* pool.c *******************************************************************/
578
579 BOOLEAN
580 NTAPI
581 MiRaisePoolQuota(
582 IN POOL_TYPE PoolType,
583 IN ULONG CurrentMaxQuota,
584 OUT PULONG NewMaxQuota
585 );
586
587 /* mdl.c *********************************************************************/
588
589 VOID
590 NTAPI
591 MmBuildMdlFromPages(
592 PMDL Mdl,
593 PPFN_NUMBER Pages
594 );
595
596 /* mminit.c ******************************************************************/
597
598 VOID
599 NTAPI
600 MmInit1(
601 VOID
602 );
603
604 BOOLEAN
605 NTAPI
606 MmInitSystem(IN ULONG Phase,
607 IN PLOADER_PARAMETER_BLOCK LoaderBlock);
608
609
610 /* pagefile.c ****************************************************************/
611
612 SWAPENTRY
613 NTAPI
614 MmAllocSwapPage(VOID);
615
616 VOID
617 NTAPI
618 MmFreeSwapPage(SWAPENTRY Entry);
619
620 VOID
621 NTAPI
622 MmInitPagingFile(VOID);
623
624 BOOLEAN
625 NTAPI
626 MmIsFileObjectAPagingFile(PFILE_OBJECT FileObject);
627
628 NTSTATUS
629 NTAPI
630 MmReadFromSwapPage(
631 SWAPENTRY SwapEntry,
632 PFN_NUMBER Page
633 );
634
635 NTSTATUS
636 NTAPI
637 MmWriteToSwapPage(
638 SWAPENTRY SwapEntry,
639 PFN_NUMBER Page
640 );
641
642 VOID
643 NTAPI
644 MmShowOutOfSpaceMessagePagingFile(VOID);
645
646 NTSTATUS
647 NTAPI
648 MiReadPageFile(
649 _In_ PFN_NUMBER Page,
650 _In_ ULONG PageFileIndex,
651 _In_ ULONG_PTR PageFileOffset);
652
653 /* process.c ****************************************************************/
654
655 NTSTATUS
656 NTAPI
657 MmInitializeProcessAddressSpace(
658 IN PEPROCESS Process,
659 IN PEPROCESS Clone OPTIONAL,
660 IN PVOID Section OPTIONAL,
661 IN OUT PULONG Flags,
662 IN POBJECT_NAME_INFORMATION *AuditName OPTIONAL
663 );
664
665 NTSTATUS
666 NTAPI
667 MmCreatePeb(
668 IN PEPROCESS Process,
669 IN PINITIAL_PEB InitialPeb,
670 OUT PPEB *BasePeb
671 );
672
673 NTSTATUS
674 NTAPI
675 MmCreateTeb(
676 IN PEPROCESS Process,
677 IN PCLIENT_ID ClientId,
678 IN PINITIAL_TEB InitialTeb,
679 OUT PTEB* BaseTeb
680 );
681
682 VOID
683 NTAPI
684 MmDeleteTeb(
685 struct _EPROCESS *Process,
686 PTEB Teb
687 );
688
689 VOID
690 NTAPI
691 MmCleanProcessAddressSpace(IN PEPROCESS Process);
692
693 NTSTATUS
694 NTAPI
695 MmDeleteProcessAddressSpace(IN PEPROCESS Process);
696
697 ULONG
698 NTAPI
699 MmGetSessionLocaleId(VOID);
700
701 NTSTATUS
702 NTAPI
703 MmSetMemoryPriorityProcess(
704 IN PEPROCESS Process,
705 IN UCHAR MemoryPriority
706 );
707
708 /* i386/pfault.c *************************************************************/
709
710 NTSTATUS
711 NTAPI
712 MmPageFault(
713 ULONG Cs,
714 PULONG Eip,
715 PULONG Eax,
716 ULONG Cr2,
717 ULONG ErrorCode
718 );
719
720 /* special.c *****************************************************************/
721
722 VOID
723 NTAPI
724 MiInitializeSpecialPool(VOID);
725
726 BOOLEAN
727 NTAPI
728 MmUseSpecialPool(
729 IN SIZE_T NumberOfBytes,
730 IN ULONG Tag);
731
732 BOOLEAN
733 NTAPI
734 MmIsSpecialPoolAddress(
735 IN PVOID P);
736
737 BOOLEAN
738 NTAPI
739 MmIsSpecialPoolAddressFree(
740 IN PVOID P);
741
742 PVOID
743 NTAPI
744 MmAllocateSpecialPool(
745 IN SIZE_T NumberOfBytes,
746 IN ULONG Tag,
747 IN POOL_TYPE PoolType,
748 IN ULONG SpecialType);
749
750 VOID
751 NTAPI
752 MmFreeSpecialPool(
753 IN PVOID P);
754
755 /* mm.c **********************************************************************/
756
757 NTSTATUS
758 NTAPI
759 MmAccessFault(
760 IN BOOLEAN StoreInstruction,
761 IN PVOID Address,
762 IN KPROCESSOR_MODE Mode,
763 IN PVOID TrapInformation
764 );
765
766 /* kmap.c ********************************************************************/
767
768 NTSTATUS
769 NTAPI
770 MiCopyFromUserPage(
771 PFN_NUMBER NewPage,
772 PFN_NUMBER OldPage
773 );
774
775 /* process.c *****************************************************************/
776
777 PVOID
778 NTAPI
779 MmCreateKernelStack(BOOLEAN GuiStack, UCHAR Node);
780
781 VOID
782 NTAPI
783 MmDeleteKernelStack(PVOID Stack,
784 BOOLEAN GuiStack);
785
786 /* balace.c ******************************************************************/
787
788 VOID
789 NTAPI
790 MmInitializeMemoryConsumer(
791 ULONG Consumer,
792 NTSTATUS (*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed)
793 );
794
795 VOID
796 NTAPI
797 MmInitializeBalancer(
798 ULONG NrAvailablePages,
799 ULONG NrSystemPages
800 );
801
802 NTSTATUS
803 NTAPI
804 MmReleasePageMemoryConsumer(
805 ULONG Consumer,
806 PFN_NUMBER Page
807 );
808
809 NTSTATUS
810 NTAPI
811 MmRequestPageMemoryConsumer(
812 ULONG Consumer,
813 BOOLEAN MyWait,
814 PPFN_NUMBER AllocatedPage
815 );
816
817 VOID
818 NTAPI
819 MiInitBalancerThread(VOID);
820
821 VOID
822 NTAPI
823 MmRebalanceMemoryConsumers(VOID);
824
825 /* rmap.c **************************************************************/
826
827 VOID
828 NTAPI
829 MmSetRmapListHeadPage(
830 PFN_NUMBER Page,
831 struct _MM_RMAP_ENTRY* ListHead
832 );
833
834 struct _MM_RMAP_ENTRY*
835 NTAPI
836 MmGetRmapListHeadPage(PFN_NUMBER Page);
837
838 VOID
839 NTAPI
840 MmInsertRmap(
841 PFN_NUMBER Page,
842 struct _EPROCESS *Process,
843 PVOID Address
844 );
845
846 VOID
847 NTAPI
848 MmDeleteAllRmaps(
849 PFN_NUMBER Page,
850 PVOID Context,
851 VOID (*DeleteMapping)(PVOID Context, struct _EPROCESS *Process, PVOID Address)
852 );
853
854 VOID
855 NTAPI
856 MmDeleteRmap(
857 PFN_NUMBER Page,
858 struct _EPROCESS *Process,
859 PVOID Address
860 );
861
862 VOID
863 NTAPI
864 MmInitializeRmapList(VOID);
865
866 VOID
867 NTAPI
868 MmSetCleanAllRmaps(PFN_NUMBER Page);
869
870 VOID
871 NTAPI
872 MmSetDirtyAllRmaps(PFN_NUMBER Page);
873
874 BOOLEAN
875 NTAPI
876 MmIsDirtyPageRmap(PFN_NUMBER Page);
877
878 NTSTATUS
879 NTAPI
880 MmPageOutPhysicalAddress(PFN_NUMBER Page);
881
882 /* freelist.c **********************************************************/
883
884 FORCEINLINE
885 PMMPFN
886 MiGetPfnEntry(IN PFN_NUMBER Pfn)
887 {
888 PMMPFN Page;
889 extern RTL_BITMAP MiPfnBitMap;
890
891 /* Make sure the PFN number is valid */
892 if (Pfn > MmHighestPhysicalPage) return NULL;
893
894 /* Make sure this page actually has a PFN entry */
895 if ((MiPfnBitMap.Buffer) && !(RtlTestBit(&MiPfnBitMap, (ULONG)Pfn))) return NULL;
896
897 /* Get the entry */
898 Page = &MmPfnDatabase[Pfn];
899
900 /* Return it */
901 return Page;
902 };
903
904 FORCEINLINE
905 PFN_NUMBER
906 MiGetPfnEntryIndex(IN PMMPFN Pfn1)
907 {
908 //
909 // This will return the Page Frame Number (PFN) from the MMPFN
910 //
911 return Pfn1 - MmPfnDatabase;
912 }
913
914 PFN_NUMBER
915 NTAPI
916 MmGetLRUNextUserPage(PFN_NUMBER PreviousPage);
917
918 PFN_NUMBER
919 NTAPI
920 MmGetLRUFirstUserPage(VOID);
921
922 VOID
923 NTAPI
924 MmInsertLRULastUserPage(PFN_NUMBER Page);
925
926 VOID
927 NTAPI
928 MmRemoveLRUUserPage(PFN_NUMBER Page);
929
930 VOID
931 NTAPI
932 MmDumpArmPfnDatabase(
933 IN BOOLEAN StatusOnly
934 );
935
936 VOID
937 NTAPI
938 MmZeroPageThread(
939 VOID
940 );
941
942 /* hypermap.c *****************************************************************/
943
944 extern PEPROCESS HyperProcess;
945 extern KIRQL HyperIrql;
946
947 PVOID
948 NTAPI
949 MiMapPageInHyperSpace(IN PEPROCESS Process,
950 IN PFN_NUMBER Page,
951 IN PKIRQL OldIrql);
952
953 VOID
954 NTAPI
955 MiUnmapPageInHyperSpace(IN PEPROCESS Process,
956 IN PVOID Address,
957 IN KIRQL OldIrql);
958
959 PVOID
960 NTAPI
961 MiMapPagesInZeroSpace(IN PMMPFN Pfn1,
962 IN PFN_NUMBER NumberOfPages);
963
964 VOID
965 NTAPI
966 MiUnmapPagesInZeroSpace(IN PVOID VirtualAddress,
967 IN PFN_NUMBER NumberOfPages);
968
969 //
970 // ReactOS Compatibility Layer
971 //
972 FORCEINLINE
973 PVOID
974 MmCreateHyperspaceMapping(IN PFN_NUMBER Page)
975 {
976 HyperProcess = (PEPROCESS)KeGetCurrentThread()->ApcState.Process;
977 return MiMapPageInHyperSpace(HyperProcess, Page, &HyperIrql);
978 }
979
980 #define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql);
981
982 /* i386/page.c *********************************************************/
983
984 NTSTATUS
985 NTAPI
986 MmCreateVirtualMapping(
987 struct _EPROCESS* Process,
988 PVOID Address,
989 ULONG flProtect,
990 PPFN_NUMBER Pages,
991 ULONG PageCount
992 );
993
994 NTSTATUS
995 NTAPI
996 MmCreateVirtualMappingUnsafe(
997 struct _EPROCESS* Process,
998 PVOID Address,
999 ULONG flProtect,
1000 PPFN_NUMBER Pages,
1001 ULONG PageCount
1002 );
1003
1004 ULONG
1005 NTAPI
1006 MmGetPageProtect(
1007 struct _EPROCESS* Process,
1008 PVOID Address);
1009
1010 VOID
1011 NTAPI
1012 MmSetPageProtect(
1013 struct _EPROCESS* Process,
1014 PVOID Address,
1015 ULONG flProtect
1016 );
1017
1018 BOOLEAN
1019 NTAPI
1020 MmIsPagePresent(
1021 struct _EPROCESS* Process,
1022 PVOID Address
1023 );
1024
1025 BOOLEAN
1026 NTAPI
1027 MmIsDisabledPage(
1028 struct _EPROCESS* Process,
1029 PVOID Address
1030 );
1031
1032 VOID
1033 NTAPI
1034 MmInitGlobalKernelPageDirectory(VOID);
1035
1036 VOID
1037 NTAPI
1038 MmGetPageFileMapping(
1039 struct _EPROCESS *Process,
1040 PVOID Address,
1041 SWAPENTRY* SwapEntry);
1042
1043 VOID
1044 NTAPI
1045 MmDeletePageFileMapping(
1046 struct _EPROCESS *Process,
1047 PVOID Address,
1048 SWAPENTRY* SwapEntry
1049 );
1050
1051 NTSTATUS
1052 NTAPI
1053 MmCreatePageFileMapping(
1054 struct _EPROCESS *Process,
1055 PVOID Address,
1056 SWAPENTRY SwapEntry
1057 );
1058
1059 BOOLEAN
1060 NTAPI
1061 MmIsPageSwapEntry(
1062 struct _EPROCESS *Process,
1063 PVOID Address
1064 );
1065
1066 VOID
1067 NTAPI
1068 MmSetDirtyPage(
1069 struct _EPROCESS *Process,
1070 PVOID Address
1071 );
1072
1073 PFN_NUMBER
1074 NTAPI
1075 MmAllocPage(
1076 ULONG Consumer
1077 );
1078
1079 VOID
1080 NTAPI
1081 MmDereferencePage(PFN_NUMBER Page);
1082
1083 VOID
1084 NTAPI
1085 MmReferencePage(PFN_NUMBER Page);
1086
1087 ULONG
1088 NTAPI
1089 MmGetReferenceCountPage(PFN_NUMBER Page);
1090
1091 BOOLEAN
1092 NTAPI
1093 MmIsPageInUse(PFN_NUMBER Page);
1094
1095 VOID
1096 NTAPI
1097 MmSetSavedSwapEntryPage(
1098 PFN_NUMBER Page,
1099 SWAPENTRY SavedSwapEntry);
1100
1101 SWAPENTRY
1102 NTAPI
1103 MmGetSavedSwapEntryPage(PFN_NUMBER Page);
1104
1105 VOID
1106 NTAPI
1107 MmSetCleanPage(
1108 struct _EPROCESS *Process,
1109 PVOID Address
1110 );
1111
1112 VOID
1113 NTAPI
1114 MmDeletePageTable(
1115 struct _EPROCESS *Process,
1116 PVOID Address
1117 );
1118
1119 PFN_NUMBER
1120 NTAPI
1121 MmGetPfnForProcess(
1122 struct _EPROCESS *Process,
1123 PVOID Address
1124 );
1125
1126 BOOLEAN
1127 NTAPI
1128 MmCreateProcessAddressSpace(
1129 IN ULONG MinWs,
1130 IN PEPROCESS Dest,
1131 IN PULONG_PTR DirectoryTableBase
1132 );
1133
1134 NTSTATUS
1135 NTAPI
1136 MmInitializeHandBuiltProcess(
1137 IN PEPROCESS Process,
1138 IN PULONG_PTR DirectoryTableBase
1139 );
1140
1141
1142 NTSTATUS
1143 NTAPI
1144 MmInitializeHandBuiltProcess2(
1145 IN PEPROCESS Process
1146 );
1147
1148 NTSTATUS
1149 NTAPI
1150 MmSetExecuteOptions(IN ULONG ExecuteOptions);
1151
1152 NTSTATUS
1153 NTAPI
1154 MmGetExecuteOptions(IN PULONG ExecuteOptions);
1155
1156 VOID
1157 NTAPI
1158 MmDeleteVirtualMapping(
1159 struct _EPROCESS *Process,
1160 PVOID Address,
1161 BOOLEAN* WasDirty,
1162 PPFN_NUMBER Page
1163 );
1164
1165 BOOLEAN
1166 NTAPI
1167 MmIsDirtyPage(
1168 struct _EPROCESS *Process,
1169 PVOID Address
1170 );
1171
1172 /* wset.c ********************************************************************/
1173
1174 NTSTATUS
1175 MmTrimUserMemory(
1176 ULONG Target,
1177 ULONG Priority,
1178 PULONG NrFreedPages
1179 );
1180
1181 /* region.c ************************************************************/
1182
1183 NTSTATUS
1184 NTAPI
1185 MmAlterRegion(
1186 PMMSUPPORT AddressSpace,
1187 PVOID BaseAddress,
1188 PLIST_ENTRY RegionListHead,
1189 PVOID StartAddress,
1190 SIZE_T Length,
1191 ULONG NewType,
1192 ULONG NewProtect,
1193 PMM_ALTER_REGION_FUNC AlterFunc
1194 );
1195
1196 VOID
1197 NTAPI
1198 MmInitializeRegion(
1199 PLIST_ENTRY RegionListHead,
1200 SIZE_T Length,
1201 ULONG Type,
1202 ULONG Protect
1203 );
1204
1205 PMM_REGION
1206 NTAPI
1207 MmFindRegion(
1208 PVOID BaseAddress,
1209 PLIST_ENTRY RegionListHead,
1210 PVOID Address,
1211 PVOID* RegionBaseAddress
1212 );
1213
1214 /* section.c *****************************************************************/
1215
1216 VOID
1217 NTAPI
1218 MmGetImageInformation(
1219 OUT PSECTION_IMAGE_INFORMATION ImageInformation
1220 );
1221
1222 PFILE_OBJECT
1223 NTAPI
1224 MmGetFileObjectForSection(
1225 IN PVOID Section
1226 );
1227 NTSTATUS
1228 NTAPI
1229 MmGetFileNameForAddress(
1230 IN PVOID Address,
1231 OUT PUNICODE_STRING ModuleName
1232 );
1233
1234 NTSTATUS
1235 NTAPI
1236 MmGetFileNameForSection(
1237 IN PVOID Section,
1238 OUT POBJECT_NAME_INFORMATION *ModuleName
1239 );
1240
1241 NTSTATUS
1242 NTAPI
1243 MmQuerySectionView(
1244 PMEMORY_AREA MemoryArea,
1245 PVOID Address,
1246 PMEMORY_BASIC_INFORMATION Info,
1247 PSIZE_T ResultLength
1248 );
1249
1250 NTSTATUS
1251 NTAPI
1252 MmProtectSectionView(
1253 PMMSUPPORT AddressSpace,
1254 PMEMORY_AREA MemoryArea,
1255 PVOID BaseAddress,
1256 SIZE_T Length,
1257 ULONG Protect,
1258 PULONG OldProtect
1259 );
1260
1261 NTSTATUS
1262 NTAPI
1263 MmInitSectionImplementation(VOID);
1264
1265 NTSTATUS
1266 NTAPI
1267 MmNotPresentFaultSectionView(
1268 PMMSUPPORT AddressSpace,
1269 MEMORY_AREA* MemoryArea,
1270 PVOID Address,
1271 BOOLEAN Locked
1272 );
1273
1274 NTSTATUS
1275 NTAPI
1276 MmPageOutSectionView(
1277 PMMSUPPORT AddressSpace,
1278 PMEMORY_AREA MemoryArea,
1279 PVOID Address,
1280 ULONG_PTR Entry
1281 );
1282
1283 NTSTATUS
1284 NTAPI
1285 MmCreatePhysicalMemorySection(VOID);
1286
1287 NTSTATUS
1288 NTAPI
1289 MmAccessFaultSectionView(
1290 PMMSUPPORT AddressSpace,
1291 MEMORY_AREA* MemoryArea,
1292 PVOID Address
1293 );
1294
1295 VOID
1296 NTAPI
1297 MmFreeSectionSegments(PFILE_OBJECT FileObject);
1298
1299 /* sysldr.c ******************************************************************/
1300
1301 VOID
1302 NTAPI
1303 MiReloadBootLoadedDrivers(
1304 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1305 );
1306
1307 BOOLEAN
1308 NTAPI
1309 MiInitializeLoadedModuleList(
1310 IN PLOADER_PARAMETER_BLOCK LoaderBlock
1311 );
1312
1313 NTSTATUS
1314 NTAPI
1315 MmLoadSystemImage(
1316 IN PUNICODE_STRING FileName,
1317 IN PUNICODE_STRING NamePrefix OPTIONAL,
1318 IN PUNICODE_STRING LoadedName OPTIONAL,
1319 IN ULONG Flags,
1320 OUT PVOID *ModuleObject,
1321 OUT PVOID *ImageBaseAddress
1322 );
1323
1324 NTSTATUS
1325 NTAPI
1326 MmUnloadSystemImage(
1327 IN PVOID ImageHandle
1328 );
1329
1330 NTSTATUS
1331 NTAPI
1332 MmCheckSystemImage(
1333 IN HANDLE ImageHandle,
1334 IN BOOLEAN PurgeSection
1335 );
1336
1337 NTSTATUS
1338 NTAPI
1339 MmCallDllInitialize(
1340 IN PLDR_DATA_TABLE_ENTRY LdrEntry,
1341 IN PLIST_ENTRY ListHead
1342 );
1343
1344
1345 /* procsup.c *****************************************************************/
1346
1347 NTSTATUS
1348 NTAPI
1349 MmGrowKernelStack(
1350 IN PVOID StackPointer
1351 );
1352
1353
1354 FORCEINLINE
1355 VOID
1356 MmLockAddressSpace(PMMSUPPORT AddressSpace)
1357 {
1358 KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace, EPROCESS, Vm)->AddressCreationLock);
1359 }
1360
1361 FORCEINLINE
1362 VOID
1363 MmUnlockAddressSpace(PMMSUPPORT AddressSpace)
1364 {
1365 KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace, EPROCESS, Vm)->AddressCreationLock);
1366 }
1367
1368 FORCEINLINE
1369 PEPROCESS
1370 MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace)
1371 {
1372 if (AddressSpace == MmKernelAddressSpace) return NULL;
1373 return CONTAINING_RECORD(AddressSpace, EPROCESS, Vm);
1374 }
1375
1376 FORCEINLINE
1377 PMMSUPPORT
1378 MmGetCurrentAddressSpace(VOID)
1379 {
1380 return &((PEPROCESS)KeGetCurrentThread()->ApcState.Process)->Vm;
1381 }
1382
1383 FORCEINLINE
1384 PMMSUPPORT
1385 MmGetKernelAddressSpace(VOID)
1386 {
1387 return MmKernelAddressSpace;
1388 }
1389
1390
1391 /* expool.c ******************************************************************/
1392
1393 VOID
1394 NTAPI
1395 ExpCheckPoolAllocation(
1396 PVOID P,
1397 POOL_TYPE PoolType,
1398 ULONG Tag);
1399
1400
1401 /* mmsup.c *****************************************************************/
1402
1403 NTSTATUS
1404 NTAPI
1405 MmAdjustWorkingSetSize(
1406 IN SIZE_T WorkingSetMinimumInBytes,
1407 IN SIZE_T WorkingSetMaximumInBytes,
1408 IN ULONG SystemCache,
1409 IN BOOLEAN IncreaseOkay);
1410
1411
1412 /* session.c *****************************************************************/
1413
1414 _IRQL_requires_max_(APC_LEVEL)
1415 NTSTATUS
1416 NTAPI
1417 MmAttachSession(
1418 _Inout_ PVOID SessionEntry,
1419 _Out_ PKAPC_STATE ApcState);
1420
1421 _IRQL_requires_max_(APC_LEVEL)
1422 VOID
1423 NTAPI
1424 MmDetachSession(
1425 _Inout_ PVOID SessionEntry,
1426 _Out_ PKAPC_STATE ApcState);
1427
1428 VOID
1429 NTAPI
1430 MmQuitNextSession(
1431 _Inout_ PVOID SessionEntry);
1432
1433 PVOID
1434 NTAPI
1435 MmGetSessionById(
1436 _In_ ULONG SessionId);
1437
1438 _IRQL_requires_max_(APC_LEVEL)
1439 VOID
1440 NTAPI
1441 MmSetSessionLocaleId(
1442 _In_ LCID LocaleId);
1443
1444
1445 /* virtual.c *****************************************************************/
1446
1447 NTSTATUS
1448 NTAPI
1449 MmCopyVirtualMemory(IN PEPROCESS SourceProcess,
1450 IN PVOID SourceAddress,
1451 IN PEPROCESS TargetProcess,
1452 OUT PVOID TargetAddress,
1453 IN SIZE_T BufferSize,
1454 IN KPROCESSOR_MODE PreviousMode,
1455 OUT PSIZE_T ReturnSize);
1456