ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

mm.h
Go to the documentation of this file.
00001 #pragma once
00002 
00003 #include <internal/arch/mm.h>
00004 
00005 /* TYPES *********************************************************************/
00006 
00007 struct _EPROCESS;
00008 
00009 extern PMMSUPPORT MmKernelAddressSpace;
00010 extern PFN_COUNT MiFreeSwapPages;
00011 extern PFN_COUNT MiUsedSwapPages;
00012 extern SIZE_T MmTotalPagedPoolQuota;
00013 extern SIZE_T MmTotalNonPagedPoolQuota;
00014 extern PHYSICAL_ADDRESS MmSharedDataPagePhysicalAddress;
00015 extern PFN_COUNT MmNumberOfPhysicalPages;
00016 extern UCHAR MmDisablePagingExecutive;
00017 extern PFN_NUMBER MmLowestPhysicalPage;
00018 extern PFN_NUMBER MmHighestPhysicalPage;
00019 extern PFN_NUMBER MmAvailablePages;
00020 extern PFN_NUMBER MmResidentAvailablePages;
00021 
00022 extern PMEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptor;
00023 extern MEMORY_ALLOCATION_DESCRIPTOR MiFreeDescriptorOrg;
00024 
00025 extern LIST_ENTRY MmLoadedUserImageList;
00026 
00027 extern KMUTANT MmSystemLoadLock;
00028 
00029 extern ULONG MmNumberOfPagingFiles;
00030 
00031 extern PVOID MmUnloadedDrivers;
00032 extern PVOID MmLastUnloadedDrivers;
00033 extern PVOID MmTriageActionTaken;
00034 extern PVOID KernelVerifier;
00035 extern MM_DRIVER_VERIFIER_DATA MmVerifierData;
00036 
00037 extern SIZE_T MmTotalCommitLimit;
00038 extern SIZE_T MmTotalCommittedPages;
00039 extern SIZE_T MmSharedCommit;
00040 extern SIZE_T MmDriverCommit;
00041 extern SIZE_T MmProcessCommit;
00042 extern SIZE_T MmPagedPoolCommit;
00043 extern SIZE_T MmPeakCommitment;
00044 extern SIZE_T MmtotalCommitLimitMaximum;
00045 
00046 extern PVOID MiDebugMapping;
00047 extern PMMPTE MmDebugPte;
00048 
00049 struct _KTRAP_FRAME;
00050 struct _EPROCESS;
00051 struct _MM_RMAP_ENTRY;
00052 typedef ULONG_PTR SWAPENTRY;
00053 
00054 //
00055 // MmDbgCopyMemory Flags
00056 //
00057 #define MMDBG_COPY_WRITE            0x00000001
00058 #define MMDBG_COPY_PHYSICAL         0x00000002
00059 #define MMDBG_COPY_UNSAFE           0x00000004
00060 #define MMDBG_COPY_CACHED           0x00000008
00061 #define MMDBG_COPY_UNCACHED         0x00000010
00062 #define MMDBG_COPY_WRITE_COMBINED   0x00000020
00063 
00064 //
00065 // Maximum chunk size per copy
00066 //
00067 #define MMDBG_COPY_MAX_SIZE         0x8
00068 
00069 #if defined(_X86_)
00070 #define MI_STATIC_MEMORY_AREAS              (14)
00071 #else
00072 #define MI_STATIC_MEMORY_AREAS              (13)
00073 #endif
00074 
00075 #define MEMORY_AREA_SECTION_VIEW            (1)
00076 #define MEMORY_AREA_CACHE                   (2)
00077 #define MEMORY_AREA_OWNED_BY_ARM3           (15)
00078 #define MEMORY_AREA_STATIC                  (0x80000000)
00079 
00080 #define MM_PHYSICAL_PAGE_MPW_PENDING        (0x8)
00081 
00082 #define MM_CORE_DUMP_TYPE_NONE              (0x0)
00083 #define MM_CORE_DUMP_TYPE_MINIMAL           (0x1)
00084 #define MM_CORE_DUMP_TYPE_FULL              (0x2)
00085 
00086 /* Number of list heads to use */
00087 #define MI_FREE_POOL_LISTS 4
00088 
00089 
00090 /* Signature of free pool blocks */
00091 #define MM_FREE_POOL_TAG    'lprF'
00092 
00093 /* Although Microsoft says this isn't hardcoded anymore,
00094    they won't be able to change it. Stuff depends on it */
00095 #define MM_VIRTMEM_GRANULARITY              (64 * 1024)
00096 
00097 #define STATUS_MM_RESTART_OPERATION         ((NTSTATUS)0xD0000001)
00098 
00099 /*
00100  * Additional flags for protection attributes
00101  */
00102 #define PAGE_WRITETHROUGH                   (1024)
00103 #define PAGE_SYSTEM                         (2048)
00104 
00105 #define SEC_PHYSICALMEMORY                  (0x80000000)
00106 
00107 #define MM_PAGEFILE_SEGMENT                 (0x1)
00108 #define MM_DATAFILE_SEGMENT                 (0x2)
00109 
00110 #define MC_CACHE                            (0)
00111 #define MC_USER                             (1)
00112 #define MC_SYSTEM                           (2)
00113 #define MC_MAXIMUM                          (3)
00114 
00115 #define PAGED_POOL_MASK                     1
00116 #define MUST_SUCCEED_POOL_MASK              2
00117 #define CACHE_ALIGNED_POOL_MASK             4
00118 #define QUOTA_POOL_MASK                     8
00119 #define SESSION_POOL_MASK                   32
00120 #define VERIFIER_POOL_MASK                  64
00121 
00122 #define MM_PAGED_POOL_SIZE                  (100*1024*1024)
00123 #define MM_NONPAGED_POOL_SIZE               (100*1024*1024)
00124 
00125 /*
00126  * Paged and non-paged pools are 8-byte aligned
00127  */
00128 #define MM_POOL_ALIGNMENT                   8
00129 
00130 #define MM_ROUND_UP(x,s)                    \
00131     ((PVOID)(((ULONG_PTR)(x)+(s)-1) & ~((ULONG_PTR)(s)-1)))
00132 
00133 #define MM_ROUND_DOWN(x,s)                  \
00134     ((PVOID)(((ULONG_PTR)(x)) & ~((ULONG_PTR)(s)-1)))
00135 
00136 #define PAGE_FLAGS_VALID_FROM_USER_MODE     \
00137     (PAGE_READONLY | \
00138     PAGE_READWRITE | \
00139     PAGE_WRITECOPY | \
00140     PAGE_EXECUTE | \
00141     PAGE_EXECUTE_READ | \
00142     PAGE_EXECUTE_READWRITE | \
00143     PAGE_EXECUTE_WRITECOPY | \
00144     PAGE_GUARD | \
00145     PAGE_NOACCESS | \
00146     PAGE_NOCACHE)
00147 
00148 #define PAGE_FLAGS_VALID_FOR_SECTION \
00149     (PAGE_READONLY | \
00150      PAGE_READWRITE | \
00151      PAGE_WRITECOPY | \
00152      PAGE_EXECUTE | \
00153      PAGE_EXECUTE_READ | \
00154      PAGE_EXECUTE_READWRITE | \
00155      PAGE_EXECUTE_WRITECOPY | \
00156      PAGE_NOACCESS)
00157 
00158 #define PAGE_IS_READABLE                    \
00159     (PAGE_READONLY | \
00160     PAGE_READWRITE | \
00161     PAGE_WRITECOPY | \
00162     PAGE_EXECUTE_READ | \
00163     PAGE_EXECUTE_READWRITE | \
00164     PAGE_EXECUTE_WRITECOPY)
00165 
00166 #define PAGE_IS_WRITABLE                    \
00167     (PAGE_READWRITE | \
00168     PAGE_WRITECOPY | \
00169     PAGE_EXECUTE_READWRITE | \
00170     PAGE_EXECUTE_WRITECOPY)
00171 
00172 #define PAGE_IS_EXECUTABLE                  \
00173     (PAGE_EXECUTE | \
00174     PAGE_EXECUTE_READ | \
00175     PAGE_EXECUTE_READWRITE | \
00176     PAGE_EXECUTE_WRITECOPY)
00177 
00178 #define PAGE_IS_WRITECOPY                   \
00179     (PAGE_WRITECOPY | \
00180     PAGE_EXECUTE_WRITECOPY)
00181 
00182 
00183 #define InterlockedCompareExchangePte(PointerPte, Exchange, Comperand) \
00184     InterlockedCompareExchange((PLONG)(PointerPte), Exchange, Comperand)
00185 
00186 #define InterlockedExchangePte(PointerPte, Value) \
00187     InterlockedExchange((PLONG)(PointerPte), Value)
00188 
00189 typedef struct _MM_SECTION_SEGMENT
00190 {
00191     FAST_MUTEX Lock;        /* lock which protects the page directory */
00192     PFILE_OBJECT FileObject;
00193     LARGE_INTEGER RawLength;        /* length of the segment which is part of the mapped file */
00194     LARGE_INTEGER Length;           /* absolute length of the segment */
00195     ULONG ReferenceCount;
00196     ULONG CacheCount;
00197     ULONG Protection;
00198     ULONG Flags;
00199     BOOLEAN WriteCopy;
00200     BOOLEAN Locked;
00201 
00202     struct
00203     {
00204         ULONGLONG FileOffset;       /* start offset into the file for image sections */
00205         ULONG_PTR VirtualAddress;   /* start offset into the address range for image sections */
00206         ULONG Characteristics;
00207     } Image;
00208 
00209     LIST_ENTRY ListOfSegments;
00210     RTL_GENERIC_TABLE PageTable;
00211 } MM_SECTION_SEGMENT, *PMM_SECTION_SEGMENT;
00212 
00213 typedef struct _MM_IMAGE_SECTION_OBJECT
00214 {
00215     ULONG_PTR ImageBase;
00216     ULONG_PTR StackReserve;
00217     ULONG_PTR StackCommit;
00218     ULONG_PTR EntryPoint;
00219     USHORT Subsystem;
00220     USHORT ImageCharacteristics;
00221     USHORT MinorSubsystemVersion;
00222     USHORT MajorSubsystemVersion;
00223     USHORT Machine;
00224     BOOLEAN Executable;
00225     ULONG NrSegments;
00226     ULONG ImageSize;
00227     PMM_SECTION_SEGMENT Segments;
00228 } MM_IMAGE_SECTION_OBJECT, *PMM_IMAGE_SECTION_OBJECT;
00229 
00230 typedef struct _ROS_SECTION_OBJECT
00231 {
00232     CSHORT Type;
00233     CSHORT Size;
00234     LARGE_INTEGER MaximumSize;
00235     ULONG SectionPageProtection;
00236     ULONG AllocationAttributes;
00237     PFILE_OBJECT FileObject;
00238     union
00239     {
00240         PMM_IMAGE_SECTION_OBJECT ImageSection;
00241         PMM_SECTION_SEGMENT Segment;
00242     };
00243 } ROS_SECTION_OBJECT, *PROS_SECTION_OBJECT;
00244 
00245 typedef struct _MEMORY_AREA
00246 {
00247     PVOID StartingAddress;
00248     PVOID EndingAddress;
00249     struct _MEMORY_AREA *Parent;
00250     struct _MEMORY_AREA *LeftChild;
00251     struct _MEMORY_AREA *RightChild;
00252     ULONG Type;
00253     ULONG Protect;
00254     ULONG Flags;
00255     BOOLEAN DeleteInProgress;
00256     ULONG PageOpCount;
00257     PVOID Vad;
00258     union
00259     {
00260         struct
00261         {
00262             ROS_SECTION_OBJECT* Section;
00263             LARGE_INTEGER ViewOffset;
00264             PMM_SECTION_SEGMENT Segment;
00265             LIST_ENTRY RegionListHead;
00266         } SectionData;
00267         struct
00268         {
00269             LIST_ENTRY RegionListHead;
00270         } VirtualMemoryData;
00271     } Data;
00272 } MEMORY_AREA, *PMEMORY_AREA;
00273 
00274 typedef struct _MM_RMAP_ENTRY
00275 {
00276    struct _MM_RMAP_ENTRY* Next;
00277    PEPROCESS Process;
00278    PVOID Address;
00279 #if DBG
00280    PVOID Caller;
00281 #endif
00282 }
00283 MM_RMAP_ENTRY, *PMM_RMAP_ENTRY;
00284 
00285 #if MI_TRACE_PFNS
00286 extern ULONG MI_PFN_CURRENT_USAGE;
00287 extern CHAR MI_PFN_CURRENT_PROCESS_NAME[16];
00288 #define MI_SET_USAGE(x)     MI_PFN_CURRENT_USAGE = x
00289 #define MI_SET_PROCESS2(x)  memcpy(MI_PFN_CURRENT_PROCESS_NAME, x, 16)
00290 #else
00291 #define MI_SET_USAGE(x)
00292 #define MI_SET_PROCESS2(x)
00293 #endif
00294 
00295 typedef enum _MI_PFN_USAGES
00296 {
00297     MI_USAGE_NOT_SET = 0,
00298     MI_USAGE_PAGED_POOL,
00299     MI_USAGE_NONPAGED_POOL,
00300     MI_USAGE_NONPAGED_POOL_EXPANSION,
00301     MI_USAGE_KERNEL_STACK,
00302     MI_USAGE_KERNEL_STACK_EXPANSION,
00303     MI_USAGE_SYSTEM_PTE,
00304     MI_USAGE_VAD,
00305     MI_USAGE_PEB_TEB,
00306     MI_USAGE_SECTION,
00307     MI_USAGE_PAGE_TABLE,
00308     MI_USAGE_PAGE_DIRECTORY,
00309     MI_USAGE_LEGACY_PAGE_DIRECTORY,
00310     MI_USAGE_DRIVER_PAGE,
00311     MI_USAGE_CONTINOUS_ALLOCATION,
00312     MI_USAGE_MDL,
00313     MI_USAGE_DEMAND_ZERO,
00314     MI_USAGE_ZERO_LOOP,
00315     MI_USAGE_CACHE,
00316     MI_USAGE_PFN_DATABASE,
00317     MI_USAGE_BOOT_DRIVER,
00318     MI_USAGE_INIT_MEMORY,
00319     MI_USAGE_FREE_PAGE
00320 } MI_PFN_USAGES;
00321 
00322 //
00323 // These two mappings are actually used by Windows itself, based on the ASSERTS
00324 //
00325 #define StartOfAllocation ReadInProgress
00326 #define EndOfAllocation WriteInProgress
00327 
00328 typedef struct _MMPFNENTRY
00329 {
00330     USHORT Modified:1;
00331     USHORT ReadInProgress:1;                 // StartOfAllocation
00332     USHORT WriteInProgress:1;                // EndOfAllocation
00333     USHORT PrototypePte:1;
00334     USHORT PageColor:4;
00335     USHORT PageLocation:3;
00336     USHORT RemovalRequested:1;
00337     USHORT CacheAttribute:2;
00338     USHORT Rom:1;
00339     USHORT ParityError:1;                    // HasRmap
00340 } MMPFNENTRY;
00341 
00342 typedef struct _MMPFN
00343 {
00344     union
00345     {
00346         PFN_NUMBER Flink;
00347         ULONG WsIndex;                       // SavedSwapEntry
00348         PKEVENT Event;
00349         NTSTATUS ReadStatus;
00350         SINGLE_LIST_ENTRY NextStackPfn;
00351     } u1;
00352     PMMPTE PteAddress;
00353     union
00354     {
00355         PFN_NUMBER Blink;
00356         ULONG_PTR ShareCount;
00357     } u2;
00358     union
00359     {
00360         struct
00361         {
00362             USHORT ReferenceCount;           // ReferenceCount
00363             MMPFNENTRY e1;
00364         };
00365         struct
00366         {
00367             USHORT ReferenceCount;
00368             USHORT ShortFlags;
00369         } e2;
00370     } u3;
00371     union
00372     {
00373         MMPTE OriginalPte;
00374         LONG AweReferenceCount;              // RmapListHead
00375     };
00376     union
00377     {
00378         ULONG_PTR EntireFrame;
00379         struct
00380         {
00381             ULONG_PTR PteFrame:25;
00382             ULONG_PTR InPageError:1;
00383             ULONG_PTR VerifierAllocation:1;
00384             ULONG_PTR AweAllocation:1;
00385             ULONG_PTR Priority:3;
00386             ULONG_PTR MustBeCached:1;
00387         };
00388     } u4;
00389 #if MI_TRACE_PFNS
00390     MI_PFN_USAGES PfnUsage;
00391     CHAR ProcessName[16];
00392 #endif
00393 } MMPFN, *PMMPFN;
00394 
00395 extern PMMPFN MmPfnDatabase;
00396 
00397 typedef struct _MMPFNLIST
00398 {
00399     PFN_NUMBER Total;
00400     MMLISTS ListName;
00401     PFN_NUMBER Flink;
00402     PFN_NUMBER Blink;
00403 } MMPFNLIST, *PMMPFNLIST;
00404 
00405 extern MMPFNLIST MmZeroedPageListHead;
00406 extern MMPFNLIST MmFreePageListHead;
00407 extern MMPFNLIST MmStandbyPageListHead;
00408 extern MMPFNLIST MmModifiedPageListHead;
00409 extern MMPFNLIST MmModifiedNoWritePageListHead;
00410 
00411 typedef struct _MM_MEMORY_CONSUMER
00412 {
00413     ULONG PagesUsed;
00414     ULONG PagesTarget;
00415     NTSTATUS (*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed);
00416 } MM_MEMORY_CONSUMER, *PMM_MEMORY_CONSUMER;
00417 
00418 typedef struct _MM_REGION
00419 {
00420     ULONG Type;
00421     ULONG Protect;
00422     SIZE_T Length;
00423     LIST_ENTRY RegionListEntry;
00424 } MM_REGION, *PMM_REGION;
00425 
00426 /* Entry describing free pool memory */
00427 typedef struct _MMFREE_POOL_ENTRY
00428 {
00429     LIST_ENTRY List;
00430     PFN_COUNT Size;
00431     ULONG Signature;
00432     struct _MMFREE_POOL_ENTRY *Owner;
00433 } MMFREE_POOL_ENTRY, *PMMFREE_POOL_ENTRY;
00434 
00435 /* Signature of a freed block */
00436 #define MM_FREE_POOL_SIGNATURE 'ARM3'
00437 
00438 /* Paged pool information */
00439 typedef struct _MM_PAGED_POOL_INFO
00440 {
00441     PRTL_BITMAP PagedPoolAllocationMap;
00442     PRTL_BITMAP EndOfPagedPoolBitmap;
00443     PMMPTE FirstPteForPagedPool;
00444     PMMPTE LastPteForPagedPool;
00445     PMMPDE NextPdeForPagedPoolExpansion;
00446     ULONG PagedPoolHint;
00447     SIZE_T PagedPoolCommit;
00448     SIZE_T AllocatedPagedPool;
00449 } MM_PAGED_POOL_INFO, *PMM_PAGED_POOL_INFO;
00450 
00451 extern MM_MEMORY_CONSUMER MiMemoryConsumers[MC_MAXIMUM];
00452 
00453 typedef VOID
00454 (*PMM_ALTER_REGION_FUNC)(
00455     PMMSUPPORT AddressSpace,
00456     PVOID BaseAddress,
00457     SIZE_T Length,
00458     ULONG OldType,
00459     ULONG OldProtect,
00460     ULONG NewType,
00461     ULONG NewProtect
00462 );
00463 
00464 typedef VOID
00465 (*PMM_FREE_PAGE_FUNC)(
00466     PVOID Context,
00467     PMEMORY_AREA MemoryArea,
00468     PVOID Address,
00469     PFN_NUMBER Page,
00470     SWAPENTRY SwapEntry,
00471     BOOLEAN Dirty
00472 );
00473 
00474 //
00475 // Mm copy support for Kd
00476 //
00477 NTSTATUS
00478 NTAPI
00479 MmDbgCopyMemory(
00480     IN ULONG64 Address,
00481     IN PVOID Buffer,
00482     IN ULONG Size,
00483     IN ULONG Flags
00484 );
00485 
00486 //
00487 // Determines if a given address is a session address
00488 //
00489 BOOLEAN
00490 NTAPI
00491 MmIsSessionAddress(
00492     IN PVOID Address
00493 );
00494 
00495 /* marea.c *******************************************************************/
00496 
00497 NTSTATUS
00498 NTAPI
00499 MmCreateMemoryArea(
00500     PMMSUPPORT AddressSpace,
00501     ULONG Type,
00502     PVOID *BaseAddress,
00503     SIZE_T Length,
00504     ULONG Protection,
00505     PMEMORY_AREA *Result,
00506     BOOLEAN FixedAddress,
00507     ULONG AllocationFlags,
00508     PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL
00509 );
00510 
00511 PMEMORY_AREA
00512 NTAPI
00513 MmLocateMemoryAreaByAddress(
00514     PMMSUPPORT AddressSpace,
00515     PVOID Address
00516 );
00517 
00518 ULONG_PTR
00519 NTAPI
00520 MmFindGapAtAddress(
00521     PMMSUPPORT AddressSpace,
00522     PVOID Address
00523 );
00524 
00525 NTSTATUS
00526 NTAPI
00527 MmFreeMemoryArea(
00528     PMMSUPPORT AddressSpace,
00529     PMEMORY_AREA MemoryArea,
00530     PMM_FREE_PAGE_FUNC FreePage,
00531     PVOID FreePageContext
00532 );
00533 
00534 NTSTATUS
00535 NTAPI
00536 MmFreeMemoryAreaByPtr(
00537     PMMSUPPORT AddressSpace,
00538     PVOID BaseAddress,
00539     PMM_FREE_PAGE_FUNC FreePage,
00540     PVOID FreePageContext
00541 );
00542 
00543 VOID
00544 NTAPI
00545 MmDumpMemoryAreas(PMMSUPPORT AddressSpace);
00546 
00547 PMEMORY_AREA
00548 NTAPI
00549 MmLocateMemoryAreaByRegion(
00550     PMMSUPPORT AddressSpace,
00551     PVOID Address,
00552     SIZE_T Length
00553 );
00554 
00555 PVOID
00556 NTAPI
00557 MmFindGap(
00558     PMMSUPPORT AddressSpace,
00559     SIZE_T Length,
00560     ULONG_PTR Granularity,
00561     BOOLEAN TopDown
00562 );
00563 
00564 VOID
00565 NTAPI
00566 MmReleaseMemoryAreaIfDecommitted(
00567     struct _EPROCESS *Process,
00568     PMMSUPPORT AddressSpace,
00569     PVOID BaseAddress
00570 );
00571 
00572 VOID
00573 NTAPI
00574 MmMapMemoryArea(PVOID BaseAddress,
00575                 SIZE_T Length,
00576                 ULONG Consumer,
00577                 ULONG Protection);
00578 
00579 /* npool.c *******************************************************************/
00580 
00581 VOID
00582 NTAPI
00583 MiDebugDumpNonPagedPool(BOOLEAN NewOnly);
00584 
00585 VOID
00586 NTAPI
00587 MiDebugDumpNonPagedPoolStats(BOOLEAN NewOnly);
00588 
00589 VOID
00590 NTAPI
00591 MiInitializeNonPagedPool(VOID);
00592 
00593 PVOID
00594 NTAPI
00595 MiAllocatePoolPages(
00596     IN POOL_TYPE PoolType,
00597     IN SIZE_T SizeInBytes
00598 );
00599 
00600 POOL_TYPE
00601 NTAPI
00602 MmDeterminePoolType(
00603     IN PVOID VirtualAddress
00604 );
00605 
00606 ULONG
00607 NTAPI
00608 MiFreePoolPages(
00609     IN PVOID StartingAddress
00610 );
00611 
00612 PVOID
00613 NTAPI
00614 MmGetMdlPageAddress(
00615     PMDL Mdl,
00616     PVOID Offset
00617 );
00618 
00619 /* pool.c *******************************************************************/
00620 
00621 PVOID
00622 NTAPI
00623 ExAllocateNonPagedPoolWithTag(
00624     POOL_TYPE type,
00625     ULONG size,
00626     ULONG Tag,
00627     PVOID Caller
00628 );
00629 
00630 PVOID
00631 NTAPI
00632 ExAllocatePagedPoolWithTag(
00633     POOL_TYPE Type,
00634     ULONG size,
00635     ULONG Tag
00636 );
00637 
00638 VOID
00639 NTAPI
00640 ExFreeNonPagedPool(PVOID block);
00641 
00642 VOID
00643 NTAPI
00644 ExFreePagedPool(IN PVOID Block);
00645 
00646 BOOLEAN
00647 NTAPI
00648 ExpIsPoolTagDebuggable(ULONG Tag);
00649 
00650 PVOID
00651 NTAPI
00652 ExpAllocateDebugPool(
00653     POOL_TYPE Type,
00654     ULONG Size,
00655     ULONG Tag,
00656     PVOID Caller,
00657     BOOLEAN EndOfPage
00658 );
00659 
00660 VOID
00661 NTAPI
00662 ExpFreeDebugPool(PVOID Block, BOOLEAN PagedPool);
00663 
00664 VOID
00665 NTAPI
00666 MmInitializePagedPool(VOID);
00667 
00668 PVOID
00669 NTAPI
00670 MiAllocateSpecialPool(
00671     IN POOL_TYPE PoolType,
00672     IN SIZE_T NumberOfBytes,
00673     IN ULONG Tag,
00674     IN ULONG Underrun
00675 );
00676 
00677 BOOLEAN
00678 NTAPI
00679 MiRaisePoolQuota(
00680     IN POOL_TYPE PoolType,
00681     IN ULONG CurrentMaxQuota,
00682     OUT PULONG NewMaxQuota
00683 );
00684 
00685 /* mdl.c *********************************************************************/
00686 
00687 VOID
00688 NTAPI
00689 MmBuildMdlFromPages(
00690     PMDL Mdl,
00691     PPFN_NUMBER Pages
00692 );
00693 
00694 /* mminit.c ******************************************************************/
00695 
00696 VOID
00697 NTAPI
00698 MiShutdownMemoryManager(VOID);
00699 
00700 VOID
00701 NTAPI
00702 MmInit1(
00703     VOID
00704 );
00705 
00706 BOOLEAN
00707 NTAPI
00708 MmInitSystem(IN ULONG Phase,
00709              IN PLOADER_PARAMETER_BLOCK LoaderBlock);
00710 
00711 VOID
00712 NTAPI
00713 MiFreeInitMemory(VOID);
00714 
00715 VOID
00716 NTAPI
00717 MmInitializeMdlImplementation(VOID);
00718 
00719 /* pagefile.c ****************************************************************/
00720 
00721 SWAPENTRY
00722 NTAPI
00723 MmAllocSwapPage(VOID);
00724 
00725 VOID
00726 NTAPI
00727 MmDereserveSwapPages(ULONG Nr);
00728 
00729 VOID
00730 NTAPI
00731 MmFreeSwapPage(SWAPENTRY Entry);
00732 
00733 VOID
00734 NTAPI
00735 MmInitPagingFile(VOID);
00736 
00737 BOOLEAN
00738 NTAPI
00739 MmIsFileObjectAPagingFile(PFILE_OBJECT FileObject);
00740 
00741 NTSTATUS
00742 NTAPI
00743 MmReadFromSwapPage(
00744     SWAPENTRY SwapEntry,
00745     PFN_NUMBER Page
00746 );
00747 
00748 BOOLEAN
00749 NTAPI
00750 MmReserveSwapPages(ULONG Nr);
00751 
00752 NTSTATUS
00753 NTAPI
00754 MmWriteToSwapPage(
00755     SWAPENTRY SwapEntry,
00756     PFN_NUMBER Page
00757 );
00758 
00759 NTSTATUS
00760 NTAPI
00761 MmDumpToPagingFile(
00762     ULONG BugCode,
00763     ULONG BugCodeParameter1,
00764     ULONG BugCodeParameter2,
00765     ULONG BugCodeParameter3,
00766     ULONG BugCodeParameter4,
00767     struct _KTRAP_FRAME* TrapFrame
00768 );
00769 
00770 BOOLEAN
00771 NTAPI
00772 MmIsAvailableSwapPage(VOID);
00773 
00774 VOID
00775 NTAPI
00776 MmShowOutOfSpaceMessagePagingFile(VOID);
00777 
00778 /* process.c ****************************************************************/
00779 
00780 NTSTATUS
00781 NTAPI
00782 MmInitializeProcessAddressSpace(
00783     IN PEPROCESS Process,
00784     IN PEPROCESS Clone OPTIONAL,
00785     IN PVOID Section OPTIONAL,
00786     IN OUT PULONG Flags,
00787     IN POBJECT_NAME_INFORMATION *AuditName OPTIONAL
00788 );
00789 
00790 NTSTATUS
00791 NTAPI
00792 MmCreatePeb(
00793     IN PEPROCESS Process,
00794     IN PINITIAL_PEB InitialPeb,
00795     OUT PPEB *BasePeb
00796 );
00797 
00798 NTSTATUS
00799 NTAPI
00800 MmCreateTeb(
00801     IN PEPROCESS Process,
00802     IN PCLIENT_ID ClientId,
00803     IN PINITIAL_TEB InitialTeb,
00804     OUT PTEB* BaseTeb
00805 );
00806 
00807 VOID
00808 NTAPI
00809 MmDeleteTeb(
00810     struct _EPROCESS *Process,
00811     PTEB Teb
00812 );
00813 
00814 VOID
00815 NTAPI
00816 MmCleanProcessAddressSpace(IN PEPROCESS Process);
00817 
00818 NTSTATUS
00819 NTAPI
00820 MmDeleteProcessAddressSpace(IN PEPROCESS Process);
00821 
00822 ULONG
00823 NTAPI
00824 MmGetSessionLocaleId(VOID);
00825 
00826 NTSTATUS
00827 NTAPI
00828 MmSetMemoryPriorityProcess(
00829     IN PEPROCESS Process,
00830     IN UCHAR MemoryPriority
00831 );
00832 
00833 /* i386/pfault.c *************************************************************/
00834 
00835 NTSTATUS
00836 NTAPI
00837 MmPageFault(
00838     ULONG Cs,
00839     PULONG Eip,
00840     PULONG Eax,
00841     ULONG Cr2,
00842     ULONG ErrorCode
00843 );
00844 
00845 /* special.c *****************************************************************/
00846 
00847 VOID
00848 NTAPI
00849 MiInitializeSpecialPool();
00850 
00851 BOOLEAN
00852 NTAPI
00853 MmUseSpecialPool(
00854     IN SIZE_T NumberOfBytes,
00855     IN ULONG Tag);
00856 
00857 BOOLEAN
00858 NTAPI
00859 MmIsSpecialPoolAddress(
00860     IN PVOID P);
00861 
00862 PVOID
00863 NTAPI
00864 MmAllocateSpecialPool(
00865     IN SIZE_T NumberOfBytes,
00866     IN ULONG Tag,
00867     IN POOL_TYPE PoolType,
00868     IN ULONG SpecialType);
00869 
00870 VOID
00871 NTAPI
00872 MmFreeSpecialPool(
00873     IN PVOID P);
00874 
00875 /* mm.c **********************************************************************/
00876 
00877 NTSTATUS
00878 NTAPI
00879 MmAccessFault(
00880     IN BOOLEAN StoreInstruction,
00881     IN PVOID Address,
00882     IN KPROCESSOR_MODE Mode,
00883     IN PVOID TrapInformation
00884 );
00885 
00886 /* anonmem.c *****************************************************************/
00887 
00888 NTSTATUS
00889 NTAPI
00890 MmNotPresentFaultVirtualMemory(
00891     PMMSUPPORT AddressSpace,
00892     MEMORY_AREA* MemoryArea,
00893     PVOID Address
00894 );
00895 
00896 NTSTATUS
00897 NTAPI
00898 MmPageOutVirtualMemory(
00899     PMMSUPPORT AddressSpace,
00900     PMEMORY_AREA MemoryArea,
00901     PVOID Address,
00902     PFN_NUMBER Page
00903 );
00904 
00905 NTSTATUS
00906 NTAPI
00907 MmQueryAnonMem(
00908     PMEMORY_AREA MemoryArea,
00909     PVOID Address,
00910     PMEMORY_BASIC_INFORMATION Info,
00911     PSIZE_T ResultLength
00912 );
00913 
00914 VOID
00915 NTAPI
00916 MmFreeVirtualMemory(
00917     struct _EPROCESS* Process,
00918     PMEMORY_AREA MemoryArea
00919 );
00920 
00921 NTSTATUS
00922 NTAPI
00923 MmProtectAnonMem(
00924     PMMSUPPORT AddressSpace,
00925     PMEMORY_AREA MemoryArea,
00926     PVOID BaseAddress,
00927     SIZE_T Length,
00928     ULONG Protect,
00929     PULONG OldProtect
00930 );
00931 
00932 NTSTATUS
00933 NTAPI
00934 MmWritePageVirtualMemory(
00935     PMMSUPPORT AddressSpace,
00936     PMEMORY_AREA MArea,
00937     PVOID Address,
00938     PFN_NUMBER Page
00939 );
00940 
00941 /* kmap.c ********************************************************************/
00942 
00943 PVOID
00944 NTAPI
00945 ExAllocatePage(VOID);
00946 
00947 VOID
00948 NTAPI
00949 ExUnmapPage(PVOID Addr);
00950 
00951 PVOID
00952 NTAPI
00953 ExAllocatePageWithPhysPage(PFN_NUMBER Page);
00954 
00955 NTSTATUS
00956 NTAPI
00957 MiCopyFromUserPage(
00958     PFN_NUMBER NewPage,
00959     PFN_NUMBER OldPage
00960 );
00961 
00962 NTSTATUS
00963 NTAPI
00964 MiZeroPage(PFN_NUMBER Page);
00965 
00966 /* memsafe.s *****************************************************************/
00967 
00968 PVOID
00969 FASTCALL
00970 MmSafeReadPtr(PVOID Source);
00971 
00972 /* process.c *****************************************************************/
00973 
00974 PVOID
00975 NTAPI
00976 MmCreateKernelStack(BOOLEAN GuiStack, UCHAR Node);
00977 
00978 VOID
00979 NTAPI
00980 MmDeleteKernelStack(PVOID Stack,
00981                     BOOLEAN GuiStack);
00982 
00983 /* balace.c ******************************************************************/
00984 
00985 VOID
00986 NTAPI
00987 MmInitializeMemoryConsumer(
00988     ULONG Consumer,
00989     NTSTATUS (*Trim)(ULONG Target, ULONG Priority, PULONG NrFreed)
00990 );
00991 
00992 VOID
00993 NTAPI
00994 MmInitializeBalancer(
00995     ULONG NrAvailablePages,
00996     ULONG NrSystemPages
00997 );
00998 
00999 NTSTATUS
01000 NTAPI
01001 MmReleasePageMemoryConsumer(
01002     ULONG Consumer,
01003     PFN_NUMBER Page
01004 );
01005 
01006 NTSTATUS
01007 NTAPI
01008 MmRequestPageMemoryConsumer(
01009     ULONG Consumer,
01010     BOOLEAN MyWait,
01011     PPFN_NUMBER AllocatedPage
01012 );
01013 
01014 VOID
01015 NTAPI
01016 MiInitBalancerThread(VOID);
01017 
01018 VOID
01019 NTAPI
01020 MmRebalanceMemoryConsumers(VOID);
01021 
01022 /* rmap.c **************************************************************/
01023 
01024 VOID
01025 NTAPI
01026 MmSetRmapListHeadPage(
01027     PFN_NUMBER Page,
01028     struct _MM_RMAP_ENTRY* ListHead
01029 );
01030 
01031 struct _MM_RMAP_ENTRY*
01032 NTAPI
01033 MmGetRmapListHeadPage(PFN_NUMBER Page);
01034 
01035 VOID
01036 NTAPI
01037 MmInsertRmap(
01038     PFN_NUMBER Page,
01039     struct _EPROCESS *Process,
01040     PVOID Address
01041 );
01042 
01043 VOID
01044 NTAPI
01045 MmDeleteAllRmaps(
01046     PFN_NUMBER Page,
01047     PVOID Context,
01048     VOID (*DeleteMapping)(PVOID Context, struct _EPROCESS *Process, PVOID Address)
01049 );
01050 
01051 VOID
01052 NTAPI
01053 MmDeleteRmap(
01054     PFN_NUMBER Page,
01055     struct _EPROCESS *Process,
01056     PVOID Address
01057 );
01058 
01059 VOID
01060 NTAPI
01061 MmInitializeRmapList(VOID);
01062 
01063 VOID
01064 NTAPI
01065 MmSetCleanAllRmaps(PFN_NUMBER Page);
01066 
01067 VOID
01068 NTAPI
01069 MmSetDirtyAllRmaps(PFN_NUMBER Page);
01070 
01071 BOOLEAN
01072 NTAPI
01073 MmIsDirtyPageRmap(PFN_NUMBER Page);
01074 
01075 NTSTATUS
01076 NTAPI
01077 MmPageOutPhysicalAddress(PFN_NUMBER Page);
01078 
01079 /* freelist.c **********************************************************/
01080 
01081 FORCEINLINE
01082 PMMPFN
01083 MiGetPfnEntry(IN PFN_NUMBER Pfn)
01084 {
01085     PMMPFN Page;
01086     extern RTL_BITMAP MiPfnBitMap;
01087 
01088     /* Make sure the PFN number is valid */
01089     if (Pfn > MmHighestPhysicalPage) return NULL;
01090 
01091     /* Make sure this page actually has a PFN entry */
01092     if ((MiPfnBitMap.Buffer) && !(RtlTestBit(&MiPfnBitMap, (ULONG)Pfn))) return NULL;
01093 
01094     /* Get the entry */
01095     Page = &MmPfnDatabase[Pfn];
01096 
01097     /* Return it */
01098     return Page;
01099 };
01100 
01101 FORCEINLINE
01102 PFN_NUMBER
01103 MiGetPfnEntryIndex(IN PMMPFN Pfn1)
01104 {
01105     //
01106     // This will return the Page Frame Number (PFN) from the MMPFN
01107     //
01108     return Pfn1 - MmPfnDatabase;
01109 }
01110 
01111 PFN_NUMBER
01112 NTAPI
01113 MmGetLRUNextUserPage(PFN_NUMBER PreviousPage);
01114 
01115 PFN_NUMBER
01116 NTAPI
01117 MmGetLRUFirstUserPage(VOID);
01118 
01119 VOID
01120 NTAPI
01121 MmInsertLRULastUserPage(PFN_NUMBER Page);
01122 
01123 VOID
01124 NTAPI
01125 MmRemoveLRUUserPage(PFN_NUMBER Page);
01126 
01127 VOID
01128 NTAPI
01129 MmLockPage(PFN_NUMBER Page);
01130 
01131 VOID
01132 NTAPI
01133 MmUnlockPage(PFN_NUMBER Page);
01134 
01135 ULONG
01136 NTAPI
01137 MmGetLockCountPage(PFN_NUMBER Page);
01138 
01139 VOID
01140 NTAPI
01141 MmInitializePageList(
01142     VOID
01143 );
01144 
01145 VOID
01146 NTAPI
01147 MmDumpArmPfnDatabase(
01148    IN BOOLEAN StatusOnly
01149 );
01150 
01151 PFN_NUMBER
01152 NTAPI
01153 MmGetContinuousPages(
01154     ULONG NumberOfBytes,
01155     PHYSICAL_ADDRESS LowestAcceptableAddress,
01156     PHYSICAL_ADDRESS HighestAcceptableAddress,
01157     PHYSICAL_ADDRESS BoundaryAddressMultiple,
01158     BOOLEAN ZeroPages
01159 );
01160 
01161 VOID
01162 NTAPI
01163 MmZeroPageThread(
01164     VOID
01165 );
01166 
01167 /* hypermap.c *****************************************************************/
01168 
01169 extern PEPROCESS HyperProcess;
01170 extern KIRQL HyperIrql;
01171 
01172 PVOID
01173 NTAPI
01174 MiMapPageInHyperSpace(IN PEPROCESS Process,
01175                       IN PFN_NUMBER Page,
01176                       IN PKIRQL OldIrql);
01177 
01178 VOID
01179 NTAPI
01180 MiUnmapPageInHyperSpace(IN PEPROCESS Process,
01181                         IN PVOID Address,
01182                         IN KIRQL OldIrql);
01183 
01184 PVOID
01185 NTAPI
01186 MiMapPagesInZeroSpace(IN PMMPFN Pfn1,
01187                       IN PFN_NUMBER NumberOfPages);
01188 
01189 VOID
01190 NTAPI
01191 MiUnmapPagesInZeroSpace(IN PVOID VirtualAddress,
01192                         IN PFN_NUMBER NumberOfPages);
01193 
01194 //
01195 // ReactOS Compatibility Layer
01196 //
01197 FORCEINLINE
01198 PVOID
01199 MmCreateHyperspaceMapping(IN PFN_NUMBER Page)
01200 {
01201     HyperProcess = (PEPROCESS)KeGetCurrentThread()->ApcState.Process;
01202     return MiMapPageInHyperSpace(HyperProcess, Page, &HyperIrql);
01203 }
01204 
01205 #define MmDeleteHyperspaceMapping(x) MiUnmapPageInHyperSpace(HyperProcess, x, HyperIrql);
01206 
01207 /* i386/page.c *********************************************************/
01208 
01209 NTSTATUS
01210 NTAPI
01211 MmCreateVirtualMappingForKernel(
01212     PVOID Address,
01213     ULONG flProtect,
01214     PPFN_NUMBER Pages,
01215     ULONG PageCount
01216 );
01217 
01218 NTSTATUS
01219 NTAPI
01220 MmCommitPagedPoolAddress(
01221     PVOID Address,
01222     BOOLEAN Locked
01223 );
01224 
01225 NTSTATUS
01226 NTAPI
01227 MmCreateVirtualMapping(
01228     struct _EPROCESS* Process,
01229     PVOID Address,
01230     ULONG flProtect,
01231     PPFN_NUMBER Pages,
01232     ULONG PageCount
01233 );
01234 
01235 NTSTATUS
01236 NTAPI
01237 MmCreateVirtualMappingUnsafe(
01238     struct _EPROCESS* Process,
01239     PVOID Address,
01240     ULONG flProtect,
01241     PPFN_NUMBER Pages,
01242     ULONG PageCount
01243 );
01244 
01245 ULONG
01246 NTAPI
01247 MmGetPageProtect(
01248     struct _EPROCESS* Process,
01249     PVOID Address);
01250 
01251 VOID
01252 NTAPI
01253 MmSetPageProtect(
01254     struct _EPROCESS* Process,
01255     PVOID Address,
01256     ULONG flProtect
01257 );
01258 
01259 BOOLEAN
01260 NTAPI
01261 MmIsPagePresent(
01262     struct _EPROCESS* Process,
01263     PVOID Address
01264 );
01265 
01266 VOID
01267 NTAPI
01268 MmInitGlobalKernelPageDirectory(VOID);
01269 
01270 VOID
01271 NTAPI
01272 MmDisableVirtualMapping(
01273     struct _EPROCESS *Process,
01274     PVOID Address,
01275     BOOLEAN* WasDirty,
01276     PPFN_NUMBER Page
01277 );
01278 
01279 VOID
01280 NTAPI
01281 MmEnableVirtualMapping(
01282     struct _EPROCESS *Process,
01283     PVOID Address
01284 );
01285 
01286 VOID
01287 NTAPI
01288 MmRawDeleteVirtualMapping(PVOID Address);
01289 
01290 
01291 VOID
01292 NTAPI
01293 MmGetPageFileMapping(
01294     struct _EPROCESS *Process,
01295     PVOID Address,
01296     SWAPENTRY* SwapEntry);
01297 
01298 VOID
01299 NTAPI
01300 MmDeletePageFileMapping(
01301     struct _EPROCESS *Process,
01302     PVOID Address,
01303     SWAPENTRY* SwapEntry
01304 );
01305 
01306 NTSTATUS
01307 NTAPI
01308 MmCreatePageFileMapping(
01309     struct _EPROCESS *Process,
01310     PVOID Address,
01311     SWAPENTRY SwapEntry
01312 );
01313 
01314 BOOLEAN
01315 NTAPI
01316 MmIsPageSwapEntry(
01317     struct _EPROCESS *Process,
01318     PVOID Address
01319 );
01320 
01321 VOID
01322 NTAPI
01323 MmTransferOwnershipPage(
01324     PFN_NUMBER Page,
01325     ULONG NewConsumer
01326 );
01327 
01328 VOID
01329 NTAPI
01330 MmSetDirtyPage(
01331     struct _EPROCESS *Process,
01332     PVOID Address
01333 );
01334 
01335 PFN_NUMBER
01336 NTAPI
01337 MmAllocPage(
01338     ULONG Consumer
01339 );
01340 
01341 LONG
01342 NTAPI
01343 MmAllocPagesSpecifyRange(
01344     ULONG Consumer,
01345     PHYSICAL_ADDRESS LowestAddress,
01346     PHYSICAL_ADDRESS HighestAddress,
01347     ULONG NumberOfPages,
01348     PPFN_NUMBER Pages
01349 );
01350 
01351 VOID
01352 NTAPI
01353 MmDereferencePage(PFN_NUMBER Page);
01354 
01355 VOID
01356 NTAPI
01357 MmReferencePage(PFN_NUMBER Page);
01358 
01359 ULONG
01360 NTAPI
01361 MmGetReferenceCountPage(PFN_NUMBER Page);
01362 
01363 BOOLEAN
01364 NTAPI
01365 MmIsPageInUse(PFN_NUMBER Page);
01366 
01367 VOID
01368 NTAPI
01369 MmSetSavedSwapEntryPage(
01370     PFN_NUMBER Page,
01371     SWAPENTRY SavedSwapEntry);
01372 
01373 SWAPENTRY
01374 NTAPI
01375 MmGetSavedSwapEntryPage(PFN_NUMBER Page);
01376 
01377 VOID
01378 NTAPI
01379 MmSetCleanPage(
01380     struct _EPROCESS *Process,
01381     PVOID Address
01382 );
01383 
01384 NTSTATUS
01385 NTAPI
01386 MmCreatePageTable(PVOID PAddress);
01387 
01388 VOID
01389 NTAPI
01390 MmDeletePageTable(
01391     struct _EPROCESS *Process,
01392     PVOID Address
01393 );
01394 
01395 PFN_NUMBER
01396 NTAPI
01397 MmGetPfnForProcess(
01398     struct _EPROCESS *Process,
01399     PVOID Address
01400 );
01401 
01402 BOOLEAN
01403 NTAPI
01404 MmCreateProcessAddressSpace(
01405     IN ULONG MinWs,
01406     IN PEPROCESS Dest,
01407     IN PULONG_PTR DirectoryTableBase
01408 );
01409 
01410 NTSTATUS
01411 NTAPI
01412 MmInitializeHandBuiltProcess(
01413     IN PEPROCESS Process,
01414     IN PULONG_PTR DirectoryTableBase
01415 );
01416 
01417 
01418 NTSTATUS
01419 NTAPI
01420 MmInitializeHandBuiltProcess2(
01421     IN PEPROCESS Process
01422 );
01423 
01424 NTSTATUS
01425 NTAPI
01426 MmReleaseMmInfo(struct _EPROCESS *Process);
01427 
01428 NTSTATUS
01429 NTAPI
01430 MmSetExecuteOptions(IN ULONG ExecuteOptions);
01431 
01432 NTSTATUS
01433 NTAPI
01434 MmGetExecuteOptions(IN PULONG ExecuteOptions);
01435 
01436 VOID
01437 NTAPI
01438 MmDeleteProcessPageDirectory(struct _EPROCESS *Process);
01439 
01440 VOID
01441 NTAPI
01442 MmDeleteVirtualMapping(
01443     struct _EPROCESS *Process,
01444     PVOID Address,
01445     BOOLEAN FreePage,
01446     BOOLEAN* WasDirty,
01447     PPFN_NUMBER Page
01448 );
01449 
01450 BOOLEAN
01451 NTAPI
01452 MmIsDirtyPage(
01453     struct _EPROCESS *Process,
01454     PVOID Address
01455 );
01456 
01457 VOID
01458 NTAPI
01459 MmMarkPageMapped(PFN_NUMBER Page);
01460 
01461 VOID
01462 NTAPI
01463 MmMarkPageUnmapped(PFN_NUMBER Page);
01464 
01465 VOID
01466 NTAPI
01467 MmUpdatePageDir(
01468     struct _EPROCESS *Process,
01469     PVOID Address,
01470     ULONG Size
01471 );
01472 
01473 VOID
01474 NTAPI
01475 MiInitPageDirectoryMap(VOID);
01476 
01477 ULONG
01478 NTAPI
01479 MiGetUserPageDirectoryCount(VOID);
01480 
01481 /* wset.c ********************************************************************/
01482 
01483 NTSTATUS
01484 MmTrimUserMemory(
01485     ULONG Target,
01486     ULONG Priority,
01487     PULONG NrFreedPages
01488 );
01489 
01490 /* region.c ************************************************************/
01491 
01492 NTSTATUS
01493 NTAPI
01494 MmAlterRegion(
01495     PMMSUPPORT AddressSpace,
01496     PVOID BaseAddress,
01497     PLIST_ENTRY RegionListHead,
01498     PVOID StartAddress,
01499     SIZE_T Length,
01500     ULONG NewType,
01501     ULONG NewProtect,
01502     PMM_ALTER_REGION_FUNC AlterFunc
01503 );
01504 
01505 VOID
01506 NTAPI
01507 MmInitializeRegion(
01508     PLIST_ENTRY RegionListHead,
01509     SIZE_T Length,
01510     ULONG Type,
01511     ULONG Protect
01512 );
01513 
01514 PMM_REGION
01515 NTAPI
01516 MmFindRegion(
01517     PVOID BaseAddress,
01518     PLIST_ENTRY RegionListHead,
01519     PVOID Address,
01520     PVOID* RegionBaseAddress
01521 );
01522 
01523 /* section.c *****************************************************************/
01524 
01525 PFILE_OBJECT
01526 NTAPI
01527 MmGetFileObjectForSection(
01528     IN PVOID Section
01529 );
01530 NTSTATUS
01531 NTAPI
01532 MmGetFileNameForAddress(
01533     IN PVOID Address,
01534     OUT PUNICODE_STRING ModuleName
01535 );
01536 
01537 NTSTATUS
01538 NTAPI
01539 MmGetFileNameForSection(
01540     IN PVOID Section,
01541     OUT POBJECT_NAME_INFORMATION *ModuleName
01542 );
01543 
01544 PVOID
01545 NTAPI
01546 MmAllocateSection(
01547     IN SIZE_T Length,
01548     PVOID BaseAddress
01549 );
01550 
01551 NTSTATUS
01552 NTAPI
01553 MmQuerySectionView(
01554     PMEMORY_AREA MemoryArea,
01555     PVOID Address,
01556     PMEMORY_BASIC_INFORMATION Info,
01557     PSIZE_T ResultLength
01558 );
01559 
01560 NTSTATUS
01561 NTAPI
01562 MmProtectSectionView(
01563     PMMSUPPORT AddressSpace,
01564     PMEMORY_AREA MemoryArea,
01565     PVOID BaseAddress,
01566     SIZE_T Length,
01567     ULONG Protect,
01568     PULONG OldProtect
01569 );
01570 
01571 NTSTATUS
01572 NTAPI
01573 MmInitSectionImplementation(VOID);
01574 
01575 NTSTATUS
01576 NTAPI
01577 MmNotPresentFaultSectionView(
01578     PMMSUPPORT AddressSpace,
01579     MEMORY_AREA* MemoryArea,
01580     PVOID Address,
01581     BOOLEAN Locked
01582 );
01583 
01584 NTSTATUS
01585 NTAPI
01586 MmPageOutSectionView(
01587     PMMSUPPORT AddressSpace,
01588     PMEMORY_AREA MemoryArea,
01589     PVOID Address,
01590     ULONG_PTR Entry
01591 );
01592 
01593 NTSTATUS
01594 NTAPI
01595 MmCreatePhysicalMemorySection(VOID);
01596 
01597 NTSTATUS
01598 NTAPI
01599 MmAccessFaultSectionView(
01600     PMMSUPPORT AddressSpace,
01601     MEMORY_AREA* MemoryArea,
01602     PVOID Address
01603 );
01604 
01605 VOID
01606 NTAPI
01607 MmFreeSectionSegments(PFILE_OBJECT FileObject);
01608 
01609 /* mpw.c *********************************************************************/
01610 
01611 NTSTATUS
01612 NTAPI
01613 MmInitMpwThread(VOID);
01614 
01615 NTSTATUS
01616 NTAPI
01617 MmInitBsmThread(VOID);
01618 
01619 /* pager.c *******************************************************************/
01620 
01621 BOOLEAN
01622 NTAPI
01623 MiIsPagerThread(VOID);
01624 
01625 VOID
01626 NTAPI
01627 MiStartPagerThread(VOID);
01628 
01629 VOID
01630 NTAPI
01631 MiStopPagerThread(VOID);
01632 
01633 NTSTATUS
01634 FASTCALL
01635 MiQueryVirtualMemory(
01636     IN HANDLE ProcessHandle,
01637     IN PVOID Address,
01638     IN MEMORY_INFORMATION_CLASS VirtualMemoryInformationClass,
01639     OUT PVOID VirtualMemoryInformation,
01640     IN SIZE_T Length,
01641     OUT PSIZE_T ResultLength
01642 );
01643 
01644 /* sysldr.c ******************************************************************/
01645 
01646 VOID
01647 NTAPI
01648 MiReloadBootLoadedDrivers(
01649     IN PLOADER_PARAMETER_BLOCK LoaderBlock
01650 );
01651 
01652 BOOLEAN
01653 NTAPI
01654 MiInitializeLoadedModuleList(
01655     IN PLOADER_PARAMETER_BLOCK LoaderBlock
01656 );
01657 
01658 NTSTATUS
01659 NTAPI
01660 MmLoadSystemImage(
01661     IN PUNICODE_STRING FileName,
01662     IN PUNICODE_STRING NamePrefix OPTIONAL,
01663     IN PUNICODE_STRING LoadedName OPTIONAL,
01664     IN ULONG Flags,
01665     OUT PVOID *ModuleObject,
01666     OUT PVOID *ImageBaseAddress
01667 );
01668 
01669 NTSTATUS
01670 NTAPI
01671 MmUnloadSystemImage(
01672     IN PVOID ImageHandle
01673 );
01674 
01675 NTSTATUS
01676 NTAPI
01677 MmCheckSystemImage(
01678     IN HANDLE ImageHandle,
01679     IN BOOLEAN PurgeSection
01680 );
01681 
01682 NTSTATUS
01683 NTAPI
01684 MmCallDllInitialize(
01685     IN PLDR_DATA_TABLE_ENTRY LdrEntry,
01686     IN PLIST_ENTRY ListHead
01687 );
01688 
01689 
01690 /* procsup.c *****************************************************************/
01691 
01692 NTSTATUS
01693 NTAPI
01694 MmGrowKernelStack(
01695     IN PVOID StackPointer
01696 );
01697 
01698 
01699 FORCEINLINE
01700 VOID
01701 MmLockAddressSpace(PMMSUPPORT AddressSpace)
01702 {
01703     KeAcquireGuardedMutex(&CONTAINING_RECORD(AddressSpace, EPROCESS, Vm)->AddressCreationLock);
01704     //ASSERT(Thread->OwnsProcessAddressSpaceExclusive == 0);
01705     //Thread->OwnsProcessAddressSpaceExclusive = TRUE;
01706 }
01707 
01708 FORCEINLINE
01709 VOID
01710 MmUnlockAddressSpace(PMMSUPPORT AddressSpace)
01711 {
01712     //ASSERT(Thread->OwnsProcessAddressSpaceExclusive == 1);
01713     KeReleaseGuardedMutex(&CONTAINING_RECORD(AddressSpace, EPROCESS, Vm)->AddressCreationLock);
01714     //Thread->OwnsProcessAddressSpaceExclusive = 0;
01715 }
01716 
01717 FORCEINLINE
01718 PEPROCESS
01719 MmGetAddressSpaceOwner(IN PMMSUPPORT AddressSpace)
01720 {
01721     if (AddressSpace == MmKernelAddressSpace) return NULL;
01722     return CONTAINING_RECORD(AddressSpace, EPROCESS, Vm);
01723 }
01724 
01725 FORCEINLINE
01726 PMMSUPPORT
01727 MmGetCurrentAddressSpace(VOID)
01728 {
01729     return &((PEPROCESS)KeGetCurrentThread()->ApcState.Process)->Vm;
01730 }
01731 
01732 FORCEINLINE
01733 PMMSUPPORT
01734 MmGetKernelAddressSpace(VOID)
01735 {
01736     return MmKernelAddressSpace;
01737 }

Generated on Sun May 27 2012 04:19:15 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.