Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2570 lines
50 KiB

  1. /*-- BUILD Version: 0005 // Increment this if a change has global effects
  2. Copyright (c) 1989 Microsoft Corporation
  3. Module Name:
  4. mm.h
  5. Abstract:
  6. This module contains the public data structures and procedure
  7. prototypes for the memory management system.
  8. Author:
  9. Lou Perazzoli (loup) 20-Mar-1989
  10. Landy Wang (landyw) 02-June-1997
  11. Revision History:
  12. --*/
  13. #ifndef _MM_
  14. #define _MM_
  15. //
  16. // Virtual bias applied when the kernel image was loaded.
  17. //
  18. #if !defined(_WIN64)
  19. extern ULONG_PTR MmVirtualBias;
  20. #else
  21. #define MmVirtualBias 0
  22. #endif
  23. typedef struct _PHYSICAL_MEMORY_RUN {
  24. PFN_NUMBER BasePage;
  25. PFN_NUMBER PageCount;
  26. } PHYSICAL_MEMORY_RUN, *PPHYSICAL_MEMORY_RUN;
  27. typedef struct _PHYSICAL_MEMORY_DESCRIPTOR {
  28. ULONG NumberOfRuns;
  29. PFN_NUMBER NumberOfPages;
  30. PHYSICAL_MEMORY_RUN Run[1];
  31. } PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR;
  32. //
  33. // Physical memory blocks.
  34. //
  35. extern PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock;
  36. //
  37. // The allocation granularity is 64k.
  38. //
  39. #define MM_ALLOCATION_GRANULARITY ((ULONG)0x10000)
  40. //
  41. // Maximum read ahead size for cache operations.
  42. //
  43. #define MM_MAXIMUM_READ_CLUSTER_SIZE (15)
  44. #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_)
  45. // begin_ntddk begin_wdm begin_nthal begin_ntifs
  46. //
  47. // Indicates the system may do I/O to physical addresses above 4 GB.
  48. //
  49. extern PBOOLEAN Mm64BitPhysicalAddress;
  50. // end_ntddk end_wdm end_nthal end_ntifs
  51. #else
  52. //
  53. // Indicates the system may do I/O to physical addresses above 4 GB.
  54. //
  55. extern BOOLEAN Mm64BitPhysicalAddress;
  56. #endif
  57. // begin_ntddk begin_wdm begin_nthal begin_ntifs begin_ntosp
  58. //
  59. // Define maximum disk transfer size to be used by MM and Cache Manager,
  60. // so that packet-oriented disk drivers can optimize their packet allocation
  61. // to this size.
  62. //
  63. #define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
  64. //++
  65. //
  66. // ULONG_PTR
  67. // ROUND_TO_PAGES (
  68. // IN ULONG_PTR Size
  69. // )
  70. //
  71. // Routine Description:
  72. //
  73. // The ROUND_TO_PAGES macro takes a size in bytes and rounds it up to a
  74. // multiple of the page size.
  75. //
  76. // NOTE: This macro fails for values 0xFFFFFFFF - (PAGE_SIZE - 1).
  77. //
  78. // Arguments:
  79. //
  80. // Size - Size in bytes to round up to a page multiple.
  81. //
  82. // Return Value:
  83. //
  84. // Returns the size rounded up to a multiple of the page size.
  85. //
  86. //--
  87. #define ROUND_TO_PAGES(Size) (((ULONG_PTR)(Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
  88. //++
  89. //
  90. // ULONG
  91. // BYTES_TO_PAGES (
  92. // IN ULONG Size
  93. // )
  94. //
  95. // Routine Description:
  96. //
  97. // The BYTES_TO_PAGES macro takes the size in bytes and calculates the
  98. // number of pages required to contain the bytes.
  99. //
  100. // Arguments:
  101. //
  102. // Size - Size in bytes.
  103. //
  104. // Return Value:
  105. //
  106. // Returns the number of pages required to contain the specified size.
  107. //
  108. //--
  109. #define BYTES_TO_PAGES(Size) (((Size) >> PAGE_SHIFT) + \
  110. (((Size) & (PAGE_SIZE - 1)) != 0))
  111. //++
  112. //
  113. // ULONG
  114. // BYTE_OFFSET (
  115. // IN PVOID Va
  116. // )
  117. //
  118. // Routine Description:
  119. //
  120. // The BYTE_OFFSET macro takes a virtual address and returns the byte offset
  121. // of that address within the page.
  122. //
  123. // Arguments:
  124. //
  125. // Va - Virtual address.
  126. //
  127. // Return Value:
  128. //
  129. // Returns the byte offset portion of the virtual address.
  130. //
  131. //--
  132. #define BYTE_OFFSET(Va) ((ULONG)((LONG_PTR)(Va) & (PAGE_SIZE - 1)))
  133. //++
  134. //
  135. // PVOID
  136. // PAGE_ALIGN (
  137. // IN PVOID Va
  138. // )
  139. //
  140. // Routine Description:
  141. //
  142. // The PAGE_ALIGN macro takes a virtual address and returns a page-aligned
  143. // virtual address for that page.
  144. //
  145. // Arguments:
  146. //
  147. // Va - Virtual address.
  148. //
  149. // Return Value:
  150. //
  151. // Returns the page aligned virtual address.
  152. //
  153. //--
  154. #define PAGE_ALIGN(Va) ((PVOID)((ULONG_PTR)(Va) & ~(PAGE_SIZE - 1)))
  155. //++
  156. //
  157. // ULONG
  158. // ADDRESS_AND_SIZE_TO_SPAN_PAGES (
  159. // IN PVOID Va,
  160. // IN ULONG Size
  161. // )
  162. //
  163. // Routine Description:
  164. //
  165. // The ADDRESS_AND_SIZE_TO_SPAN_PAGES macro takes a virtual address and
  166. // size and returns the number of pages spanned by the size.
  167. //
  168. // Arguments:
  169. //
  170. // Va - Virtual address.
  171. //
  172. // Size - Size in bytes.
  173. //
  174. // Return Value:
  175. //
  176. // Returns the number of pages spanned by the size.
  177. //
  178. //--
  179. #define ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va,Size) \
  180. ((ULONG)((((ULONG_PTR)(Va) & (PAGE_SIZE -1)) + (Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
  181. #if PRAGMA_DEPRECATED_DDK
  182. #pragma deprecated(COMPUTE_PAGES_SPANNED) // Use ADDRESS_AND_SIZE_TO_SPAN_PAGES
  183. #endif
  184. #define COMPUTE_PAGES_SPANNED(Va, Size) ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va,Size)
  185. // end_ntddk end_wdm end_nthal end_ntifs end_ntosp
  186. //++
  187. //
  188. // BOOLEAN
  189. // IS_SYSTEM_ADDRESS
  190. // IN PVOID Va,
  191. // )
  192. //
  193. // Routine Description:
  194. //
  195. // This macro takes a virtual address and returns TRUE if the virtual address
  196. // is within system space, FALSE otherwise.
  197. //
  198. // Arguments:
  199. //
  200. // Va - Virtual address.
  201. //
  202. // Return Value:
  203. //
  204. // Returns TRUE is the address is in system space.
  205. //
  206. //--
  207. // begin_ntosp
  208. #define IS_SYSTEM_ADDRESS(VA) ((VA) >= MM_SYSTEM_RANGE_START)
  209. // end_ntosp
  210. // begin_ntddk begin_wdm begin_nthal begin_ntifs begin_ntosp
  211. //++
  212. // PPFN_NUMBER
  213. // MmGetMdlPfnArray (
  214. // IN PMDL Mdl
  215. // )
  216. //
  217. // Routine Description:
  218. //
  219. // The MmGetMdlPfnArray routine returns the virtual address of the
  220. // first element of the array of physical page numbers associated with
  221. // the MDL.
  222. //
  223. // Arguments:
  224. //
  225. // Mdl - Pointer to an MDL.
  226. //
  227. // Return Value:
  228. //
  229. // Returns the virtual address of the first element of the array of
  230. // physical page numbers associated with the MDL.
  231. //
  232. //--
  233. #define MmGetMdlPfnArray(Mdl) ((PPFN_NUMBER)(Mdl + 1))
  234. //++
  235. //
  236. // PVOID
  237. // MmGetMdlVirtualAddress (
  238. // IN PMDL Mdl
  239. // )
  240. //
  241. // Routine Description:
  242. //
  243. // The MmGetMdlVirtualAddress returns the virtual address of the buffer
  244. // described by the Mdl.
  245. //
  246. // Arguments:
  247. //
  248. // Mdl - Pointer to an MDL.
  249. //
  250. // Return Value:
  251. //
  252. // Returns the virtual address of the buffer described by the Mdl
  253. //
  254. //--
  255. #define MmGetMdlVirtualAddress(Mdl) \
  256. ((PVOID) ((PCHAR) ((Mdl)->StartVa) + (Mdl)->ByteOffset))
  257. //++
  258. //
  259. // ULONG
  260. // MmGetMdlByteCount (
  261. // IN PMDL Mdl
  262. // )
  263. //
  264. // Routine Description:
  265. //
  266. // The MmGetMdlByteCount returns the length in bytes of the buffer
  267. // described by the Mdl.
  268. //
  269. // Arguments:
  270. //
  271. // Mdl - Pointer to an MDL.
  272. //
  273. // Return Value:
  274. //
  275. // Returns the byte count of the buffer described by the Mdl
  276. //
  277. //--
  278. #define MmGetMdlByteCount(Mdl) ((Mdl)->ByteCount)
  279. //++
  280. //
  281. // ULONG
  282. // MmGetMdlByteOffset (
  283. // IN PMDL Mdl
  284. // )
  285. //
  286. // Routine Description:
  287. //
  288. // The MmGetMdlByteOffset returns the byte offset within the page
  289. // of the buffer described by the Mdl.
  290. //
  291. // Arguments:
  292. //
  293. // Mdl - Pointer to an MDL.
  294. //
  295. // Return Value:
  296. //
  297. // Returns the byte offset within the page of the buffer described by the Mdl
  298. //
  299. //--
  300. #define MmGetMdlByteOffset(Mdl) ((Mdl)->ByteOffset)
  301. //++
  302. //
  303. // PVOID
  304. // MmGetMdlStartVa (
  305. // IN PMDL Mdl
  306. // )
  307. //
  308. // Routine Description:
  309. //
  310. // The MmGetMdlBaseVa returns the virtual address of the buffer
  311. // described by the Mdl rounded down to the nearest page.
  312. //
  313. // Arguments:
  314. //
  315. // Mdl - Pointer to an MDL.
  316. //
  317. // Return Value:
  318. //
  319. // Returns the returns the starting virtual address of the MDL.
  320. //
  321. //
  322. //--
  323. #define MmGetMdlBaseVa(Mdl) ((Mdl)->StartVa)
  324. // end_ntddk end_wdm end_nthal end_ntifs end_ntosp
  325. //
  326. // Section object type.
  327. //
  328. extern POBJECT_TYPE MmSectionObjectType;
  329. //
  330. // PAE PTE mask.
  331. //
  332. extern ULONG MmPaeErrMask;
  333. extern ULONGLONG MmPaeMask;
  334. //
  335. // Number of pages to read in a single I/O if possible.
  336. //
  337. extern ULONG MmReadClusterSize;
  338. //
  339. // Number of colors in system.
  340. //
  341. extern ULONG MmNumberOfColors;
  342. //
  343. // Number of physical pages.
  344. //
  345. extern PFN_COUNT MmNumberOfPhysicalPages;
  346. //
  347. // Lowest physical page number on the system.
  348. //
  349. extern PFN_NUMBER MmLowestPhysicalPage;
  350. //
  351. // Highest physical page number on the system.
  352. //
  353. extern PFN_NUMBER MmHighestPhysicalPage;
  354. //
  355. // Total number of committed pages.
  356. //
  357. extern SIZE_T MmTotalCommittedPages;
  358. extern SIZE_T MmTotalCommitLimit;
  359. extern SIZE_T MmPeakCommitment;
  360. typedef enum _MMSYSTEM_PTE_POOL_TYPE {
  361. SystemPteSpace,
  362. NonPagedPoolExpansion,
  363. MaximumPtePoolTypes
  364. } MMSYSTEM_PTE_POOL_TYPE;
  365. extern ULONG MmTotalFreeSystemPtes[MaximumPtePoolTypes];
  366. //
  367. // Virtual size of system cache in pages.
  368. //
  369. extern ULONG_PTR MmSizeOfSystemCacheInPages;
  370. //
  371. // System cache working set.
  372. //
  373. extern MMSUPPORT MmSystemCacheWs;
  374. //
  375. // Working set manager event.
  376. //
  377. extern KEVENT MmWorkingSetManagerEvent;
  378. // begin_ntddk begin_wdm begin_nthal begin_ntifs begin_ntosp
  379. typedef enum _MM_SYSTEM_SIZE {
  380. MmSmallSystem,
  381. MmMediumSystem,
  382. MmLargeSystem
  383. } MM_SYSTEMSIZE;
  384. NTKERNELAPI
  385. MM_SYSTEMSIZE
  386. MmQuerySystemSize (
  387. VOID
  388. );
  389. // end_wdm
  390. NTKERNELAPI
  391. BOOLEAN
  392. MmIsThisAnNtAsSystem (
  393. VOID
  394. );
  395. // end_ntddk end_nthal end_ntifs end_ntosp
  396. //
  397. // NT product type.
  398. //
  399. extern ULONG MmProductType;
  400. typedef struct _MMINFO_COUNTERS {
  401. ULONG PageFaultCount;
  402. ULONG CopyOnWriteCount;
  403. ULONG TransitionCount;
  404. ULONG CacheTransitionCount;
  405. ULONG DemandZeroCount;
  406. ULONG PageReadCount;
  407. ULONG PageReadIoCount;
  408. ULONG CacheReadCount;
  409. ULONG CacheIoCount;
  410. ULONG DirtyPagesWriteCount;
  411. ULONG DirtyWriteIoCount;
  412. ULONG MappedPagesWriteCount;
  413. ULONG MappedWriteIoCount;
  414. } MMINFO_COUNTERS;
  415. typedef MMINFO_COUNTERS *PMMINFO_COUNTERS;
  416. extern MMINFO_COUNTERS MmInfoCounters;
  417. //
  418. // Memory management initialization routine (for both phases).
  419. //
  420. BOOLEAN
  421. MmInitSystem (
  422. IN ULONG Phase,
  423. IN PLOADER_PARAMETER_BLOCK LoaderBlock
  424. );
  425. PPHYSICAL_MEMORY_DESCRIPTOR
  426. MmInitializeMemoryLimits (
  427. IN PLOADER_PARAMETER_BLOCK LoaderBlock,
  428. IN PBOOLEAN IncludedType,
  429. IN OUT PPHYSICAL_MEMORY_DESCRIPTOR Memory OPTIONAL
  430. );
  431. VOID
  432. MmFreeLoaderBlock (
  433. IN PLOADER_PARAMETER_BLOCK LoaderBlock
  434. );
  435. VOID
  436. MmEnablePAT (
  437. VOID
  438. );
  439. PVOID
  440. MmAllocateIndependentPages (
  441. IN SIZE_T NumberOfBytes,
  442. IN ULONG NodeNumber
  443. );
  444. BOOLEAN
  445. MmSetPageProtection (
  446. IN PVOID VirtualAddress,
  447. IN SIZE_T NumberOfBytes,
  448. IN ULONG NewProtect
  449. );
  450. VOID
  451. MmFreeIndependentPages (
  452. IN PVOID VirtualAddress,
  453. IN SIZE_T NumberOfBytes
  454. );
  455. //
  456. // Shutdown routine - flushes dirty pages, etc for system shutdown.
  457. //
  458. BOOLEAN
  459. MmShutdownSystem (
  460. IN ULONG
  461. );
  462. //
  463. // Routines to deal with working set and commit enforcement.
  464. //
  465. LOGICAL
  466. MmAssignProcessToJob (
  467. IN PEPROCESS Process
  468. );
  469. #define MM_WORKING_SET_MAX_HARD_ENABLE 0x1
  470. #define MM_WORKING_SET_MAX_HARD_DISABLE 0x2
  471. #define MM_WORKING_SET_MIN_HARD_ENABLE 0x4
  472. #define MM_WORKING_SET_MIN_HARD_DISABLE 0x8
  473. NTSTATUS
  474. MmEnforceWorkingSetLimit (
  475. IN PEPROCESS Process,
  476. IN ULONG Flags
  477. );
  478. PFN_NUMBER
  479. MmSetPhysicalPagesLimit (
  480. IN PFN_NUMBER NewPhysicalPagesLimit
  481. );
  482. //
  483. // Routines to deal with session space.
  484. //
  485. NTSTATUS
  486. MmSessionCreate (
  487. OUT PULONG SessionId
  488. );
  489. NTSTATUS
  490. MmSessionDelete (
  491. IN ULONG SessionId
  492. );
  493. ULONG
  494. MmGetSessionId (
  495. IN PEPROCESS Process
  496. );
  497. ULONG
  498. MmGetSessionIdEx (
  499. IN PEPROCESS Process
  500. );
  501. LCID
  502. MmGetSessionLocaleId (
  503. VOID
  504. );
  505. VOID
  506. MmSetSessionLocaleId (
  507. IN LCID LocaleId
  508. );
  509. PVOID
  510. MmGetSessionById (
  511. IN ULONG SessionId
  512. );
  513. PVOID
  514. MmGetNextSession (
  515. IN PVOID OpaqueSession
  516. );
  517. PVOID
  518. MmGetPreviousSession (
  519. IN PVOID OpaqueSession
  520. );
  521. NTSTATUS
  522. MmQuitNextSession (
  523. IN PVOID OpaqueSession
  524. );
  525. NTSTATUS
  526. MmAttachSession (
  527. IN PVOID OpaqueSession,
  528. OUT PRKAPC_STATE ApcState
  529. );
  530. NTSTATUS
  531. MmDetachSession (
  532. IN PVOID OpaqueSession,
  533. IN PRKAPC_STATE ApcState
  534. );
  535. VOID
  536. MmSessionSetUnloadAddress (
  537. IN PDRIVER_OBJECT pWin32KDevice
  538. );
  539. NTSTATUS
  540. MmGetSessionMappedViewInformation (
  541. OUT PVOID SystemInformation,
  542. IN ULONG SystemInformationLength,
  543. OUT PULONG Length,
  544. IN PULONG SessionId OPTIONAL
  545. );
  546. //
  547. // Pool support routines to allocate complete pages, not for
  548. // general consumption, these are only used by the executive pool allocator.
  549. //
  550. SIZE_T
  551. MmAvailablePoolInPages (
  552. IN POOL_TYPE PoolType
  553. );
  554. LOGICAL
  555. MmResourcesAvailable (
  556. IN POOL_TYPE PoolType,
  557. IN SIZE_T NumberOfBytes,
  558. IN EX_POOL_PRIORITY Priority
  559. );
  560. VOID
  561. MiMarkPoolLargeSession (
  562. IN PVOID VirtualAddress
  563. );
  564. LOGICAL
  565. MiIsPoolLargeSession (
  566. IN PVOID VirtualAddress
  567. );
  568. PVOID
  569. MiAllocatePoolPages (
  570. IN POOL_TYPE PoolType,
  571. IN SIZE_T SizeInBytes
  572. );
  573. ULONG
  574. MiFreePoolPages (
  575. IN PVOID StartingAddress
  576. );
  577. PVOID
  578. MiSessionPoolVector (
  579. VOID
  580. );
  581. PVOID
  582. MiSessionPoolMutex (
  583. VOID
  584. );
  585. PGENERAL_LOOKASIDE
  586. MiSessionPoolLookaside (
  587. VOID
  588. );
  589. ULONG
  590. MiSessionPoolSmallLists (
  591. VOID
  592. );
  593. PVOID
  594. MiSessionPoolTrackTable (
  595. VOID
  596. );
  597. SIZE_T
  598. MiSessionPoolTrackTableSize (
  599. VOID
  600. );
  601. PVOID
  602. MiSessionPoolBigPageTable (
  603. VOID
  604. );
  605. SIZE_T
  606. MiSessionPoolBigPageTableSize (
  607. VOID
  608. );
  609. ULONG
  610. MmGetSizeOfBigPoolAllocation (
  611. IN PVOID StartingAddress
  612. );
  613. //
  614. // Routine for determining which pool a given address resides within.
  615. //
  616. POOL_TYPE
  617. MmDeterminePoolType (
  618. IN PVOID VirtualAddress
  619. );
  620. LOGICAL
  621. MmIsSystemAddressLocked (
  622. IN PVOID VirtualAddress
  623. );
  624. LOGICAL
  625. MmAreMdlPagesLocked (
  626. IN PMDL MemoryDescriptorList
  627. );
  628. //
  629. // MmMemoryIsLow is not for general consumption, this is only used
  630. // by the balance set manager.
  631. //
  632. LOGICAL
  633. MmMemoryIsLow (
  634. VOID
  635. );
  636. //
  637. // First level fault routine.
  638. //
  639. NTSTATUS
  640. MmAccessFault (
  641. IN ULONG_PTR FaultStatus,
  642. IN PVOID VirtualAddress,
  643. IN KPROCESSOR_MODE PreviousMode,
  644. IN PVOID TrapInformation
  645. );
  646. #if defined(_IA64_)
  647. NTSTATUS
  648. MmX86Fault (
  649. IN ULONG_PTR FaultStatus,
  650. IN PVOID VirtualAddress,
  651. IN KPROCESSOR_MODE PreviousMode,
  652. IN PVOID TrapInformation
  653. );
  654. #endif
  655. //
  656. // Process Support Routines.
  657. //
  658. BOOLEAN
  659. MmCreateProcessAddressSpace (
  660. IN ULONG MinimumWorkingSetSize,
  661. IN PEPROCESS NewProcess,
  662. OUT PULONG_PTR DirectoryTableBase
  663. );
  664. NTSTATUS
  665. MmInitializeProcessAddressSpace (
  666. IN PEPROCESS ProcessToInitialize,
  667. IN PEPROCESS ProcessToClone OPTIONAL,
  668. IN PVOID SectionToMap OPTIONAL,
  669. OUT POBJECT_NAME_INFORMATION * pAuditName OPTIONAL
  670. );
  671. NTSTATUS
  672. MmInitializeHandBuiltProcess (
  673. IN PEPROCESS Process,
  674. OUT PULONG_PTR DirectoryTableBase
  675. );
  676. NTSTATUS
  677. MmInitializeHandBuiltProcess2 (
  678. IN PEPROCESS Process
  679. );
  680. VOID
  681. MmDeleteProcessAddressSpace (
  682. IN PEPROCESS Process
  683. );
  684. VOID
  685. MmCleanProcessAddressSpace (
  686. IN PEPROCESS Process
  687. );
  688. PFN_NUMBER
  689. MmGetDirectoryFrameFromProcess (
  690. IN PEPROCESS Process
  691. );
  692. PFILE_OBJECT
  693. MmGetFileObjectForSection (
  694. IN PVOID Section
  695. );
  696. PVOID
  697. MmCreateKernelStack (
  698. BOOLEAN LargeStack,
  699. UCHAR Processor
  700. );
  701. VOID
  702. MmDeleteKernelStack (
  703. IN PVOID PointerKernelStack,
  704. IN BOOLEAN LargeStack
  705. );
  706. LOGICAL
  707. MmIsFileObjectAPagingFile (
  708. IN PFILE_OBJECT FileObject
  709. );
  710. // begin_ntosp
  711. NTKERNELAPI
  712. NTSTATUS
  713. MmGrowKernelStack (
  714. IN PVOID CurrentStack
  715. );
  716. // end_ntosp
  717. #if defined(_IA64_)
  718. NTSTATUS
  719. MmGrowKernelBackingStore (
  720. IN PVOID CurrentStack
  721. );
  722. #endif
  723. VOID
  724. MmOutPageKernelStack (
  725. IN PKTHREAD Thread
  726. );
  727. VOID
  728. MmInPageKernelStack (
  729. IN PKTHREAD Thread
  730. );
  731. VOID
  732. MmOutSwapProcess (
  733. IN PKPROCESS Process
  734. );
  735. VOID
  736. MmInSwapProcess (
  737. IN PKPROCESS Process
  738. );
  739. NTSTATUS
  740. MmCreateTeb (
  741. IN PEPROCESS TargetProcess,
  742. IN PINITIAL_TEB InitialTeb,
  743. IN PCLIENT_ID ClientId,
  744. OUT PTEB *Base
  745. );
  746. NTSTATUS
  747. MmCreatePeb (
  748. IN PEPROCESS TargetProcess,
  749. IN PINITIAL_PEB InitialPeb,
  750. OUT PPEB *Base
  751. );
  752. VOID
  753. MmDeleteTeb (
  754. IN PEPROCESS TargetProcess,
  755. IN PVOID TebBase
  756. );
  757. // begin_ntosp
  758. NTKERNELAPI
  759. NTSTATUS
  760. MmAdjustWorkingSetSize (
  761. IN SIZE_T WorkingSetMinimum,
  762. IN SIZE_T WorkingSetMaximum,
  763. IN ULONG SystemCache,
  764. IN BOOLEAN IncreaseOkay
  765. );
  766. // end_ntosp
  767. NTSTATUS
  768. MmAdjustWorkingSetSizeEx (
  769. IN SIZE_T WorkingSetMinimum,
  770. IN SIZE_T WorkingSetMaximum,
  771. IN ULONG SystemCache,
  772. IN BOOLEAN IncreaseOkay,
  773. IN ULONG Flags
  774. );
  775. NTSTATUS
  776. MmQueryWorkingSetInformation (
  777. IN PSIZE_T PeakWorkingSetSize,
  778. IN PSIZE_T WorkingSetSize,
  779. IN PSIZE_T MinimumWorkingSetSize,
  780. IN PSIZE_T MaximumWorkingSetSize,
  781. IN PULONG HardEnforcementFlags
  782. );
  783. VOID
  784. MmWorkingSetManager (
  785. VOID
  786. );
  787. VOID
  788. MmEmptyAllWorkingSets (
  789. VOID
  790. );
  791. VOID
  792. MmSetMemoryPriorityProcess (
  793. IN PEPROCESS Process,
  794. IN UCHAR MemoryPriority
  795. );
  796. //
  797. // Dynamic system loading support
  798. //
  799. #define MM_LOAD_IMAGE_IN_SESSION 0x1
  800. #define MM_LOAD_IMAGE_AND_LOCKDOWN 0x2
  801. NTSTATUS
  802. MmLoadSystemImage (
  803. IN PUNICODE_STRING ImageFileName,
  804. IN PUNICODE_STRING NamePrefix OPTIONAL,
  805. IN PUNICODE_STRING LoadedBaseName OPTIONAL,
  806. IN ULONG LoadFlags,
  807. OUT PVOID *Section,
  808. OUT PVOID *ImageBaseAddress
  809. );
  810. VOID
  811. MmFreeDriverInitialization (
  812. IN PVOID Section
  813. );
  814. NTSTATUS
  815. MmUnloadSystemImage (
  816. IN PVOID Section
  817. );
  818. VOID
  819. MmMakeKernelResourceSectionWritable (
  820. VOID
  821. );
  822. #if defined(_WIN64)
  823. PVOID
  824. MmGetMaxWowAddress (
  825. VOID
  826. );
  827. #endif
  828. VOID
  829. VerifierFreeTrackedPool (
  830. IN PVOID VirtualAddress,
  831. IN SIZE_T ChargedBytes,
  832. IN LOGICAL CheckType,
  833. IN LOGICAL SpecialPool
  834. );
  835. //
  836. // Hot-patching routines
  837. //
  838. NTSTATUS
  839. MmLockAndCopyMemory (
  840. IN PSYSTEM_HOTPATCH_CODE_INFORMATION PatchInfo,
  841. IN KPROCESSOR_MODE ProbeMode
  842. );
  843. NTSTATUS
  844. MmHotPatchRoutine(
  845. PSYSTEM_HOTPATCH_CODE_INFORMATION RemoteInfo
  846. );
  847. //
  848. // Triage support
  849. //
  850. ULONG
  851. MmSizeOfTriageInformation (
  852. VOID
  853. );
  854. ULONG
  855. MmSizeOfUnloadedDriverInformation (
  856. VOID
  857. );
  858. VOID
  859. MmWriteTriageInformation (
  860. IN PVOID
  861. );
  862. VOID
  863. MmWriteUnloadedDriverInformation (
  864. IN PVOID
  865. );
  866. typedef struct _UNLOADED_DRIVERS {
  867. UNICODE_STRING Name;
  868. PVOID StartAddress;
  869. PVOID EndAddress;
  870. LARGE_INTEGER CurrentTime;
  871. } UNLOADED_DRIVERS, *PUNLOADED_DRIVERS;
  872. //
  873. // Cache manager support
  874. //
  875. #if defined(_NTDDK_) || defined(_NTIFS_)
  876. // begin_ntifs
  877. NTKERNELAPI
  878. BOOLEAN
  879. MmIsRecursiveIoFault(
  880. VOID
  881. );
  882. // end_ntifs
  883. #else
  884. //++
  885. //
  886. // BOOLEAN
  887. // MmIsRecursiveIoFault (
  888. // VOID
  889. // );
  890. //
  891. // Routine Description:
  892. //
  893. //
  894. // This macro examines the thread's page fault clustering information
  895. // and determines if the current page fault is occurring during an I/O
  896. // operation.
  897. //
  898. // Arguments:
  899. //
  900. // None.
  901. //
  902. // Return Value:
  903. //
  904. // Returns TRUE if the fault is occurring during an I/O operation,
  905. // FALSE otherwise.
  906. //
  907. //--
  908. #define MmIsRecursiveIoFault() \
  909. ((PsGetCurrentThread()->DisablePageFaultClustering) | \
  910. (PsGetCurrentThread()->ForwardClusterOnly))
  911. #endif
  912. //++
  913. //
  914. // VOID
  915. // MmDisablePageFaultClustering
  916. // OUT PULONG SavedState
  917. // );
  918. //
  919. // Routine Description:
  920. //
  921. //
  922. // This macro disables page fault clustering for the current thread.
  923. // Note, that this indicates that file system I/O is in progress
  924. // for that thread.
  925. //
  926. // Arguments:
  927. //
  928. // SavedState - returns previous state of page fault clustering which
  929. // is guaranteed to be nonzero
  930. //
  931. // Return Value:
  932. //
  933. // None.
  934. //
  935. //--
  936. #define MmDisablePageFaultClustering(SavedState) { \
  937. *(SavedState) = 2 + (ULONG)PsGetCurrentThread()->DisablePageFaultClustering;\
  938. PsGetCurrentThread()->DisablePageFaultClustering = TRUE; }
  939. //++
  940. //
  941. // VOID
  942. // MmEnablePageFaultClustering
  943. // IN ULONG SavedState
  944. // );
  945. //
  946. // Routine Description:
  947. //
  948. //
  949. // This macro enables page fault clustering for the current thread.
  950. // Note, that this indicates that no file system I/O is in progress for
  951. // that thread.
  952. //
  953. // Arguments:
  954. //
  955. // SavedState - supplies previous state of page fault clustering
  956. //
  957. // Return Value:
  958. //
  959. // None.
  960. //
  961. //--
  962. #define MmEnablePageFaultClustering(SavedState) { \
  963. PsGetCurrentThread()->DisablePageFaultClustering = (BOOLEAN)(SavedState - 2); }
  964. //++
  965. //
  966. // VOID
  967. // MmSavePageFaultReadAhead
  968. // IN PETHREAD Thread,
  969. // OUT PULONG SavedState
  970. // );
  971. //
  972. // Routine Description:
  973. //
  974. //
  975. // This macro saves the page fault read ahead value for the specified
  976. // thread.
  977. //
  978. // Arguments:
  979. //
  980. // Thread - Supplies a pointer to the current thread.
  981. //
  982. // SavedState - returns previous state of page fault read ahead
  983. //
  984. // Return Value:
  985. //
  986. // None.
  987. //
  988. //--
  989. #define MmSavePageFaultReadAhead(Thread,SavedState) { \
  990. *(SavedState) = (Thread)->ReadClusterSize * 2 + \
  991. (Thread)->ForwardClusterOnly; }
  992. //++
  993. //
  994. // VOID
  995. // MmSetPageFaultReadAhead
  996. // IN PETHREAD Thread,
  997. // IN ULONG ReadAhead
  998. // );
  999. //
  1000. // Routine Description:
  1001. //
  1002. //
  1003. // This macro sets the page fault read ahead value for the specified
  1004. // thread, and indicates that file system I/O is in progress for that
  1005. // thread.
  1006. //
  1007. // Arguments:
  1008. //
  1009. // Thread - Supplies a pointer to the current thread.
  1010. //
  1011. // ReadAhead - Supplies the number of pages to read in addition to
  1012. // the page the fault is taken on. A value of 0
  1013. // reads only the faulting page, a value of 1 reads in
  1014. // the faulting page and the following page, etc.
  1015. //
  1016. // Return Value:
  1017. //
  1018. // None.
  1019. //
  1020. //--
  1021. #define MmSetPageFaultReadAhead(Thread,ReadAhead) { \
  1022. (Thread)->ForwardClusterOnly = TRUE; \
  1023. if ((ReadAhead) > MM_MAXIMUM_READ_CLUSTER_SIZE) { \
  1024. (Thread)->ReadClusterSize = MM_MAXIMUM_READ_CLUSTER_SIZE;\
  1025. } else { \
  1026. (Thread)->ReadClusterSize = (ReadAhead); \
  1027. } }
  1028. //++
  1029. //
  1030. // VOID
  1031. // MmResetPageFaultReadAhead
  1032. // IN PETHREAD Thread,
  1033. // IN ULONG SavedState
  1034. // );
  1035. //
  1036. // Routine Description:
  1037. //
  1038. //
  1039. // This macro resets the default page fault read ahead value for the specified
  1040. // thread, and indicates that file system I/O is not in progress for that
  1041. // thread.
  1042. //
  1043. // Arguments:
  1044. //
  1045. // Thread - Supplies a pointer to the current thread.
  1046. //
  1047. // SavedState - supplies previous state of page fault read ahead
  1048. //
  1049. // Return Value:
  1050. //
  1051. // None.
  1052. //
  1053. //--
  1054. #define MmResetPageFaultReadAhead(Thread, SavedState) { \
  1055. (Thread)->ForwardClusterOnly = (BOOLEAN)((SavedState) & 1); \
  1056. (Thread)->ReadClusterSize = (SavedState) / 2; }
  1057. //
  1058. // The order of this list is important, the zeroed, free and standby
  1059. // must occur before the modified or bad so comparisons can be
  1060. // made when pages are added to a list.
  1061. //
  1062. // NOTE: This field is limited to 8 elements.
  1063. // Also, if this field is expanded, update the MMPFNLIST_* defines in ntmmapi.h
  1064. //
  1065. #define NUMBER_OF_PAGE_LISTS 8
  1066. typedef enum _MMLISTS {
  1067. ZeroedPageList,
  1068. FreePageList,
  1069. StandbyPageList, //this list and before make up available pages.
  1070. ModifiedPageList,
  1071. ModifiedNoWritePageList,
  1072. BadPageList,
  1073. ActiveAndValid,
  1074. TransitionPage
  1075. } MMLISTS;
  1076. typedef struct _MMPFNLIST {
  1077. PFN_NUMBER Total;
  1078. MMLISTS ListName;
  1079. PFN_NUMBER Flink;
  1080. PFN_NUMBER Blink;
  1081. } MMPFNLIST;
  1082. typedef MMPFNLIST *PMMPFNLIST;
  1083. extern MMPFNLIST MmModifiedPageListHead;
  1084. extern PFN_NUMBER MmThrottleTop;
  1085. extern PFN_NUMBER MmThrottleBottom;
  1086. //++
  1087. //
  1088. // BOOLEAN
  1089. // MmEnoughMemoryForWrite (
  1090. // VOID
  1091. // );
  1092. //
  1093. // Routine Description:
  1094. //
  1095. //
  1096. // This macro checks the modified pages and available pages to determine
  1097. // to allow the cache manager to throttle write operations.
  1098. //
  1099. // For NTAS:
  1100. // Writes are blocked if there are less than 127 available pages OR
  1101. // there are more than 1000 modified pages AND less than 450 available pages.
  1102. //
  1103. // For DeskTop:
  1104. // Writes are blocked if there are less than 30 available pages OR
  1105. // there are more than 1000 modified pages AND less than 250 available pages.
  1106. //
  1107. // Arguments:
  1108. //
  1109. // None.
  1110. //
  1111. // Return Value:
  1112. //
  1113. // TRUE if ample memory exists and the write should proceed.
  1114. //
  1115. //--
  1116. #define MmEnoughMemoryForWrite() \
  1117. ((MmAvailablePages > MmThrottleTop) \
  1118. || \
  1119. (((MmModifiedPageListHead.Total < 1000)) && \
  1120. (MmAvailablePages > MmThrottleBottom)))
  1121. // begin_ntosp
  1122. NTKERNELAPI
  1123. NTSTATUS
  1124. MmCreateSection (
  1125. OUT PVOID *SectionObject,
  1126. IN ACCESS_MASK DesiredAccess,
  1127. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  1128. IN PLARGE_INTEGER MaximumSize,
  1129. IN ULONG SectionPageProtection,
  1130. IN ULONG AllocationAttributes,
  1131. IN HANDLE FileHandle OPTIONAL,
  1132. IN PFILE_OBJECT File OPTIONAL
  1133. );
  1134. NTKERNELAPI
  1135. NTSTATUS
  1136. MmMapViewOfSection (
  1137. IN PVOID SectionToMap,
  1138. IN PEPROCESS Process,
  1139. IN OUT PVOID *CapturedBase,
  1140. IN ULONG_PTR ZeroBits,
  1141. IN SIZE_T CommitSize,
  1142. IN OUT PLARGE_INTEGER SectionOffset,
  1143. IN OUT PSIZE_T CapturedViewSize,
  1144. IN SECTION_INHERIT InheritDisposition,
  1145. IN ULONG AllocationType,
  1146. IN ULONG Protect
  1147. );
  1148. NTKERNELAPI
  1149. NTSTATUS
  1150. MmUnmapViewOfSection (
  1151. IN PEPROCESS Process,
  1152. IN PVOID BaseAddress
  1153. );
  1154. // end_ntosp begin_ntifs
  1155. BOOLEAN
  1156. MmForceSectionClosed (
  1157. IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
  1158. IN BOOLEAN DelayClose
  1159. );
  1160. // end_ntifs
  1161. NTSTATUS
  1162. MmGetFileNameForSection (
  1163. IN PVOID SectionObject,
  1164. OUT PSTRING FileName
  1165. );
  1166. NTSTATUS
  1167. MmGetFileNameForAddress (
  1168. IN PVOID ProcessVa,
  1169. OUT PUNICODE_STRING FileName
  1170. );
  1171. NTSTATUS
  1172. MmRemoveVerifierEntry (
  1173. IN PUNICODE_STRING ImageFileName
  1174. );
  1175. // begin_ntddk begin_wdm begin_ntifs begin_ntosp
  1176. NTSTATUS
  1177. MmIsVerifierEnabled (
  1178. OUT PULONG VerifierFlags
  1179. );
  1180. NTSTATUS
  1181. MmAddVerifierThunks (
  1182. IN PVOID ThunkBuffer,
  1183. IN ULONG ThunkBufferSize
  1184. );
  1185. // end_ntddk end_wdm end_ntifs end_ntosp
  1186. NTSTATUS
  1187. MmAddVerifierEntry (
  1188. IN PUNICODE_STRING ImageFileName
  1189. );
  1190. NTSTATUS
  1191. MmSetVerifierInformation (
  1192. IN OUT PVOID SystemInformation,
  1193. IN ULONG SystemInformationLength
  1194. );
  1195. NTSTATUS
  1196. MmGetVerifierInformation (
  1197. OUT PVOID SystemInformation,
  1198. IN ULONG SystemInformationLength,
  1199. OUT PULONG Length
  1200. );
  1201. NTSTATUS
  1202. MmGetPageFileInformation (
  1203. OUT PVOID SystemInformation,
  1204. IN ULONG SystemInformationLength,
  1205. OUT PULONG Length
  1206. );
  1207. HANDLE
  1208. MmGetSystemPageFile (
  1209. VOID
  1210. );
  1211. NTSTATUS
  1212. MmExtendSection (
  1213. IN PVOID SectionToExtend,
  1214. IN OUT PLARGE_INTEGER NewSectionSize,
  1215. IN ULONG IgnoreFileSizeChecking
  1216. );
  1217. NTSTATUS
  1218. MmFlushVirtualMemory (
  1219. IN PEPROCESS Process,
  1220. IN OUT PVOID *BaseAddress,
  1221. IN OUT PSIZE_T RegionSize,
  1222. OUT PIO_STATUS_BLOCK IoStatus
  1223. );
  1224. NTSTATUS
  1225. MmMapViewInSystemCache (
  1226. IN PVOID SectionToMap,
  1227. OUT PVOID *CapturedBase,
  1228. IN OUT PLARGE_INTEGER SectionOffset,
  1229. IN OUT PULONG CapturedViewSize
  1230. );
  1231. VOID
  1232. MmUnmapViewInSystemCache (
  1233. IN PVOID BaseAddress,
  1234. IN PVOID SectionToUnmap,
  1235. IN ULONG AddToFront
  1236. );
  1237. BOOLEAN
  1238. MmPurgeSection (
  1239. IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
  1240. IN PLARGE_INTEGER Offset OPTIONAL,
  1241. IN SIZE_T RegionSize,
  1242. IN ULONG IgnoreCacheViews
  1243. );
  1244. NTSTATUS
  1245. MmFlushSection (
  1246. IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
  1247. IN PLARGE_INTEGER Offset OPTIONAL,
  1248. IN SIZE_T RegionSize,
  1249. OUT PIO_STATUS_BLOCK IoStatus,
  1250. IN ULONG AcquireFile
  1251. );
  1252. // begin_ntifs
  1253. typedef enum _MMFLUSH_TYPE {
  1254. MmFlushForDelete,
  1255. MmFlushForWrite
  1256. } MMFLUSH_TYPE;
  1257. BOOLEAN
  1258. MmFlushImageSection (
  1259. IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
  1260. IN MMFLUSH_TYPE FlushType
  1261. );
  1262. BOOLEAN
  1263. MmCanFileBeTruncated (
  1264. IN PSECTION_OBJECT_POINTERS SectionPointer,
  1265. IN PLARGE_INTEGER NewFileSize
  1266. );
  1267. // end_ntifs
  1268. ULONG
  1269. MmDoesFileHaveUserWritableReferences (
  1270. IN PSECTION_OBJECT_POINTERS SectionPointer
  1271. );
  1272. BOOLEAN
  1273. MmDisableModifiedWriteOfSection (
  1274. IN PSECTION_OBJECT_POINTERS SectionObjectPointer
  1275. );
  1276. BOOLEAN
  1277. MmEnableModifiedWriteOfSection (
  1278. IN PSECTION_OBJECT_POINTERS SectionObjectPointer
  1279. );
  1280. VOID
  1281. MmPurgeWorkingSet (
  1282. IN PEPROCESS Process,
  1283. IN PVOID BaseAddress,
  1284. IN SIZE_T RegionSize
  1285. );
  1286. BOOLEAN // ntifs
  1287. MmSetAddressRangeModified ( // ntifs
  1288. IN PVOID Address, // ntifs
  1289. IN SIZE_T Length // ntifs
  1290. ); // ntifs
  1291. BOOLEAN
  1292. MmCheckCachedPageState (
  1293. IN PVOID Address,
  1294. IN BOOLEAN SetToZero
  1295. );
  1296. NTSTATUS
  1297. MmCopyToCachedPage (
  1298. IN PVOID Address,
  1299. IN PVOID UserBuffer,
  1300. IN ULONG Offset,
  1301. IN SIZE_T CountInBytes,
  1302. IN BOOLEAN DontZero
  1303. );
  1304. VOID
  1305. MmUnlockCachedPage (
  1306. IN PVOID AddressInCache
  1307. );
  1308. #define MMDBG_COPY_WRITE 0x00000001
  1309. #define MMDBG_COPY_PHYSICAL 0x00000002
  1310. #define MMDBG_COPY_UNSAFE 0x00000004
  1311. #define MMDBG_COPY_CACHED 0x00000008
  1312. #define MMDBG_COPY_UNCACHED 0x00000010
  1313. #define MMDBG_COPY_WRITE_COMBINED 0x00000020
  1314. #define MMDBG_COPY_MAX_SIZE 8
  1315. NTSTATUS
  1316. MmDbgCopyMemory (
  1317. IN ULONG64 UntrustedAddress,
  1318. IN PVOID Buffer,
  1319. IN ULONG Size,
  1320. IN ULONG Flags
  1321. );
  1322. LOGICAL
  1323. MmDbgIsLowMemOk (
  1324. IN PFN_NUMBER PageFrameIndex,
  1325. OUT PPFN_NUMBER NextPageFrameIndex,
  1326. IN OUT PULONG CorruptionOffset
  1327. );
  1328. VOID
  1329. MmHibernateInformation (
  1330. IN PVOID MemoryMap,
  1331. OUT PULONG_PTR HiberVa,
  1332. OUT PPHYSICAL_ADDRESS HiberPte
  1333. );
  1334. LOGICAL
  1335. MmUpdateMdlTracker (
  1336. IN PMDL MemoryDescriptorList,
  1337. IN PVOID CallingAddress,
  1338. IN PVOID CallersCaller
  1339. );
  1340. // begin_ntddk begin_ntifs begin_wdm begin_ntosp
  1341. NTKERNELAPI
  1342. VOID
  1343. MmProbeAndLockProcessPages (
  1344. IN OUT PMDL MemoryDescriptorList,
  1345. IN PEPROCESS Process,
  1346. IN KPROCESSOR_MODE AccessMode,
  1347. IN LOCK_OPERATION Operation
  1348. );
  1349. // begin_nthal
  1350. //
  1351. // I/O support routines.
  1352. //
  1353. NTKERNELAPI
  1354. VOID
  1355. MmProbeAndLockPages (
  1356. IN OUT PMDL MemoryDescriptorList,
  1357. IN KPROCESSOR_MODE AccessMode,
  1358. IN LOCK_OPERATION Operation
  1359. );
  1360. NTKERNELAPI
  1361. VOID
  1362. MmUnlockPages (
  1363. IN PMDL MemoryDescriptorList
  1364. );
  1365. NTKERNELAPI
  1366. VOID
  1367. MmBuildMdlForNonPagedPool (
  1368. IN OUT PMDL MemoryDescriptorList
  1369. );
  1370. NTKERNELAPI
  1371. PVOID
  1372. MmMapLockedPages (
  1373. IN PMDL MemoryDescriptorList,
  1374. IN KPROCESSOR_MODE AccessMode
  1375. );
  1376. LOGICAL
  1377. MmIsIoSpaceActive (
  1378. IN PHYSICAL_ADDRESS StartAddress,
  1379. IN SIZE_T NumberOfBytes
  1380. );
  1381. NTKERNELAPI
  1382. PVOID
  1383. MmGetSystemRoutineAddress (
  1384. IN PUNICODE_STRING SystemRoutineName
  1385. );
  1386. NTKERNELAPI
  1387. NTSTATUS
  1388. MmAdvanceMdl (
  1389. IN PMDL Mdl,
  1390. IN ULONG NumberOfBytes
  1391. );
  1392. // end_wdm
  1393. NTKERNELAPI
  1394. NTSTATUS
  1395. MmMapUserAddressesToPage (
  1396. IN PVOID BaseAddress,
  1397. IN SIZE_T NumberOfBytes,
  1398. IN PVOID PageAddress
  1399. );
  1400. // begin_wdm
  1401. NTKERNELAPI
  1402. NTSTATUS
  1403. MmProtectMdlSystemAddress (
  1404. IN PMDL MemoryDescriptorList,
  1405. IN ULONG NewProtect
  1406. );
  1407. //
  1408. // _MM_PAGE_PRIORITY_ provides a method for the system to handle requests
  1409. // intelligently in low resource conditions.
  1410. //
  1411. // LowPagePriority should be used when it is acceptable to the driver for the
  1412. // mapping request to fail if the system is low on resources. An example of
  1413. // this could be for a non-critical network connection where the driver can
  1414. // handle the failure case when system resources are close to being depleted.
  1415. //
  1416. // NormalPagePriority should be used when it is acceptable to the driver for the
  1417. // mapping request to fail if the system is very low on resources. An example
  1418. // of this could be for a non-critical local filesystem request.
  1419. //
  1420. // HighPagePriority should be used when it is unacceptable to the driver for the
  1421. // mapping request to fail unless the system is completely out of resources.
  1422. // An example of this would be the paging file path in a driver.
  1423. //
  1424. // begin_ntndis
  1425. typedef enum _MM_PAGE_PRIORITY {
  1426. LowPagePriority,
  1427. NormalPagePriority = 16,
  1428. HighPagePriority = 32
  1429. } MM_PAGE_PRIORITY;
  1430. // end_ntndis
  1431. //
  1432. // Note: This function is not available in WDM 1.0
  1433. //
  1434. NTKERNELAPI
  1435. PVOID
  1436. MmMapLockedPagesSpecifyCache (
  1437. IN PMDL MemoryDescriptorList,
  1438. IN KPROCESSOR_MODE AccessMode,
  1439. IN MEMORY_CACHING_TYPE CacheType,
  1440. IN PVOID BaseAddress,
  1441. IN ULONG BugCheckOnFailure,
  1442. IN MM_PAGE_PRIORITY Priority
  1443. );
  1444. NTKERNELAPI
  1445. VOID
  1446. MmUnmapLockedPages (
  1447. IN PVOID BaseAddress,
  1448. IN PMDL MemoryDescriptorList
  1449. );
  1450. PVOID
  1451. MmAllocateMappingAddress (
  1452. IN SIZE_T NumberOfBytes,
  1453. IN ULONG PoolTag
  1454. );
  1455. VOID
  1456. MmFreeMappingAddress (
  1457. IN PVOID BaseAddress,
  1458. IN ULONG PoolTag
  1459. );
  1460. PVOID
  1461. MmMapLockedPagesWithReservedMapping (
  1462. IN PVOID MappingAddress,
  1463. IN ULONG PoolTag,
  1464. IN PMDL MemoryDescriptorList,
  1465. IN MEMORY_CACHING_TYPE CacheType
  1466. );
  1467. VOID
  1468. MmUnmapReservedMapping (
  1469. IN PVOID BaseAddress,
  1470. IN ULONG PoolTag,
  1471. IN PMDL MemoryDescriptorList
  1472. );
  1473. // end_wdm
  1474. typedef struct _PHYSICAL_MEMORY_RANGE {
  1475. PHYSICAL_ADDRESS BaseAddress;
  1476. LARGE_INTEGER NumberOfBytes;
  1477. } PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
  1478. NTKERNELAPI
  1479. NTSTATUS
  1480. MmAddPhysicalMemory (
  1481. IN PPHYSICAL_ADDRESS StartAddress,
  1482. IN OUT PLARGE_INTEGER NumberOfBytes
  1483. );
  1484. // end_ntddk end_nthal end_ntifs
  1485. NTKERNELAPI
  1486. NTSTATUS
  1487. MmAddPhysicalMemoryEx (
  1488. IN PPHYSICAL_ADDRESS StartAddress,
  1489. IN OUT PLARGE_INTEGER NumberOfBytes,
  1490. IN ULONG Flags
  1491. );
  1492. // begin_ntddk begin_nthal begin_ntifs
  1493. NTKERNELAPI
  1494. NTSTATUS
  1495. MmRemovePhysicalMemory (
  1496. IN PPHYSICAL_ADDRESS StartAddress,
  1497. IN OUT PLARGE_INTEGER NumberOfBytes
  1498. );
  1499. // end_ntddk end_nthal end_ntifs
  1500. NTKERNELAPI
  1501. NTSTATUS
  1502. MmRemovePhysicalMemoryEx (
  1503. IN PPHYSICAL_ADDRESS StartAddress,
  1504. IN OUT PLARGE_INTEGER NumberOfBytes,
  1505. IN ULONG Flags
  1506. );
  1507. // begin_ntddk begin_nthal begin_ntifs
  1508. NTKERNELAPI
  1509. PPHYSICAL_MEMORY_RANGE
  1510. MmGetPhysicalMemoryRanges (
  1511. VOID
  1512. );
  1513. // end_ntddk end_ntifs
  1514. NTSTATUS
  1515. MmMarkPhysicalMemoryAsGood (
  1516. IN PPHYSICAL_ADDRESS StartAddress,
  1517. IN OUT PLARGE_INTEGER NumberOfBytes
  1518. );
  1519. NTSTATUS
  1520. MmMarkPhysicalMemoryAsBad (
  1521. IN PPHYSICAL_ADDRESS StartAddress,
  1522. IN OUT PLARGE_INTEGER NumberOfBytes
  1523. );
  1524. // begin_wdm begin_ntddk begin_ntifs
  1525. NTKERNELAPI
  1526. PMDL
  1527. MmAllocatePagesForMdl (
  1528. IN PHYSICAL_ADDRESS LowAddress,
  1529. IN PHYSICAL_ADDRESS HighAddress,
  1530. IN PHYSICAL_ADDRESS SkipBytes,
  1531. IN SIZE_T TotalBytes
  1532. );
  1533. NTKERNELAPI
  1534. VOID
  1535. MmFreePagesFromMdl (
  1536. IN PMDL MemoryDescriptorList
  1537. );
  1538. NTKERNELAPI
  1539. PVOID
  1540. MmMapIoSpace (
  1541. IN PHYSICAL_ADDRESS PhysicalAddress,
  1542. IN SIZE_T NumberOfBytes,
  1543. IN MEMORY_CACHING_TYPE CacheType
  1544. );
  1545. NTKERNELAPI
  1546. VOID
  1547. MmUnmapIoSpace (
  1548. IN PVOID BaseAddress,
  1549. IN SIZE_T NumberOfBytes
  1550. );
  1551. // end_wdm end_ntddk end_ntifs end_ntosp
  1552. NTKERNELAPI
  1553. VOID
  1554. MmProbeAndLockSelectedPages (
  1555. IN OUT PMDL MemoryDescriptorList,
  1556. IN PFILE_SEGMENT_ELEMENT SegmentArray,
  1557. IN KPROCESSOR_MODE AccessMode,
  1558. IN LOCK_OPERATION Operation
  1559. );
  1560. // begin_ntddk begin_ntifs begin_ntosp
  1561. NTKERNELAPI
  1562. PVOID
  1563. MmMapVideoDisplay (
  1564. IN PHYSICAL_ADDRESS PhysicalAddress,
  1565. IN SIZE_T NumberOfBytes,
  1566. IN MEMORY_CACHING_TYPE CacheType
  1567. );
  1568. NTKERNELAPI
  1569. VOID
  1570. MmUnmapVideoDisplay (
  1571. IN PVOID BaseAddress,
  1572. IN SIZE_T NumberOfBytes
  1573. );
  1574. NTKERNELAPI
  1575. PHYSICAL_ADDRESS
  1576. MmGetPhysicalAddress (
  1577. IN PVOID BaseAddress
  1578. );
  1579. NTKERNELAPI
  1580. PVOID
  1581. MmGetVirtualForPhysical (
  1582. IN PHYSICAL_ADDRESS PhysicalAddress
  1583. );
  1584. NTKERNELAPI
  1585. PVOID
  1586. MmAllocateContiguousMemory (
  1587. IN SIZE_T NumberOfBytes,
  1588. IN PHYSICAL_ADDRESS HighestAcceptableAddress
  1589. );
  1590. NTKERNELAPI
  1591. PVOID
  1592. MmAllocateContiguousMemorySpecifyCache (
  1593. IN SIZE_T NumberOfBytes,
  1594. IN PHYSICAL_ADDRESS LowestAcceptableAddress,
  1595. IN PHYSICAL_ADDRESS HighestAcceptableAddress,
  1596. IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
  1597. IN MEMORY_CACHING_TYPE CacheType
  1598. );
  1599. NTKERNELAPI
  1600. VOID
  1601. MmFreeContiguousMemory (
  1602. IN PVOID BaseAddress
  1603. );
  1604. NTKERNELAPI
  1605. VOID
  1606. MmFreeContiguousMemorySpecifyCache (
  1607. IN PVOID BaseAddress,
  1608. IN SIZE_T NumberOfBytes,
  1609. IN MEMORY_CACHING_TYPE CacheType
  1610. );
  1611. // end_ntddk end_ntifs end_ntosp end_nthal
  1612. NTKERNELAPI
  1613. ULONG
  1614. MmGatherMemoryForHibernate (
  1615. IN PMDL Mdl,
  1616. IN BOOLEAN Wait
  1617. );
  1618. NTKERNELAPI
  1619. VOID
  1620. MmReturnMemoryForHibernate (
  1621. IN PMDL Mdl
  1622. );
  1623. VOID
  1624. MmReleaseDumpAddresses (
  1625. IN PFN_NUMBER Pages
  1626. );
  1627. // begin_ntddk begin_ntifs begin_nthal begin_ntosp
  1628. NTKERNELAPI
  1629. PVOID
  1630. MmAllocateNonCachedMemory (
  1631. IN SIZE_T NumberOfBytes
  1632. );
  1633. NTKERNELAPI
  1634. VOID
  1635. MmFreeNonCachedMemory (
  1636. IN PVOID BaseAddress,
  1637. IN SIZE_T NumberOfBytes
  1638. );
  1639. NTKERNELAPI
  1640. BOOLEAN
  1641. MmIsAddressValid (
  1642. IN PVOID VirtualAddress
  1643. );
  1644. DECLSPEC_DEPRECATED_DDK
  1645. NTKERNELAPI
  1646. BOOLEAN
  1647. MmIsNonPagedSystemAddressValid (
  1648. IN PVOID VirtualAddress
  1649. );
  1650. // begin_wdm
  1651. NTKERNELAPI
  1652. SIZE_T
  1653. MmSizeOfMdl (
  1654. IN PVOID Base,
  1655. IN SIZE_T Length
  1656. );
  1657. DECLSPEC_DEPRECATED_DDK // Use IoAllocateMdl
  1658. NTKERNELAPI
  1659. PMDL
  1660. MmCreateMdl (
  1661. IN PMDL MemoryDescriptorList OPTIONAL,
  1662. IN PVOID Base,
  1663. IN SIZE_T Length
  1664. );
  1665. NTKERNELAPI
  1666. PVOID
  1667. MmLockPagableDataSection (
  1668. IN PVOID AddressWithinSection
  1669. );
  1670. // end_wdm
  1671. NTKERNELAPI
  1672. VOID
  1673. MmLockPagableSectionByHandle (
  1674. IN PVOID ImageSectionHandle
  1675. );
  1676. // end_ntddk end_ntifs end_ntosp
  1677. NTKERNELAPI
  1678. VOID
  1679. MmLockPagedPool (
  1680. IN PVOID Address,
  1681. IN SIZE_T Size
  1682. );
  1683. NTKERNELAPI
  1684. VOID
  1685. MmUnlockPagedPool (
  1686. IN PVOID Address,
  1687. IN SIZE_T Size
  1688. );
  1689. // begin_wdm begin_ntddk begin_ntifs begin_ntosp
  1690. NTKERNELAPI
  1691. VOID
  1692. MmResetDriverPaging (
  1693. IN PVOID AddressWithinSection
  1694. );
  1695. NTKERNELAPI
  1696. PVOID
  1697. MmPageEntireDriver (
  1698. IN PVOID AddressWithinSection
  1699. );
  1700. NTKERNELAPI
  1701. VOID
  1702. MmUnlockPagableImageSection(
  1703. IN PVOID ImageSectionHandle
  1704. );
  1705. // end_wdm end_ntosp
  1706. // begin_ntosp
  1707. //
  1708. // Note that even though this function prototype
  1709. // says "HANDLE", MmSecureVirtualMemory does NOT return
  1710. // anything resembling a Win32-style handle. The return
  1711. // value from this function can ONLY be used with MmUnsecureVirtualMemory.
  1712. //
  1713. NTKERNELAPI
  1714. HANDLE
  1715. MmSecureVirtualMemory (
  1716. IN PVOID Address,
  1717. IN SIZE_T Size,
  1718. IN ULONG ProbeMode
  1719. );
  1720. NTKERNELAPI
  1721. VOID
  1722. MmUnsecureVirtualMemory (
  1723. IN HANDLE SecureHandle
  1724. );
  1725. // end_ntosp
  1726. NTKERNELAPI
  1727. NTSTATUS
  1728. MmMapViewInSystemSpace (
  1729. IN PVOID Section,
  1730. OUT PVOID *MappedBase,
  1731. IN PSIZE_T ViewSize
  1732. );
  1733. NTKERNELAPI
  1734. NTSTATUS
  1735. MmUnmapViewInSystemSpace (
  1736. IN PVOID MappedBase
  1737. );
  1738. // begin_ntosp
  1739. NTKERNELAPI
  1740. NTSTATUS
  1741. MmMapViewInSessionSpace (
  1742. IN PVOID Section,
  1743. OUT PVOID *MappedBase,
  1744. IN OUT PSIZE_T ViewSize
  1745. );
  1746. // end_ntddk end_ntifs
  1747. NTKERNELAPI
  1748. NTSTATUS
  1749. MmCommitSessionMappedView (
  1750. IN PVOID MappedAddress,
  1751. IN SIZE_T ViewSize
  1752. );
  1753. // begin_ntddk begin_ntifs
  1754. NTKERNELAPI
  1755. NTSTATUS
  1756. MmUnmapViewInSessionSpace (
  1757. IN PVOID MappedBase
  1758. );
  1759. // end_ntosp
  1760. // begin_wdm begin_ntosp
  1761. //++
  1762. //
  1763. // VOID
  1764. // MmInitializeMdl (
  1765. // IN PMDL MemoryDescriptorList,
  1766. // IN PVOID BaseVa,
  1767. // IN SIZE_T Length
  1768. // )
  1769. //
  1770. // Routine Description:
  1771. //
  1772. // This routine initializes the header of a Memory Descriptor List (MDL).
  1773. //
  1774. // Arguments:
  1775. //
  1776. // MemoryDescriptorList - Pointer to the MDL to initialize.
  1777. //
  1778. // BaseVa - Base virtual address mapped by the MDL.
  1779. //
  1780. // Length - Length, in bytes, of the buffer mapped by the MDL.
  1781. //
  1782. // Return Value:
  1783. //
  1784. // None.
  1785. //
  1786. //--
  1787. #define MmInitializeMdl(MemoryDescriptorList, BaseVa, Length) { \
  1788. (MemoryDescriptorList)->Next = (PMDL) NULL; \
  1789. (MemoryDescriptorList)->Size = (CSHORT)(sizeof(MDL) + \
  1790. (sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES((BaseVa), (Length)))); \
  1791. (MemoryDescriptorList)->MdlFlags = 0; \
  1792. (MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN((BaseVa)); \
  1793. (MemoryDescriptorList)->ByteOffset = BYTE_OFFSET((BaseVa)); \
  1794. (MemoryDescriptorList)->ByteCount = (ULONG)(Length); \
  1795. }
  1796. //++
  1797. //
  1798. // PVOID
  1799. // MmGetSystemAddressForMdlSafe (
  1800. // IN PMDL MDL,
  1801. // IN MM_PAGE_PRIORITY PRIORITY
  1802. // )
  1803. //
  1804. // Routine Description:
  1805. //
  1806. // This routine returns the mapped address of an MDL. If the
  1807. // Mdl is not already mapped or a system address, it is mapped.
  1808. //
  1809. // Arguments:
  1810. //
  1811. // MemoryDescriptorList - Pointer to the MDL to map.
  1812. //
  1813. // Priority - Supplies an indication as to how important it is that this
  1814. // request succeed under low available PTE conditions.
  1815. //
  1816. // Return Value:
  1817. //
  1818. // Returns the base address where the pages are mapped. The base address
  1819. // has the same offset as the virtual address in the MDL.
  1820. //
  1821. // Unlike MmGetSystemAddressForMdl, Safe guarantees that it will always
  1822. // return NULL on failure instead of bugchecking the system.
  1823. //
  1824. // This macro is not usable by WDM 1.0 drivers as 1.0 did not include
  1825. // MmMapLockedPagesSpecifyCache. The solution for WDM 1.0 drivers is to
  1826. // provide synchronization and set/reset the MDL_MAPPING_CAN_FAIL bit.
  1827. //
  1828. //--
  1829. #define MmGetSystemAddressForMdlSafe(MDL, PRIORITY) \
  1830. (((MDL)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
  1831. MDL_SOURCE_IS_NONPAGED_POOL)) ? \
  1832. ((MDL)->MappedSystemVa) : \
  1833. (MmMapLockedPagesSpecifyCache((MDL), \
  1834. KernelMode, \
  1835. MmCached, \
  1836. NULL, \
  1837. FALSE, \
  1838. (PRIORITY))))
  1839. //++
  1840. //
  1841. // PVOID
  1842. // MmGetSystemAddressForMdl (
  1843. // IN PMDL MDL
  1844. // )
  1845. //
  1846. // Routine Description:
  1847. //
  1848. // This routine returns the mapped address of an MDL, if the
  1849. // Mdl is not already mapped or a system address, it is mapped.
  1850. //
  1851. // Arguments:
  1852. //
  1853. // MemoryDescriptorList - Pointer to the MDL to map.
  1854. //
  1855. // Return Value:
  1856. //
  1857. // Returns the base address where the pages are mapped. The base address
  1858. // has the same offset as the virtual address in the MDL.
  1859. //
  1860. //--
  1861. //#define MmGetSystemAddressForMdl(MDL)
  1862. // (((MDL)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA)) ?
  1863. // ((MDL)->MappedSystemVa) :
  1864. // ((((MDL)->MdlFlags & (MDL_SOURCE_IS_NONPAGED_POOL)) ?
  1865. // ((PVOID)((ULONG)(MDL)->StartVa | (MDL)->ByteOffset)) :
  1866. // (MmMapLockedPages((MDL),KernelMode)))))
  1867. #if PRAGMA_DEPRECATED_DDK
  1868. #pragma deprecated(MmGetSystemAddressForMdl) // Use MmGetSystemAddressForMdlSafe
  1869. #endif
  1870. #define MmGetSystemAddressForMdl(MDL) \
  1871. (((MDL)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
  1872. MDL_SOURCE_IS_NONPAGED_POOL)) ? \
  1873. ((MDL)->MappedSystemVa) : \
  1874. (MmMapLockedPages((MDL),KernelMode)))
  1875. //++
  1876. //
  1877. // VOID
  1878. // MmPrepareMdlForReuse (
  1879. // IN PMDL MDL
  1880. // )
  1881. //
  1882. // Routine Description:
  1883. //
  1884. // This routine will take all of the steps necessary to allow an MDL to be
  1885. // re-used.
  1886. //
  1887. // Arguments:
  1888. //
  1889. // MemoryDescriptorList - Pointer to the MDL that will be re-used.
  1890. //
  1891. // Return Value:
  1892. //
  1893. // None.
  1894. //
  1895. //--
  1896. #define MmPrepareMdlForReuse(MDL) \
  1897. if (((MDL)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
  1898. ASSERT(((MDL)->MdlFlags & MDL_PARTIAL) != 0); \
  1899. MmUnmapLockedPages( (MDL)->MappedSystemVa, (MDL) ); \
  1900. } else if (((MDL)->MdlFlags & MDL_PARTIAL) == 0) { \
  1901. ASSERT(((MDL)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
  1902. }
  1903. typedef NTSTATUS (*PMM_DLL_INITIALIZE)(
  1904. IN PUNICODE_STRING RegistryPath
  1905. );
  1906. typedef NTSTATUS (*PMM_DLL_UNLOAD)(
  1907. VOID
  1908. );
  1909. // end_ntddk end_wdm end_nthal end_ntifs end_ntosp
  1910. // begin_ntddk begin_nthal
  1911. NTKERNELAPI
  1912. NTSTATUS
  1913. MmCreateMirror (
  1914. VOID
  1915. );
  1916. // end_ntddk end_nthal
  1917. PVOID
  1918. MmAllocateSpecialPool (
  1919. IN SIZE_T NumberOfBytes,
  1920. IN ULONG Tag,
  1921. IN POOL_TYPE Type,
  1922. IN ULONG SpecialPoolType
  1923. );
  1924. VOID
  1925. MmFreeSpecialPool (
  1926. IN PVOID P
  1927. );
  1928. LOGICAL
  1929. MmProtectSpecialPool (
  1930. IN PVOID VirtualAddress,
  1931. IN ULONG NewProtect
  1932. );
  1933. LOGICAL
  1934. MmIsSpecialPoolAddressFree (
  1935. IN PVOID VirtualAddress
  1936. );
  1937. SIZE_T
  1938. MmQuerySpecialPoolBlockSize (
  1939. IN PVOID P
  1940. );
  1941. LOGICAL
  1942. MmIsSpecialPoolAddress (
  1943. IN PVOID VirtualAddress
  1944. );
  1945. LOGICAL
  1946. MmUseSpecialPool (
  1947. IN SIZE_T NumberOfBytes,
  1948. IN ULONG Tag
  1949. );
  1950. LOGICAL
  1951. MmIsSessionAddress (
  1952. IN PVOID VirtualAddress
  1953. );
  1954. PUNICODE_STRING
  1955. MmLocateUnloadedDriver (
  1956. IN PVOID VirtualAddress
  1957. );
  1958. // begin_ntddk begin_wdm begin_ntosp
  1959. //
  1960. // Define an empty typedef for the _DRIVER_OBJECT structure so it may be
  1961. // referenced by function types before it is actually defined.
  1962. //
  1963. struct _DRIVER_OBJECT;
  1964. NTKERNELAPI
  1965. LOGICAL
  1966. MmIsDriverVerifying (
  1967. IN struct _DRIVER_OBJECT *DriverObject
  1968. );
  1969. // end_ntddk end_wdm end_ntosp
  1970. LOGICAL
  1971. MmTrimAllSystemPagableMemory (
  1972. IN LOGICAL PurgeTransition
  1973. );
  1974. #define MMNONPAGED_QUOTA_INCREASE (64*1024)
  1975. #define MMPAGED_QUOTA_INCREASE (512*1024)
  1976. #define MMNONPAGED_QUOTA_CHECK (256*1024)
  1977. #define MMPAGED_QUOTA_CHECK (1*1024*1024)
  1978. BOOLEAN
  1979. MmRaisePoolQuota (
  1980. IN POOL_TYPE PoolType,
  1981. IN SIZE_T OldQuotaLimit,
  1982. OUT PSIZE_T NewQuotaLimit
  1983. );
  1984. VOID
  1985. MmReturnPoolQuota (
  1986. IN POOL_TYPE PoolType,
  1987. IN SIZE_T ReturnedQuota
  1988. );
  1989. //
  1990. // Zero page thread routine.
  1991. //
  1992. VOID
  1993. MmZeroPageThread (
  1994. VOID
  1995. );
  1996. NTSTATUS
  1997. MmCopyVirtualMemory (
  1998. IN PEPROCESS FromProcess,
  1999. IN CONST VOID *FromAddress,
  2000. IN PEPROCESS ToProcess,
  2001. OUT PVOID ToAddress,
  2002. IN SIZE_T BufferSize,
  2003. IN KPROCESSOR_MODE PreviousMode,
  2004. OUT PSIZE_T NumberOfBytesCopied
  2005. );
  2006. NTSTATUS
  2007. MmGetSectionRange (
  2008. IN PVOID AddressWithinSection,
  2009. OUT PVOID *StartingSectionAddress,
  2010. OUT PULONG SizeofSection
  2011. );
  2012. // begin_ntosp
  2013. VOID
  2014. MmMapMemoryDumpMdl (
  2015. IN OUT PMDL MemoryDumpMdl
  2016. );
  2017. // begin_ntminiport
  2018. //
  2019. // Graphics support routines.
  2020. //
  2021. typedef
  2022. VOID
  2023. (*PBANKED_SECTION_ROUTINE) (
  2024. IN ULONG ReadBank,
  2025. IN ULONG WriteBank,
  2026. IN PVOID Context
  2027. );
  2028. // end_ntminiport
  2029. NTSTATUS
  2030. MmSetBankedSection (
  2031. IN HANDLE ProcessHandle,
  2032. IN PVOID VirtualAddress,
  2033. IN ULONG BankLength,
  2034. IN BOOLEAN ReadWriteBank,
  2035. IN PBANKED_SECTION_ROUTINE BankRoutine,
  2036. IN PVOID Context);
  2037. // end_ntosp
  2038. BOOLEAN
  2039. MmVerifyImageIsOkForMpUse (
  2040. IN PVOID BaseAddress
  2041. );
  2042. NTSTATUS
  2043. MmMemoryUsage (
  2044. IN PVOID Buffer,
  2045. IN ULONG Size,
  2046. IN ULONG Type,
  2047. OUT PULONG Length
  2048. );
  2049. typedef
  2050. VOID
  2051. (FASTCALL *PPAGE_FAULT_NOTIFY_ROUTINE) (
  2052. IN NTSTATUS Status,
  2053. IN PVOID VirtualAddress,
  2054. IN PVOID TrapInformation
  2055. );
  2056. NTKERNELAPI
  2057. VOID
  2058. FASTCALL
  2059. MmSetPageFaultNotifyRoutine (
  2060. IN PPAGE_FAULT_NOTIFY_ROUTINE NotifyRoutine
  2061. );
  2062. NTSTATUS
  2063. MmCallDllInitialize (
  2064. IN PKLDR_DATA_TABLE_ENTRY DataTableEntry,
  2065. IN PLIST_ENTRY ModuleListHead
  2066. );
  2067. //
  2068. // Crash dump only
  2069. // Called to initialize the kernel memory for a kernel
  2070. // memory dump.
  2071. //
  2072. typedef
  2073. NTSTATUS
  2074. (*PMM_SET_DUMP_RANGE) (
  2075. IN struct _MM_KERNEL_DUMP_CONTEXT* Context,
  2076. IN PVOID StartVa,
  2077. IN PFN_NUMBER Pages,
  2078. IN ULONG AddressFlags
  2079. );
  2080. typedef
  2081. NTSTATUS
  2082. (*PMM_FREE_DUMP_RANGE) (
  2083. IN struct _MM_KERNEL_DUMP_CONTEXT* Context,
  2084. IN PVOID StartVa,
  2085. IN PFN_NUMBER Pages,
  2086. IN ULONG AddressFlags
  2087. );
  2088. typedef struct _MM_KERNEL_DUMP_CONTEXT {
  2089. PVOID Context;
  2090. PMM_SET_DUMP_RANGE SetDumpRange;
  2091. PMM_FREE_DUMP_RANGE FreeDumpRange;
  2092. } MM_KERNEL_DUMP_CONTEXT, *PMM_KERNEL_DUMP_CONTEXT;
  2093. VOID
  2094. MmGetKernelDumpRange (
  2095. IN PMM_KERNEL_DUMP_CONTEXT Callback
  2096. );
  2097. // begin_ntifs
  2098. //
  2099. // Prefetch public interface.
  2100. //
  2101. typedef struct _READ_LIST {
  2102. PFILE_OBJECT FileObject;
  2103. ULONG NumberOfEntries;
  2104. LOGICAL IsImage;
  2105. FILE_SEGMENT_ELEMENT List[ANYSIZE_ARRAY];
  2106. } READ_LIST, *PREAD_LIST;
  2107. NTSTATUS
  2108. MmPrefetchPages (
  2109. IN ULONG NumberOfLists,
  2110. IN PREAD_LIST *ReadLists
  2111. );
  2112. // end_ntifs
  2113. NTSTATUS
  2114. MmPrefetchPagesIntoLockedMdl (
  2115. IN PFILE_OBJECT FileObject,
  2116. IN PLARGE_INTEGER FileOffset,
  2117. IN SIZE_T Length,
  2118. OUT PMDL *MdlOut
  2119. );
  2120. LOGICAL
  2121. MmIsMemoryAvailable (
  2122. IN PFN_NUMBER PagesDesired
  2123. );
  2124. NTSTATUS
  2125. MmIdentifyPhysicalMemory (
  2126. VOID
  2127. );
  2128. PFILE_OBJECT *
  2129. MmPerfUnusedSegmentsEnumerate (
  2130. VOID
  2131. );
  2132. NTSTATUS
  2133. MmPerfSnapShotValidPhysicalMemory (
  2134. VOID
  2135. );
  2136. PFILE_OBJECT *
  2137. MmPerfVadTreeWalk (
  2138. PEPROCESS Process
  2139. );
  2140. #endif // MM