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