mirror of https://github.com/lianthony/NT4.0
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.
1540 lines
28 KiB
1540 lines
28 KiB
/*-- BUILD Version: 0005 // Increment this if a change has global effects
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
mm.h
|
|
|
|
Abstract:
|
|
|
|
This module contains the public data structures and procedure
|
|
prototypes for the memory management system.
|
|
|
|
Author:
|
|
|
|
Lou Perazzoli (loup) 20-Mar-1989
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef _MM_
|
|
#define _MM_
|
|
|
|
#define MAX_PHYSICAL_MEMORY_FRAGMENTS 20
|
|
|
|
typedef struct _PHYSICAL_MEMORY_RUN {
|
|
ULONG BasePage;
|
|
ULONG PageCount;
|
|
} PHYSICAL_MEMORY_RUN, *PPHYSICAL_MEMORY_RUN;
|
|
|
|
typedef struct _PHYSICAL_MEMORY_DESCRIPTOR {
|
|
ULONG NumberOfRuns;
|
|
ULONG NumberOfPages;
|
|
PHYSICAL_MEMORY_RUN Run[1];
|
|
} PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR;
|
|
|
|
//
|
|
// Phyical memory blocks.
|
|
//
|
|
|
|
extern PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock;
|
|
|
|
//
|
|
// The allocation granularity is 64k.
|
|
//
|
|
|
|
#define MM_ALLOCATION_GRANULARITY ((ULONG)0x10000)
|
|
|
|
//
|
|
// Maximum read ahead size for cache operations.
|
|
//
|
|
|
|
#define MM_MAXIMUM_READ_CLUSTER_SIZE (15)
|
|
|
|
// begin_ntddk begin_nthal begin_ntifs
|
|
//
|
|
// Define maximum disk transfer size to be used by MM and Cache Manager,
|
|
// so that packet-oriented disk drivers can optimize their packet allocation
|
|
// to this size.
|
|
//
|
|
|
|
#define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
|
|
|
|
//++
|
|
//
|
|
// ULONG
|
|
// ROUND_TO_PAGES (
|
|
// IN ULONG Size
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// The ROUND_TO_PAGES macro takes a size in bytes and rounds it up to a
|
|
// multiple of the page size.
|
|
//
|
|
// NOTE: This macro fails for values 0xFFFFFFFF - (PAGE_SIZE - 1).
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Size - Size in bytes to round up to a page multiple.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// Returns the size rounded up to a multiple of the page size.
|
|
//
|
|
//--
|
|
|
|
#define ROUND_TO_PAGES(Size) (((ULONG)(Size) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
|
|
|
|
//++
|
|
//
|
|
// ULONG
|
|
// BYTES_TO_PAGES (
|
|
// IN ULONG Size
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// The BYTES_TO_PAGES macro takes the size in bytes and calculates the
|
|
// number of pages required to contain the bytes.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Size - Size in bytes.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// Returns the number of pages required to contain the specified size.
|
|
//
|
|
//--
|
|
|
|
#define BYTES_TO_PAGES(Size) (((ULONG)(Size) >> PAGE_SHIFT) + \
|
|
(((ULONG)(Size) & (PAGE_SIZE - 1)) != 0))
|
|
|
|
//++
|
|
//
|
|
// ULONG
|
|
// BYTE_OFFSET (
|
|
// IN PVOID Va
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// The BYTE_OFFSET macro takes a virtual address and returns the byte offset
|
|
// of that address within the page.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Va - Virtual address.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// Returns the byte offset portion of the virtual address.
|
|
//
|
|
//--
|
|
|
|
#define BYTE_OFFSET(Va) ((ULONG)(Va) & (PAGE_SIZE - 1))
|
|
|
|
//++
|
|
//
|
|
// PVOID
|
|
// PAGE_ALIGN (
|
|
// IN PVOID Va
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// The PAGE_ALIGN macro takes a virtual address and returns a page-aligned
|
|
// virtual address for that page.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Va - Virtual address.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// Returns the page aligned virtual address.
|
|
//
|
|
//--
|
|
|
|
#define PAGE_ALIGN(Va) ((PVOID)((ULONG)(Va) & ~(PAGE_SIZE - 1)))
|
|
|
|
//++
|
|
//
|
|
// ULONG
|
|
// ADDRESS_AND_SIZE_TO_SPAN_PAGES (
|
|
// IN PVOID Va,
|
|
// IN ULONG Size
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// The ADDRESS_AND_SIZE_TO_SPAN_PAGES macro takes a virtual address and
|
|
// size and returns the number of pages spanned by the size.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Va - Virtual address.
|
|
//
|
|
// Size - Size in bytes.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// Returns the number of pages spanned by the size.
|
|
//
|
|
//--
|
|
|
|
#define ADDRESS_AND_SIZE_TO_SPAN_PAGES(Va,Size) \
|
|
((((ULONG)((ULONG)(Size) - 1L) >> PAGE_SHIFT) + \
|
|
(((((ULONG)(Size-1)&(PAGE_SIZE-1)) + ((ULONG)Va & (PAGE_SIZE -1)))) >> PAGE_SHIFT)) + 1L)
|
|
|
|
#define COMPUTE_PAGES_SPANNED(Va, Size) \
|
|
((((ULONG)Va & (PAGE_SIZE -1)) + (Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT)
|
|
|
|
// end_ntddk end_nthal end_ntifs
|
|
|
|
|
|
//++
|
|
//
|
|
// BOOLEAN
|
|
// MM_IS_SYSTEM_VIRTUAL_ADDRESS
|
|
// IN PVOID Va,
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// The MM_IS_SYSTEM_VIRTUAL_ADDRESS macro takes a virtual address and
|
|
// returns TRUE if the virtual address is within system space,
|
|
// FALSE otherwise.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Va - Virtual address.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// Returns TRUE is the address is in system space.
|
|
//
|
|
//--
|
|
|
|
#define MM_IS_SYSTEM_VIRTUAL_ADDRESS(VA) ((VA) >= MM_LOWEST_SYSTEM_ADDRESS)
|
|
|
|
// begin_ntddk begin_nthal begin_ntifs
|
|
//++
|
|
//
|
|
// PVOID
|
|
// MmGetMdlVirtualAddress (
|
|
// IN PMDL Mdl
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// The MmGetMdlVirtualAddress returns the virual address of the buffer
|
|
// described by the Mdl.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Mdl - Pointer to an MDL.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// Returns the virtual address of the buffer described by the Mdl
|
|
//
|
|
//--
|
|
|
|
#define MmGetMdlVirtualAddress(Mdl) ((PVOID) ((PCHAR) (Mdl)->StartVa + (Mdl)->ByteOffset))
|
|
|
|
//++
|
|
//
|
|
// ULONG
|
|
// MmGetMdlByteCount (
|
|
// IN PMDL Mdl
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// The MmGetMdlByteCount returns the length in bytes of the buffer
|
|
// described by the Mdl.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Mdl - Pointer to an MDL.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// Returns the byte count of the buffer described by the Mdl
|
|
//
|
|
//--
|
|
|
|
#define MmGetMdlByteCount(Mdl) ((Mdl)->ByteCount)
|
|
|
|
//++
|
|
//
|
|
// ULONG
|
|
// MmGetMdlByteOffset (
|
|
// IN PMDL Mdl
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// The MmGetMdlByteOffset returns the byte offset within the page
|
|
// of the buffer described by the Mdl.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Mdl - Pointer to an MDL.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// Returns the byte offset within the page of the buffer described by the Mdl
|
|
//
|
|
//--
|
|
|
|
#define MmGetMdlByteOffset(Mdl) ((Mdl)->ByteOffset)
|
|
|
|
// end_ntddk end_nthal end_ntifs
|
|
|
|
//
|
|
// Section object type.
|
|
//
|
|
|
|
extern POBJECT_TYPE MmSectionObjectType;
|
|
|
|
//
|
|
// Number of pages to read in a single I/O if possible.
|
|
//
|
|
|
|
extern ULONG MmReadClusterSize;
|
|
|
|
//
|
|
// Number of colors in system.
|
|
//
|
|
|
|
extern ULONG MmNumberOfColors;
|
|
|
|
//
|
|
// Number of physical pages.
|
|
//
|
|
|
|
extern ULONG MmNumberOfPhysicalPages;
|
|
|
|
|
|
//
|
|
// Size of system cache in pages.
|
|
//
|
|
|
|
extern ULONG MmSizeOfSystemCacheInPages;
|
|
|
|
//
|
|
// System cache working set.
|
|
//
|
|
|
|
extern MMSUPPORT MmSystemCacheWs;
|
|
|
|
//
|
|
// Working set manager event.
|
|
//
|
|
|
|
extern KEVENT MmWorkingSetManagerEvent;
|
|
|
|
// begin_ntddk begin_nthal begin_ntifs
|
|
typedef enum _MM_SYSTEM_SIZE {
|
|
MmSmallSystem,
|
|
MmMediumSystem,
|
|
MmLargeSystem
|
|
} MM_SYSTEMSIZE;
|
|
|
|
NTKERNELAPI
|
|
MM_SYSTEMSIZE
|
|
MmQuerySystemSize(
|
|
VOID
|
|
);
|
|
|
|
NTKERNELAPI
|
|
BOOLEAN
|
|
MmIsThisAnNtAsSystem(
|
|
VOID
|
|
);
|
|
|
|
typedef enum _LOCK_OPERATION {
|
|
IoReadAccess,
|
|
IoWriteAccess,
|
|
IoModifyAccess
|
|
} LOCK_OPERATION;
|
|
|
|
// end_ntddk end_nthal end_ntifs
|
|
|
|
//
|
|
// NT product type.
|
|
//
|
|
|
|
extern ULONG MmProductType;
|
|
|
|
typedef struct _MMINFO_COUNTERS {
|
|
ULONG PageFaultCount;
|
|
ULONG CopyOnWriteCount;
|
|
ULONG TransitionCount;
|
|
ULONG CacheTransitionCount;
|
|
ULONG DemandZeroCount;
|
|
ULONG PageReadCount;
|
|
ULONG PageReadIoCount;
|
|
ULONG CacheReadCount;
|
|
ULONG CacheIoCount;
|
|
ULONG DirtyPagesWriteCount;
|
|
ULONG DirtyWriteIoCount;
|
|
ULONG MappedPagesWriteCount;
|
|
ULONG MappedWriteIoCount;
|
|
} MMINFO_COUNTERS;
|
|
|
|
typedef MMINFO_COUNTERS *PMMINFO_COUNTERS;
|
|
|
|
extern MMINFO_COUNTERS MmInfoCounters;
|
|
|
|
|
|
|
|
//
|
|
// Memory management initialization routine (for both phases).
|
|
//
|
|
|
|
BOOLEAN
|
|
MmInitSystem (
|
|
IN ULONG Phase,
|
|
IN PLOADER_PARAMETER_BLOCK LoaderBlock,
|
|
IN PPHYSICAL_MEMORY_DESCRIPTOR PhysicalMemoryBlock
|
|
);
|
|
|
|
VOID
|
|
MmInitializeMemoryLimits (
|
|
IN PLOADER_PARAMETER_BLOCK LoaderBlock,
|
|
IN PBOOLEAN IncludedType,
|
|
OUT PPHYSICAL_MEMORY_DESCRIPTOR Memory
|
|
);
|
|
|
|
VOID
|
|
MmFreeLoaderBlock (
|
|
IN PLOADER_PARAMETER_BLOCK LoaderBlock
|
|
);
|
|
|
|
//
|
|
// Shutdown routine - flushes dirty pages, etc for system shutdown.
|
|
//
|
|
|
|
BOOLEAN
|
|
MmShutdownSystem (
|
|
IN BOOLEAN RebootPending
|
|
);
|
|
|
|
//
|
|
// Pool support routines to allocate complete pages, not for
|
|
// general consumption, these are only used by the executive pool allocator.
|
|
//
|
|
|
|
PVOID
|
|
MiAllocatePoolPages (
|
|
IN POOL_TYPE PoolType,
|
|
IN ULONG SizeInBytes
|
|
);
|
|
|
|
ULONG
|
|
MiFreePoolPages (
|
|
IN PVOID StartingAddress
|
|
);
|
|
|
|
//
|
|
// Routine for determining which pool a given address resides within.
|
|
//
|
|
|
|
POOL_TYPE
|
|
MmDeterminePoolType (
|
|
IN PVOID VirtualAddress
|
|
);
|
|
|
|
//
|
|
// First level fault routine.
|
|
//
|
|
|
|
NTSTATUS
|
|
MmAccessFault (
|
|
IN BOOLEAN StoreInstruction,
|
|
IN PVOID VirtualAddress,
|
|
IN KPROCESSOR_MODE PreviousMode
|
|
);
|
|
|
|
//
|
|
// Process Support Routines.
|
|
//
|
|
|
|
BOOLEAN
|
|
MmCreateProcessAddressSpace (
|
|
IN ULONG MinimumWorkingSetSize,
|
|
IN PEPROCESS NewProcess,
|
|
OUT PULONG DirectoryTableBase
|
|
);
|
|
|
|
NTSTATUS
|
|
MmInitializeProcessAddressSpace (
|
|
IN PEPROCESS ProcessToInitialize,
|
|
IN PEPROCESS ProcessToClone OPTIONAL,
|
|
IN PVOID SectionToMap OPTIONAL
|
|
);
|
|
|
|
VOID
|
|
MmDeleteProcessAddressSpace (
|
|
IN PEPROCESS Process
|
|
);
|
|
|
|
VOID
|
|
MmCleanProcessAddressSpace (
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
MmCleanUserProcessAddressSpace (
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
MmCleanVirtualAddressDescriptor (
|
|
VOID
|
|
);
|
|
|
|
PVOID
|
|
MmCreateKernelStack (
|
|
BOOLEAN LargeStack
|
|
);
|
|
|
|
VOID
|
|
MmDeleteKernelStack (
|
|
IN PVOID PointerKernelStack,
|
|
IN BOOLEAN LargeStack
|
|
);
|
|
|
|
NTSTATUS
|
|
MmGrowKernelStack (
|
|
IN PVOID CurrentStack
|
|
);
|
|
|
|
VOID
|
|
MmOutPageKernelStack (
|
|
IN PKTHREAD Thread
|
|
);
|
|
|
|
VOID
|
|
MmInPageKernelStack (
|
|
IN PKTHREAD Thread
|
|
);
|
|
|
|
VOID
|
|
MmOutSwapProcess (
|
|
IN PKPROCESS Process
|
|
);
|
|
|
|
VOID
|
|
MmInSwapProcess (
|
|
IN PKPROCESS Process
|
|
);
|
|
|
|
PTEB
|
|
MmCreateTeb (
|
|
IN PEPROCESS TargetProcess,
|
|
IN PINITIAL_TEB InitialTeb,
|
|
IN PCLIENT_ID ClientId
|
|
);
|
|
|
|
PPEB
|
|
MmCreatePeb (
|
|
IN PEPROCESS TargetProcess,
|
|
IN PINITIAL_PEB InitialPeb
|
|
);
|
|
|
|
VOID
|
|
MmDeleteTeb (
|
|
IN PEPROCESS TargetProcess,
|
|
IN PVOID TebBase
|
|
);
|
|
|
|
VOID
|
|
MmAllowWorkingSetExpansion (
|
|
VOID
|
|
);
|
|
|
|
NTSTATUS
|
|
MmAdjustWorkingSetSize (
|
|
IN ULONG WorkingSetMinimum,
|
|
IN ULONG WorkingSetMaximum,
|
|
IN ULONG SystemCache
|
|
);
|
|
|
|
VOID
|
|
MmAdjustPageFileQuota (
|
|
IN ULONG NewPageFileQuota
|
|
);
|
|
|
|
VOID
|
|
MmWorkingSetManager (
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
MmSetMemoryPriorityProcess(
|
|
IN PEPROCESS Process,
|
|
IN UCHAR MemoryPriority
|
|
);
|
|
|
|
//
|
|
// Dynamic system loading support
|
|
//
|
|
|
|
NTSTATUS
|
|
MmLoadSystemImage (
|
|
IN PUNICODE_STRING ImageFileName,
|
|
OUT PVOID *Section,
|
|
OUT PVOID *ImageBaseAddress
|
|
);
|
|
|
|
VOID
|
|
MmFreeDriverInitialization (
|
|
IN PVOID Section
|
|
);
|
|
|
|
NTSTATUS
|
|
MmUnloadSystemImage (
|
|
IN PVOID Section
|
|
);
|
|
|
|
//
|
|
// Cache manager support
|
|
//
|
|
|
|
// begin_ntifs
|
|
|
|
#if defined(_NTDDK_) || defined(_NTIFS_)
|
|
|
|
NTKERNELAPI
|
|
BOOLEAN
|
|
MmIsRecursiveIoFault(
|
|
VOID
|
|
);
|
|
|
|
#else
|
|
|
|
//++
|
|
//
|
|
// BOOLEAN
|
|
// MmIsRecursiveIoFault (
|
|
// VOID
|
|
// );
|
|
//
|
|
// Routine Description:
|
|
//
|
|
//
|
|
// This macro examines the thread's page fault clustering informatation
|
|
// and determines if the current page fault is occuring during an I/O
|
|
// operation.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// Returns TRUE if the fault is occuring during an I/O operation,
|
|
// FALSE otherwise.
|
|
//
|
|
//--
|
|
|
|
#define MmIsRecursiveIoFault() \
|
|
((PsGetCurrentThread()->DisablePageFaultClustering) | \
|
|
(PsGetCurrentThread()->ForwardClusterOnly))
|
|
|
|
#endif
|
|
|
|
// end_ntifs
|
|
|
|
//++
|
|
//
|
|
// VOID
|
|
// MmDisablePageFaultClustering
|
|
// OUT PULONG SavedState
|
|
// );
|
|
//
|
|
// Routine Description:
|
|
//
|
|
//
|
|
// This macro disables page fault clustering for the current thread.
|
|
// Note, that this indicates that file system I/O is in progress
|
|
// for that thread.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// SavedState - returns previous state of page fault clustering which
|
|
// is guaranteed to be nonzero
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None.
|
|
//
|
|
//--
|
|
|
|
#define MmDisablePageFaultClustering(SavedState) { \
|
|
*(SavedState) = 2 + (ULONG)PsGetCurrentThread()->DisablePageFaultClustering;\
|
|
PsGetCurrentThread()->DisablePageFaultClustering = TRUE; }
|
|
|
|
|
|
//++
|
|
//
|
|
// VOID
|
|
// MmEnablePageFaultClustering
|
|
// IN ULONG SavedState
|
|
// );
|
|
//
|
|
// Routine Description:
|
|
//
|
|
//
|
|
// This macro enables page fault clustering for the current thread.
|
|
// Note, that this indicates that no file system I/O is in progress for
|
|
// that thread.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// SavedState - supplies previous state of page fault clustering
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None.
|
|
//
|
|
//--
|
|
|
|
#define MmEnablePageFaultClustering(SavedState) { \
|
|
PsGetCurrentThread()->DisablePageFaultClustering = (BOOLEAN)(SavedState - 2); }
|
|
|
|
//++
|
|
//
|
|
// VOID
|
|
// MmSavePageFaultReadAhead
|
|
// IN PETHREAD Thread,
|
|
// OUT PULONG SavedState
|
|
// );
|
|
//
|
|
// Routine Description:
|
|
//
|
|
//
|
|
// This macro saves the page fault read ahead value for the specified
|
|
// thread.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Thread - Supplies a pointer to the current thread.
|
|
//
|
|
// SavedState - returns previous state of page fault read ahead
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None.
|
|
//
|
|
//--
|
|
|
|
|
|
#define MmSavePageFaultReadAhead(Thread,SavedState) { \
|
|
*(SavedState) = (Thread)->ReadClusterSize * 2 + \
|
|
(Thread)->ForwardClusterOnly; }
|
|
|
|
//++
|
|
//
|
|
// VOID
|
|
// MmSetPageFaultReadAhead
|
|
// IN PETHREAD Thread,
|
|
// IN ULONG ReadAhead
|
|
// );
|
|
//
|
|
// Routine Description:
|
|
//
|
|
//
|
|
// This macro sets the page fault read ahead value for the specified
|
|
// thread, and indicates that file system I/O is in progress for that
|
|
// thread.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Thread - Supplies a pointer to the current thread.
|
|
//
|
|
// ReadAhead - Supplies the number of pages to read in addition to
|
|
// the page the fault is taken on. A value of 0
|
|
// reads only the faulting page, a value of 1 reads in
|
|
// the faulting page and the following page, etc.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None.
|
|
//
|
|
//--
|
|
|
|
|
|
#define MmSetPageFaultReadAhead(Thread,ReadAhead) { \
|
|
(Thread)->ForwardClusterOnly = TRUE; \
|
|
if ((ReadAhead) > MM_MAXIMUM_READ_CLUSTER_SIZE) { \
|
|
(Thread)->ReadClusterSize = MM_MAXIMUM_READ_CLUSTER_SIZE;\
|
|
} else { \
|
|
(Thread)->ReadClusterSize = (ReadAhead); \
|
|
} }
|
|
|
|
//++
|
|
//
|
|
// VOID
|
|
// MmResetPageFaultReadAhead
|
|
// IN PETHREAD Thread,
|
|
// IN ULONG SavedState
|
|
// );
|
|
//
|
|
// Routine Description:
|
|
//
|
|
//
|
|
// This macro resets the default page fault read ahead value for the specified
|
|
// thread, and indicates that file system I/O is not in progress for that
|
|
// thread.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Thread - Supplies a pointer to the current thread.
|
|
//
|
|
// SavedState - supplies previous state of page fault read ahead
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None.
|
|
//
|
|
//--
|
|
|
|
#define MmResetPageFaultReadAhead(Thread, SavedState) { \
|
|
(Thread)->ForwardClusterOnly = (BOOLEAN)((SavedState) & 1); \
|
|
(Thread)->ReadClusterSize = (SavedState) / 2; }
|
|
|
|
//
|
|
// The order of this list is important, the zeroed, free and standby
|
|
// must occur before the modified or bad so comparisions can be
|
|
// made when pages are added to a list.
|
|
//
|
|
// NOTE: This field is limited to 8 elements.
|
|
//
|
|
|
|
#define NUMBER_OF_PAGE_LISTS 8
|
|
|
|
typedef enum _MMLISTS {
|
|
ZeroedPageList,
|
|
FreePageList,
|
|
StandbyPageList, //this list and before make up available pages.
|
|
ModifiedPageList,
|
|
ModifiedNoWritePageList,
|
|
BadPageList,
|
|
ActiveAndValid,
|
|
TransitionPage
|
|
} MMLISTS;
|
|
|
|
typedef struct _MMPFNLIST {
|
|
ULONG Total;
|
|
MMLISTS ListName;
|
|
ULONG Flink;
|
|
ULONG Blink;
|
|
} MMPFNLIST;
|
|
|
|
typedef MMPFNLIST *PMMPFNLIST;
|
|
|
|
extern MMPFNLIST MmModifiedPageListHead;
|
|
|
|
extern ULONG MmThrottleTop;
|
|
extern ULONG MmThrottleBottom;
|
|
|
|
//++
|
|
//
|
|
// BOOLEAN
|
|
// MmEnoughMemoryForWrite (
|
|
// VOID
|
|
// );
|
|
//
|
|
// Routine Description:
|
|
//
|
|
//
|
|
// This macro checks the modified pages and available pages to determine
|
|
// to allow the cache manager to throttle write operations.
|
|
//
|
|
// For NTAS:
|
|
// Writes are blocked if there are less than 127 available pages OR
|
|
// there are more than 1000 modified pages AND less than 450 available pages.
|
|
//
|
|
// For DeskTop:
|
|
// Writes are blocked if there are less than 30 available pages OR
|
|
// there are more than 1000 modified pages AND less than 250 available pages.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// None.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// TRUE if ample memory exists and the write should proceed.
|
|
//
|
|
//--
|
|
|
|
#define MmEnoughMemoryForWrite() \
|
|
((MmAvailablePages > MmThrottleTop) \
|
|
|| \
|
|
(((MmModifiedPageListHead.Total < 1000)) && \
|
|
(MmAvailablePages > MmThrottleBottom)))
|
|
|
|
|
|
NTSTATUS
|
|
MmCreateSection (
|
|
OUT PVOID *SectionObject,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
|
|
IN PLARGE_INTEGER MaximumSize,
|
|
IN ULONG SectionPageProtection,
|
|
IN ULONG AllocationAttributes,
|
|
IN HANDLE FileHandle OPTIONAL,
|
|
IN PFILE_OBJECT File OPTIONAL
|
|
);
|
|
|
|
|
|
NTSTATUS
|
|
MmMapViewOfSection(
|
|
IN PVOID SectionToMap,
|
|
IN PEPROCESS Process,
|
|
IN OUT PVOID *CapturedBase,
|
|
IN ULONG ZeroBits,
|
|
IN ULONG CommitSize,
|
|
IN OUT PLARGE_INTEGER SectionOffset,
|
|
IN OUT PULONG CapturedViewSize,
|
|
IN SECTION_INHERIT InheritDisposition,
|
|
IN ULONG AllocationType,
|
|
IN ULONG Protect
|
|
);
|
|
|
|
NTSTATUS
|
|
MmUnmapViewOfSection(
|
|
IN PEPROCESS Process,
|
|
IN PVOID BaseAddress
|
|
);
|
|
|
|
// begin_ntifs
|
|
|
|
BOOLEAN
|
|
MmForceSectionClosed (
|
|
IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
|
|
IN BOOLEAN DelayClose
|
|
);
|
|
|
|
// end_ntifs
|
|
|
|
NTSTATUS
|
|
MmGetFileNameForSection (
|
|
IN HANDLE Section,
|
|
OUT PSTRING FileName
|
|
);
|
|
|
|
NTSTATUS
|
|
MmGetPageFileInformation(
|
|
OUT PVOID SystemInformation,
|
|
IN ULONG SystemInformationLength,
|
|
OUT PULONG Length
|
|
);
|
|
|
|
NTSTATUS
|
|
MmExtendSection (
|
|
IN PVOID SectionToExtend,
|
|
IN OUT PLARGE_INTEGER NewSectionSize,
|
|
IN ULONG IgnoreFileSizeChecking
|
|
);
|
|
|
|
NTSTATUS
|
|
MmFlushVirtualMemory (
|
|
IN PEPROCESS Process,
|
|
IN OUT PVOID *BaseAddress,
|
|
IN OUT PULONG RegionSize,
|
|
OUT PIO_STATUS_BLOCK IoStatus
|
|
);
|
|
|
|
NTSTATUS
|
|
MmMapViewInSystemCache (
|
|
IN PVOID SectionToMap,
|
|
OUT PVOID *CapturedBase,
|
|
IN OUT PLARGE_INTEGER SectionOffset,
|
|
IN OUT PULONG CapturedViewSize
|
|
);
|
|
|
|
VOID
|
|
MmUnmapViewInSystemCache (
|
|
IN PVOID BaseAddress,
|
|
IN PVOID SectionToUnmap,
|
|
IN ULONG AddToFront
|
|
);
|
|
|
|
BOOLEAN
|
|
MmPurgeSection (
|
|
IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
|
|
IN PLARGE_INTEGER Offset OPTIONAL,
|
|
IN ULONG RegionSize,
|
|
IN ULONG IgnoreCacheViews
|
|
);
|
|
|
|
NTSTATUS
|
|
MmFlushSection (
|
|
IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
|
|
IN PLARGE_INTEGER Offset OPTIONAL,
|
|
IN ULONG RegionSize,
|
|
OUT PIO_STATUS_BLOCK IoStatus,
|
|
IN ULONG AcquireFile
|
|
);
|
|
|
|
NTSTATUS
|
|
MmGetCrashDumpInformation (
|
|
IN PSYSTEM_CRASH_DUMP_INFORMATION CrashInfo
|
|
);
|
|
|
|
NTSTATUS
|
|
MmGetCrashDumpStateInformation (
|
|
IN PSYSTEM_CRASH_STATE_INFORMATION CrashInfo
|
|
);
|
|
|
|
// begin_ntifs
|
|
|
|
typedef enum _MMFLUSH_TYPE {
|
|
MmFlushForDelete,
|
|
MmFlushForWrite
|
|
} MMFLUSH_TYPE;
|
|
|
|
|
|
BOOLEAN
|
|
MmFlushImageSection (
|
|
IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
|
|
IN MMFLUSH_TYPE FlushType
|
|
);
|
|
|
|
BOOLEAN
|
|
MmCanFileBeTruncated (
|
|
IN PSECTION_OBJECT_POINTERS SectionPointer,
|
|
IN PLARGE_INTEGER NewFileSize
|
|
);
|
|
|
|
|
|
// end_ntifs
|
|
|
|
BOOLEAN
|
|
MmDisableModifiedWriteOfSection (
|
|
IN PSECTION_OBJECT_POINTERS SectionObjectPointer
|
|
);
|
|
|
|
VOID
|
|
MmPurgeWorkingSet (
|
|
IN PEPROCESS Process,
|
|
IN PVOID BaseAddress,
|
|
IN ULONG RegionSize
|
|
);
|
|
|
|
BOOLEAN // ntifs
|
|
MmSetAddressRangeModified ( // ntifs
|
|
IN PVOID Address, // ntifs
|
|
IN ULONG Length // ntifs
|
|
); // ntifs
|
|
|
|
BOOLEAN
|
|
MmCheckCachedPageState (
|
|
IN PVOID Address,
|
|
IN BOOLEAN SetToZero
|
|
);
|
|
|
|
NTSTATUS
|
|
MmCopyToCachedPage (
|
|
IN PVOID Address,
|
|
IN PVOID UserBuffer,
|
|
IN ULONG Offset,
|
|
IN ULONG CountInBytes,
|
|
IN BOOLEAN DontZero
|
|
);
|
|
|
|
VOID
|
|
MmUnlockCachedPage (
|
|
IN PVOID AddressInCache
|
|
);
|
|
|
|
PVOID
|
|
MmDbgReadCheck (
|
|
IN PVOID VirtualAddress
|
|
);
|
|
|
|
PVOID
|
|
MmDbgWriteCheck (
|
|
IN PVOID VirtualAddress
|
|
);
|
|
|
|
PVOID
|
|
MmDbgTranslatePhysicalAddress (
|
|
IN PHYSICAL_ADDRESS PhysicalAddress
|
|
);
|
|
|
|
|
|
// begin_ntddk begin_nthal begin_ntifs
|
|
//
|
|
// I/O support routines.
|
|
//
|
|
|
|
NTKERNELAPI
|
|
VOID
|
|
MmProbeAndLockPages (
|
|
IN OUT PMDL MemoryDescriptorList,
|
|
IN KPROCESSOR_MODE AccessMode,
|
|
IN LOCK_OPERATION Operation
|
|
);
|
|
|
|
NTKERNELAPI
|
|
VOID
|
|
MmUnlockPages (
|
|
IN PMDL MemoryDescriptorList
|
|
);
|
|
|
|
NTKERNELAPI
|
|
VOID
|
|
MmBuildMdlForNonPagedPool (
|
|
IN OUT PMDL MemoryDescriptorList
|
|
);
|
|
|
|
NTKERNELAPI
|
|
PVOID
|
|
MmMapLockedPages (
|
|
IN PMDL MemoryDescriptorList,
|
|
IN KPROCESSOR_MODE AccessMode
|
|
);
|
|
|
|
NTKERNELAPI
|
|
VOID
|
|
MmUnmapLockedPages (
|
|
IN PVOID BaseAddress,
|
|
IN PMDL MemoryDescriptorList
|
|
);
|
|
|
|
|
|
NTKERNELAPI
|
|
PVOID
|
|
MmMapIoSpace (
|
|
IN PHYSICAL_ADDRESS PhysicalAddress,
|
|
IN ULONG NumberOfBytes,
|
|
IN MEMORY_CACHING_TYPE CacheType
|
|
);
|
|
|
|
NTKERNELAPI
|
|
VOID
|
|
MmUnmapIoSpace (
|
|
IN PVOID BaseAddress,
|
|
IN ULONG NumberOfBytes
|
|
);
|
|
|
|
NTKERNELAPI
|
|
VOID
|
|
MmProbeAndLockSelectedPages (
|
|
IN OUT PMDL MemoryDescriptorList,
|
|
IN PFILE_SEGMENT_ELEMENT SegmentArray,
|
|
IN KPROCESSOR_MODE AccessMode,
|
|
IN LOCK_OPERATION Operation
|
|
);
|
|
|
|
NTKERNELAPI
|
|
PVOID
|
|
MmMapVideoDisplay (
|
|
IN PHYSICAL_ADDRESS PhysicalAddress,
|
|
IN ULONG NumberOfBytes,
|
|
IN MEMORY_CACHING_TYPE CacheType
|
|
);
|
|
|
|
NTKERNELAPI
|
|
VOID
|
|
MmUnmapVideoDisplay (
|
|
IN PVOID BaseAddress,
|
|
IN ULONG NumberOfBytes
|
|
);
|
|
|
|
NTKERNELAPI
|
|
PHYSICAL_ADDRESS
|
|
MmGetPhysicalAddress (
|
|
IN PVOID BaseAddress
|
|
);
|
|
|
|
NTKERNELAPI
|
|
PVOID
|
|
MmGetVirtualForPhysical (
|
|
IN PHYSICAL_ADDRESS PhysicalAddress
|
|
);
|
|
|
|
NTKERNELAPI
|
|
PVOID
|
|
MmAllocateContiguousMemory (
|
|
IN ULONG NumberOfBytes,
|
|
IN PHYSICAL_ADDRESS HighestAcceptableAddress
|
|
);
|
|
|
|
NTKERNELAPI
|
|
VOID
|
|
MmFreeContiguousMemory (
|
|
IN PVOID BaseAddress
|
|
);
|
|
|
|
NTKERNELAPI
|
|
PVOID
|
|
MmAllocateNonCachedMemory (
|
|
IN ULONG NumberOfBytes
|
|
);
|
|
|
|
NTKERNELAPI
|
|
VOID
|
|
MmFreeNonCachedMemory (
|
|
IN PVOID BaseAddress,
|
|
IN ULONG NumberOfBytes
|
|
);
|
|
|
|
NTKERNELAPI
|
|
BOOLEAN
|
|
MmIsAddressValid (
|
|
IN PVOID VirtualAddress
|
|
);
|
|
|
|
|
|
NTKERNELAPI
|
|
BOOLEAN
|
|
MmIsNonPagedSystemAddressValid (
|
|
IN PVOID VirtualAddress
|
|
);
|
|
|
|
NTKERNELAPI
|
|
ULONG
|
|
MmSizeOfMdl(
|
|
IN PVOID Base,
|
|
IN ULONG Length
|
|
);
|
|
|
|
NTKERNELAPI
|
|
PMDL
|
|
MmCreateMdl(
|
|
IN PMDL MemoryDescriptorList OPTIONAL,
|
|
IN PVOID Base,
|
|
IN ULONG Length
|
|
);
|
|
|
|
NTKERNELAPI
|
|
PVOID
|
|
MmLockPagableDataSection(
|
|
IN PVOID AddressWithinSection
|
|
);
|
|
|
|
NTKERNELAPI
|
|
VOID
|
|
MmLockPagableSectionByHandle (
|
|
IN PVOID ImageSectionHandle
|
|
);
|
|
|
|
NTKERNELAPI
|
|
VOID
|
|
MmLockPagedPool (
|
|
IN PVOID Address,
|
|
IN ULONG Size
|
|
);
|
|
|
|
NTKERNELAPI
|
|
VOID
|
|
MmUnlockPagedPool (
|
|
IN PVOID Address,
|
|
IN ULONG Size
|
|
);
|
|
|
|
|
|
NTKERNELAPI
|
|
VOID
|
|
MmResetDriverPaging (
|
|
IN PVOID AddressWithinSection
|
|
);
|
|
|
|
|
|
NTKERNELAPI
|
|
PVOID
|
|
MmPageEntireDriver (
|
|
IN PVOID AddressWithinSection
|
|
);
|
|
|
|
NTKERNELAPI
|
|
VOID
|
|
MmUnlockPagableImageSection(
|
|
IN PVOID ImageSectionHandle
|
|
);
|
|
|
|
|
|
NTKERNELAPI
|
|
HANDLE
|
|
MmSecureVirtualMemory (
|
|
IN PVOID Address,
|
|
IN ULONG Size,
|
|
IN ULONG ProbeMode
|
|
);
|
|
|
|
NTKERNELAPI
|
|
VOID
|
|
MmUnsecureVirtualMemory (
|
|
IN HANDLE SecureHandle
|
|
);
|
|
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
MmMapViewInSystemSpace (
|
|
IN PVOID Section,
|
|
OUT PVOID *MappedBase,
|
|
IN PULONG ViewSize
|
|
);
|
|
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
MmUnmapViewInSystemSpace (
|
|
IN PVOID MappedBase
|
|
);
|
|
|
|
|
|
|
|
//++
|
|
//
|
|
// VOID
|
|
// MmInitializeMdl (
|
|
// IN PMDL MemoryDescriptorList,
|
|
// IN PVOID BaseVa,
|
|
// IN ULONG Length
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// This routine initializes the header of a Memory Descriptor List (MDL).
|
|
//
|
|
// Arguments:
|
|
//
|
|
// MemoryDescriptorList - Pointer to the MDL to initialize.
|
|
//
|
|
// BaseVa - Base virtual address mapped by the MDL.
|
|
//
|
|
// Length - Length, in bytes, of the buffer mapped by the MDL.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None.
|
|
//
|
|
//--
|
|
|
|
#define MmInitializeMdl(MemoryDescriptorList, BaseVa, Length) { \
|
|
(MemoryDescriptorList)->Next = (PMDL) NULL; \
|
|
(MemoryDescriptorList)->Size = (CSHORT)(sizeof(MDL) + \
|
|
(sizeof(ULONG) * ADDRESS_AND_SIZE_TO_SPAN_PAGES((BaseVa), (Length)))); \
|
|
(MemoryDescriptorList)->MdlFlags = 0; \
|
|
(MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN((BaseVa)); \
|
|
(MemoryDescriptorList)->ByteOffset = BYTE_OFFSET((BaseVa)); \
|
|
(MemoryDescriptorList)->ByteCount = (Length); \
|
|
}
|
|
|
|
//++
|
|
//
|
|
// PVOID
|
|
// MmGetSystemAddressForMdl (
|
|
// IN PMDL MDL
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// This routine returns the mapped address of an MDL, if the
|
|
// Mdl is not already mapped or a system address, it is mapped.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// MemoryDescriptorList - Pointer to the MDL to map.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// Returns the base address where the pages are mapped. The base address
|
|
// has the same offset as the virtual address in the MDL.
|
|
//
|
|
//--
|
|
|
|
//#define MmGetSystemAddressForMdl(MDL)
|
|
// (((MDL)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA)) ?
|
|
// ((MDL)->MappedSystemVa) :
|
|
// ((((MDL)->MdlFlags & (MDL_SOURCE_IS_NONPAGED_POOL)) ?
|
|
// ((PVOID)((ULONG)(MDL)->StartVa | (MDL)->ByteOffset)) :
|
|
// (MmMapLockedPages((MDL),KernelMode)))))
|
|
|
|
#define MmGetSystemAddressForMdl(MDL) \
|
|
(((MDL)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | \
|
|
MDL_SOURCE_IS_NONPAGED_POOL)) ? \
|
|
((MDL)->MappedSystemVa) : \
|
|
(MmMapLockedPages((MDL),KernelMode)))
|
|
|
|
//++
|
|
//
|
|
// VOID
|
|
// MmPrepareMdlForReuse (
|
|
// IN PMDL MDL
|
|
// )
|
|
//
|
|
// Routine Description:
|
|
//
|
|
// This routine will take all of the steps necessary to allow an MDL to be
|
|
// re-used.
|
|
//
|
|
// Arguments:
|
|
//
|
|
// MemoryDescriptorList - Pointer to the MDL that will be re-used.
|
|
//
|
|
// Return Value:
|
|
//
|
|
// None.
|
|
//
|
|
//--
|
|
|
|
#define MmPrepareMdlForReuse(MDL) \
|
|
if (((MDL)->MdlFlags & MDL_PARTIAL_HAS_BEEN_MAPPED) != 0) { \
|
|
ASSERT(((MDL)->MdlFlags & MDL_PARTIAL) != 0); \
|
|
MmUnmapLockedPages( (MDL)->MappedSystemVa, (MDL) ); \
|
|
} else if (((MDL)->MdlFlags & MDL_PARTIAL) == 0) { \
|
|
ASSERT(((MDL)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
|
|
}
|
|
|
|
|
|
// end_ntddk end_nthal end_ntifs
|
|
|
|
#if DBG || (i386 && !FPO)
|
|
typedef NTSTATUS (*PMM_SNAPSHOT_POOL_PAGE)(
|
|
IN PVOID Address,
|
|
IN ULONG Size,
|
|
IN PSYSTEM_POOL_INFORMATION PoolInformation,
|
|
IN PSYSTEM_POOL_ENTRY *PoolEntryInfo,
|
|
IN ULONG Length,
|
|
IN OUT PULONG RequiredLength
|
|
);
|
|
|
|
NTSTATUS
|
|
MmSnapShotPool(
|
|
IN POOL_TYPE PoolType,
|
|
IN PMM_SNAPSHOT_POOL_PAGE SnapShotPoolPage,
|
|
IN PSYSTEM_POOL_INFORMATION PoolInformation,
|
|
IN ULONG Length,
|
|
IN OUT PULONG RequiredLength
|
|
);
|
|
#endif // DBG || (i386 && !FPO)
|
|
|
|
#if DBG
|
|
VOID
|
|
MmInitializeSpecialPool (
|
|
VOID
|
|
);
|
|
|
|
PVOID
|
|
MmAllocateSpecialPool (
|
|
IN ULONG NumberOfBytes,
|
|
IN ULONG Tag
|
|
);
|
|
|
|
VOID
|
|
MmFreeSpecialPool (
|
|
IN PVOID P
|
|
);
|
|
|
|
extern ULONG MmSpecialPoolTag;
|
|
extern PVOID MmSpecialPoolStart;
|
|
extern PVOID MmSpecialPoolEnd;
|
|
|
|
#endif // DBG
|
|
|
|
#define MMNONPAGED_QUOTA_INCREASE (64*1024)
|
|
|
|
#define MMPAGED_QUOTA_INCREASE (512*1024)
|
|
|
|
#define MMNONPAGED_QUOTA_CHECK (256*1024)
|
|
|
|
#define MMPAGED_QUOTA_CHECK (4*1024*1024)
|
|
|
|
BOOLEAN
|
|
MmRaisePoolQuota(
|
|
IN POOL_TYPE PoolType,
|
|
IN ULONG OldQuotaLimit,
|
|
OUT PULONG NewQuotaLimit
|
|
);
|
|
|
|
VOID
|
|
MmReturnPoolQuota(
|
|
IN POOL_TYPE PoolType,
|
|
IN ULONG ReturnedQuota
|
|
);
|
|
|
|
//
|
|
// Zero page thread routine.
|
|
//
|
|
|
|
VOID
|
|
MmZeroPageThread (
|
|
VOID
|
|
);
|
|
|
|
NTSTATUS
|
|
MmCopyVirtualMemory(
|
|
IN PEPROCESS FromProcess,
|
|
IN PVOID FromAddress,
|
|
IN PEPROCESS ToProcess,
|
|
OUT PVOID ToAddress,
|
|
IN ULONG BufferSize,
|
|
IN KPROCESSOR_MODE PreviousMode,
|
|
OUT PULONG NumberOfBytesCopied
|
|
);
|
|
|
|
VOID
|
|
MmMapMemoryDumpMdl(
|
|
IN OUT PMDL MemoryDumpMdl
|
|
);
|
|
|
|
|
|
// begin_ntminiport
|
|
|
|
//
|
|
// Graphics support routines.
|
|
//
|
|
|
|
typedef
|
|
VOID
|
|
(*PBANKED_SECTION_ROUTINE) (
|
|
IN ULONG ReadBank,
|
|
IN ULONG WriteBank,
|
|
IN PVOID Context
|
|
);
|
|
|
|
// end_ntminiport
|
|
|
|
NTSTATUS
|
|
MmSetBankedSection(
|
|
IN HANDLE ProcessHandle,
|
|
IN PVOID VirtualAddress,
|
|
IN ULONG BankLength,
|
|
IN BOOLEAN ReadWriteBank,
|
|
IN PBANKED_SECTION_ROUTINE BankRoutine,
|
|
IN PVOID Context);
|
|
|
|
|
|
NTKERNELAPI
|
|
BOOLEAN
|
|
MmIsSystemAddressAccessable (
|
|
IN PVOID VirtualAddress
|
|
);
|
|
|
|
BOOLEAN
|
|
MmVerifyImageIsOkForMpUse(
|
|
IN PVOID BaseAddress
|
|
);
|
|
|
|
NTSTATUS
|
|
MmMemoryUsage (
|
|
IN PVOID Buffer,
|
|
IN ULONG Size,
|
|
IN ULONG Type,
|
|
OUT PULONG Length
|
|
);
|
|
|
|
#endif // MM
|