Windows2000/private/ntos/inc/mm.h

951 lines
40 KiB
C

/*-- 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
*/
#ifndef _MM_
#define _MM_
// Virtual bias applied when the kernel image was loaded.
extern ULONG_PTR MmVirtualBias;
#define MAX_PHYSICAL_MEMORY_FRAGMENTS 20
typedef struct _PHYSICAL_MEMORY_RUN {
PFN_NUMBER BasePage;
PFN_NUMBER PageCount;
} PHYSICAL_MEMORY_RUN, *PPHYSICAL_MEMORY_RUN;
typedef struct _PHYSICAL_MEMORY_DESCRIPTOR {
ULONG NumberOfRuns;
PFN_NUMBER NumberOfPages;
PHYSICAL_MEMORY_RUN Run[1];
} PHYSICAL_MEMORY_DESCRIPTOR, *PPHYSICAL_MEMORY_DESCRIPTOR;
extern PPHYSICAL_MEMORY_DESCRIPTOR MmPhysicalMemoryBlock;// Physical memory blocks.
#define MM_ALLOCATION_GRANULARITY ((ULONG)0x10000)// The allocation granularity is 64k.
#define MM_MAXIMUM_READ_CLUSTER_SIZE (15)// Maximum read ahead size for cache operations.
#if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_)
// begin_ntddk begin_wdm begin_nthal begin_ntifs
// Indicates the system may do I/O to physical addresses above 4 GB.
extern PBOOLEAN Mm64BitPhysicalAddress;
// end_ntddk end_wdm end_nthal end_ntifs
#else
// Indicates the system may do I/O to physical addresses above 4 GB.
extern BOOLEAN Mm64BitPhysicalAddress;
#endif
// begin_ntddk begin_wdm 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_PTR ROUND_TO_PAGES (IN ULONG_PTR 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_PTR)(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)((ULONG_PTR)(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)((LONG_PTR)(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_PTR)(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) (((((Size) - 1) >> PAGE_SHIFT) + (((((ULONG)(Size-1)&(PAGE_SIZE-1)) + (PtrToUlong(Va) & (PAGE_SIZE -1)))) >> PAGE_SHIFT)) + 1L)
#define COMPUTE_PAGES_SPANNED(Va, Size) ((ULONG)((((ULONG_PTR)(Va) & (PAGE_SIZE -1)) + (Size) + (PAGE_SIZE - 1)) >> PAGE_SHIFT))
// end_ntddk end_wdm end_nthal end_ntifs
// BOOLEAN
// IS_SYSTEM_ADDRESS
// IN PVOID Va,
// )
// Routine Description:
// This 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 IS_SYSTEM_ADDRESS(VA) ((VA) >= MM_SYSTEM_RANGE_START)
// begin_ntddk begin_wdm begin_nthal begin_ntifs
// PPFN_NUMBER MmGetMdlPfnArray (IN PMDL Mdl)
// Routine Description:
// The MmGetMdlPfnArray routine returns the virtual address of the first element of the array of physical page numbers associated with the MDL.
// Arguments:
// Mdl - Pointer to an MDL.
// Return Value:
// Returns the virtual address of the first element of the array of physical page numbers associated with the MDL.
#define MmGetMdlPfnArray(Mdl) ((PPFN_NUMBER)(Mdl + 1))
// PVOID MmGetMdlVirtualAddress (IN PMDL Mdl)
// Routine Description:
// The MmGetMdlVirtualAddress returns the virtual 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)
// PVOID MmGetMdlStartVa (IN PMDL Mdl)
// Routine Description:
// The MmGetMdlBaseVa returns the virtual address of the buffer described by the Mdl rounded down to the nearest page.
// Arguments:
// Mdl - Pointer to an MDL.
// Return Value:
// Returns the returns the starting virtual address of the MDL.
#define MmGetMdlBaseVa(Mdl) ((Mdl)->StartVa)
// end_ntddk end_wdm end_nthal end_ntifs
extern POBJECT_TYPE MmSectionObjectType;// Section object type.
extern ULONG MmReadClusterSize;// Number of pages to read in a single I/O if possible.
extern ULONG MmNumberOfColors;// Number of colors in system.
extern PFN_COUNT MmNumberOfPhysicalPages;// Number of physical pages.
extern PFN_COUNT MmSizeOfSystemCacheInPages;// Size of system cache in pages.
extern MMSUPPORT MmSystemCacheWs;// System cache working set.
extern KEVENT MmWorkingSetManagerEvent;// Working set manager event.
// begin_ntddk begin_wdm begin_nthal begin_ntifs
typedef enum _MM_SYSTEM_SIZE {
MmSmallSystem,
MmMediumSystem,
MmLargeSystem
} MM_SYSTEMSIZE;
NTKERNELAPI MM_SYSTEMSIZE MmQuerySystemSize(VOID);
// end_wdm
NTKERNELAPI BOOLEAN MmIsThisAnNtAsSystem(VOID);
// begin_wdm
typedef enum _LOCK_OPERATION {
IoReadAccess,
IoWriteAccess,
IoModifyAccess
} LOCK_OPERATION;
// end_ntddk end_wdm end_nthal end_ntifs
extern ULONG MmProductType;// NT product type.
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);
VOID MmEnablePAT (VOID);
PVOID MmAllocateIndependentPages(IN SIZE_T NumberOfBytes);
BOOLEAN MmSetPageProtection(IN PVOID VirtualAddress, IN SIZE_T NumberOfBytes, IN ULONG NewProtect);
// Shutdown routine - flushes dirty pages, etc for system shutdown.
BOOLEAN MmShutdownSystem (VOID);
// Routines to deal with working set and commit enforcement.
LOGICAL MmAssignProcessToJob(IN PEPROCESS Process);
LOGICAL MmEnforceWorkingSetLimit(IN PMMSUPPORT WsInfo, IN LOGICAL Enable);
// Routines to deal with session space.
NTSTATUS MmSessionCreate(OUT PULONG SessionId);
NTSTATUS MmSessionDelete(IN ULONG SessionId);
typedef NTSTATUS (*PKWIN32_CALLOUT) (IN PVOID Arg);
NTSTATUS MmDispatchWin32Callout(IN PKWIN32_CALLOUT Function, IN PKWIN32_CALLOUT WorkerCallback OPTIONAL, IN PVOID Arg, IN PULONG SessionId OPTIONAL);
VOID MmSessionLeader(IN PEPROCESS Process);
VOID MmSessionSetUnloadAddress (IN PDRIVER_OBJECT pWin32KDevice);
// Pool support routines to allocate complete pages, not for general consumption, these are only used by the executive pool allocator.
LOGICAL MmResourcesAvailable (IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes, IN EX_POOL_PRIORITY Priority);
PVOID MiAllocatePoolPages (IN POOL_TYPE PoolType, IN SIZE_T SizeInBytes, IN ULONG IsLargeSessionAllocation);
ULONG MiFreePoolPages (IN PVOID StartingAddress);
PVOID MiSessionPoolVector(VOID);
VOID MiSessionPoolAllocated(IN PVOID VirtualAddress, IN SIZE_T NumberOfBytes, IN POOL_TYPE PoolType);
VOID MiSessionPoolFreed(IN PVOID VirtualAddress, IN SIZE_T NumberOfBytes, IN POOL_TYPE PoolType);
// Routine for determining which pool a given address resides within.
POOL_TYPE MmDeterminePoolType (IN PVOID VirtualAddress);
LOGICAL MmIsSystemAddressLocked(IN PVOID VirtualAddress);
// First level fault routine.
NTSTATUS MmAccessFault (IN BOOLEAN StoreInstruction, IN PVOID VirtualAddress, IN KPROCESSOR_MODE PreviousMode, IN PVOID TrapInformation);
// Process Support Routines.
BOOLEAN MmCreateProcessAddressSpace (IN ULONG MinimumWorkingSetSize, IN PEPROCESS NewProcess, OUT PULONG_PTR DirectoryTableBase);
NTSTATUS MmInitializeProcessAddressSpace (IN PEPROCESS ProcessToInitialize, IN PEPROCESS ProcessToClone OPTIONAL, IN PVOID SectionToMap OPTIONAL, OUT PUNICODE_STRING * AuditName 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);
NTKERNELAPI NTSTATUS MmGrowKernelStack (IN PVOID CurrentStack);
#if defined(_IA64_)
NTSTATUS MmGrowKernelBackingStore (IN PVOID CurrentStack);
#endif // defined(_IA64_)
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);
NTKERNELAPI NTSTATUS MmAdjustWorkingSetSize (IN SIZE_T WorkingSetMinimum, IN SIZE_T 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,
IN PUNICODE_STRING NamePrefix OPTIONAL,
IN PUNICODE_STRING LoadedBaseName OPTIONAL,
IN BOOLEAN LoadInSessionSpace,
OUT PVOID *Section,
OUT PVOID *ImageBaseAddress
);
NTSTATUS
MmLoadAndLockSystemImage (
IN PUNICODE_STRING ImageFileName,
IN PUNICODE_STRING NamePrefix OPTIONAL,
IN PUNICODE_STRING LoadedBaseName OPTIONAL,
OUT PVOID *Section,
OUT PVOID *ImageBaseAddress
);
VOID MmFreeDriverInitialization (IN PVOID Section);
NTSTATUS MmUnloadSystemImage (IN PVOID Section);
VOID MmMakeKernelResourceSectionWritable (VOID);
VOID VerifierFreeTrackedPool(IN PVOID VirtualAddress, IN SIZE_T ChargedBytes, IN LOGICAL CheckType, IN LOGICAL SpecialPool);
// Triage support
ULONG MmSizeOfTriageInformation(VOID);
ULONG MmSizeOfUnloadedDriverInformation(VOID);
VOID MmWriteTriageInformation(IN PVOID);
VOID MmWriteUnloadedDriverInformation(IN PVOID);
// Cache manager support
#if defined(_NTDDK_) || defined(_NTIFS_)
// begin_ntifs
NTKERNELAPI BOOLEAN MmIsRecursiveIoFault(VOID);
// end_ntifs
#else
// BOOLEAN MmIsRecursiveIoFault (VOID);
// Routine Description:
// This macro examines the thread's page fault clustering information and determines if the current page fault is occurring during an I/O operation.
// Return Value:
// Returns TRUE if the fault is occurring during an I/O operation, FALSE otherwise.
#define MmIsRecursiveIoFault() ((PsGetCurrentThread()->DisablePageFaultClustering) | (PsGetCurrentThread()->ForwardClusterOnly))
#endif
// 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
#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
#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
#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.
#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
#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 comparisons 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 {
PFN_NUMBER Total;
MMLISTS ListName;
PFN_NUMBER Flink;
PFN_NUMBER Blink;
} MMPFNLIST;
typedef MMPFNLIST *PMMPFNLIST;
extern MMPFNLIST MmModifiedPageListHead;
extern PFN_NUMBER MmThrottleTop;
extern PFN_NUMBER 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.
// Return Value:
// TRUE if ample memory exists and the write should proceed.
#define MmEnoughMemoryForWrite() \
((MmAvailablePages > MmThrottleTop) \
|| \
(((MmModifiedPageListHead.Total < 1000)) && (MmAvailablePages > MmThrottleBottom)))
NTKERNELAPI
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
);
NTKERNELAPI
NTSTATUS
MmMapViewOfSection(
IN PVOID SectionToMap,
IN PEPROCESS Process,
IN OUT PVOID *CapturedBase,
IN ULONG_PTR ZeroBits,
IN SIZE_T CommitSize,
IN OUT PLARGE_INTEGER SectionOffset,
IN OUT PSIZE_T CapturedViewSize,
IN SECTION_INHERIT InheritDisposition,
IN ULONG AllocationType,
IN ULONG Protect
);
NTKERNELAPI 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 MmAddVerifierThunks (IN PVOID ThunkBuffer, IN ULONG ThunkBufferSize);
NTSTATUS MmSetVerifierInformation (IN OUT PVOID SystemInformation, IN ULONG SystemInformationLength);
NTSTATUS MmGetVerifierInformation(OUT PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG Length);
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 PSIZE_T 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 SIZE_T RegionSize, IN ULONG IgnoreCacheViews);
NTSTATUS MmFlushSection (IN PSECTION_OBJECT_POINTERS SectionObjectPointer, IN PLARGE_INTEGER Offset OPTIONAL, IN SIZE_T 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 SIZE_T RegionSize);
BOOLEAN // ntifs
MmSetAddressRangeModified ( // ntifs
IN PVOID Address, // ntifs
IN SIZE_T Length // ntifs
); // ntifs
BOOLEAN MmCheckCachedPageState (IN PVOID Address, IN BOOLEAN SetToZero);
NTSTATUS MmCopyToCachedPage (IN PVOID Address, IN PVOID UserBuffer, IN ULONG Offset, IN SIZE_T CountInBytes, IN BOOLEAN DontZero);
VOID MmUnlockCachedPage (IN PVOID AddressInCache);
PVOID MmDbgReadCheck (IN PVOID VirtualAddress);
PVOID MmDbgWriteCheck (IN PVOID VirtualAddress, IN PHARDWARE_PTE Opaque);
VOID MmDbgReleaseAddress (IN PVOID VirtualAddress, IN PHARDWARE_PTE Opaque);
PVOID64 MmDbgReadCheck64 (IN PVOID64 VirtualAddress);
PVOID64 MmDbgWriteCheck64 (IN PVOID64 VirtualAddress);
PVOID64 MmDbgTranslatePhysicalAddress64 (IN PHYSICAL_ADDRESS PhysicalAddress);
VOID MmHibernateInformation (IN PVOID MemoryMap, OUT PULONG_PTR HiberVa, OUT PPHYSICAL_ADDRESS HiberPte);
// begin_ntddk begin_ntifs begin_wdm
NTKERNELAPI VOID MmProbeAndLockProcessPages (IN OUT PMDL MemoryDescriptorList, IN PEPROCESS Process, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation);
// begin_nthal
// 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 PVOID MmGetSystemRoutineAddress (IN PUNICODE_STRING SystemRoutineName);
// end_wdm
NTKERNELAPI NTSTATUS MmMapUserAddressesToPage (IN PVOID BaseAddress, IN SIZE_T NumberOfBytes, IN PVOID PageAddress);
// begin_wdm
// _MM_PAGE_PRIORITY_ provides a method for the system to handle requests intelligently in low resource conditions.
// LowPagePriority should be used when it is acceptable to the driver for the mapping request to fail if the system is low on resources. An example of
// this could be for a non-critical network connection where the driver can handle the failure case when system resources are close to being depleted.
// NormalPagePriority should be used when it is acceptable to the driver for the mapping request to fail if the system is very low on resources. An example
// of this could be for a non-critical local filesystem request.
// HighPagePriority should be used when it is unacceptable to the driver for the mapping request to fail unless the system is completely out of resources.
// An example of this would be the paging file path in a driver.
typedef enum _MM_PAGE_PRIORITY {
LowPagePriority,
NormalPagePriority = 16,
HighPagePriority = 32
} MM_PAGE_PRIORITY;
// Note: This function is not available in WDM 1.0
NTKERNELAPI PVOID MmMapLockedPagesSpecifyCache (IN PMDL MemoryDescriptorList,
IN KPROCESSOR_MODE AccessMode,
IN MEMORY_CACHING_TYPE CacheType,
IN PVOID BaseAddress,
IN ULONG BugCheckOnFailure,
IN MM_PAGE_PRIORITY Priority);
NTKERNELAPI VOID MmUnmapLockedPages (IN PVOID BaseAddress, IN PMDL MemoryDescriptorList);
// end_wdm
typedef struct _PHYSICAL_MEMORY_RANGE {
PHYSICAL_ADDRESS BaseAddress;
LARGE_INTEGER NumberOfBytes;
} PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
NTKERNELAPI NTSTATUS MmAddPhysicalMemory (IN PPHYSICAL_ADDRESS StartAddress, IN OUT PLARGE_INTEGER NumberOfBytes);
NTKERNELAPI NTSTATUS MmRemovePhysicalMemory (IN PPHYSICAL_ADDRESS StartAddress, IN OUT PLARGE_INTEGER NumberOfBytes);
NTKERNELAPI PPHYSICAL_MEMORY_RANGE MmGetPhysicalMemoryRanges (VOID);
NTKERNELAPI PMDL MmAllocatePagesForMdl (IN PHYSICAL_ADDRESS LowAddress, IN PHYSICAL_ADDRESS HighAddress, IN PHYSICAL_ADDRESS SkipBytes, IN SIZE_T TotalBytes);
NTKERNELAPI VOID MmFreePagesFromMdl (IN PMDL MemoryDescriptorList);
// begin_wdm
NTKERNELAPI PVOID MmMapIoSpace (IN PHYSICAL_ADDRESS PhysicalAddress, IN SIZE_T NumberOfBytes, IN MEMORY_CACHING_TYPE CacheType);
NTKERNELAPI VOID MmUnmapIoSpace (IN PVOID BaseAddress, IN SIZE_T NumberOfBytes);
// end_wdm end_ntddk end_ntifs
NTKERNELAPI VOID MmProbeAndLockSelectedPages (IN OUT PMDL MemoryDescriptorList, IN PFILE_SEGMENT_ELEMENT SegmentArray, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation);
// begin_ntddk begin_ntifs
NTKERNELAPI PVOID MmMapVideoDisplay (IN PHYSICAL_ADDRESS PhysicalAddress, IN SIZE_T NumberOfBytes, IN MEMORY_CACHING_TYPE CacheType);
NTKERNELAPI VOID MmUnmapVideoDisplay (IN PVOID BaseAddress, IN SIZE_T NumberOfBytes);
NTKERNELAPI PHYSICAL_ADDRESS MmGetPhysicalAddress (IN PVOID BaseAddress);
NTKERNELAPI PVOID MmGetVirtualForPhysical (IN PHYSICAL_ADDRESS PhysicalAddress);
NTKERNELAPI PVOID MmAllocateContiguousMemory (IN SIZE_T NumberOfBytes, IN PHYSICAL_ADDRESS HighestAcceptableAddress);
NTKERNELAPI PVOID MmAllocateContiguousMemorySpecifyCache (
IN SIZE_T NumberOfBytes,
IN PHYSICAL_ADDRESS LowestAcceptableAddress,
IN PHYSICAL_ADDRESS HighestAcceptableAddress,
IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
IN MEMORY_CACHING_TYPE CacheType
);
NTKERNELAPI VOID MmFreeContiguousMemory (IN PVOID BaseAddress);
NTKERNELAPI VOID MmFreeContiguousMemorySpecifyCache (IN PVOID BaseAddress, IN SIZE_T NumberOfBytes, IN MEMORY_CACHING_TYPE CacheType);
// end_ntddk end_ntifs end_nthal
NTKERNELAPI ULONG MmGatherMemoryForHibernate (IN PMDL Mdl, IN BOOLEAN Wait);
NTKERNELAPI VOID MmReturnMemoryForHibernate (IN PMDL Mdl);
VOID MmReleaseDumpAddresses (IN PFN_NUMBER Pages);
// begin_ntddk begin_ntifs begin_nthal
NTKERNELAPI PVOID MmAllocateNonCachedMemory (IN SIZE_T NumberOfBytes);
NTKERNELAPI VOID MmFreeNonCachedMemory (IN PVOID BaseAddress, IN SIZE_T NumberOfBytes);
NTKERNELAPI BOOLEAN MmIsAddressValid (IN PVOID VirtualAddress);
NTKERNELAPI BOOLEAN MmIsNonPagedSystemAddressValid (IN PVOID VirtualAddress);
// begin_wdm
NTKERNELAPI SIZE_T MmSizeOfMdl(IN PVOID Base, IN SIZE_T Length);
NTKERNELAPI PMDL MmCreateMdl(IN PMDL MemoryDescriptorList OPTIONAL, IN PVOID Base, IN SIZE_T Length);
NTKERNELAPI PVOID MmLockPagableDataSection(IN PVOID AddressWithinSection);
// end_wdm
NTKERNELAPI VOID MmLockPagableSectionByHandle (IN PVOID ImageSectionHandle);
// end_ntddk end_ntifs
NTKERNELAPI VOID MmLockPagedPool (IN PVOID Address, IN SIZE_T Size);
NTKERNELAPI VOID MmUnlockPagedPool (IN PVOID Address, IN SIZE_T Size);
// begin_wdm begin_ntddk begin_ntifs
NTKERNELAPI VOID MmResetDriverPaging (IN PVOID AddressWithinSection);
NTKERNELAPI PVOID MmPageEntireDriver (IN PVOID AddressWithinSection);
NTKERNELAPI VOID MmUnlockPagableImageSection(IN PVOID ImageSectionHandle);
// end_wdm
NTKERNELAPI HANDLE MmSecureVirtualMemory (IN PVOID Address, IN SIZE_T Size, IN ULONG ProbeMode);
NTKERNELAPI VOID MmUnsecureVirtualMemory (IN HANDLE SecureHandle);
NTKERNELAPI NTSTATUS MmMapViewInSystemSpace (IN PVOID Section, OUT PVOID *MappedBase, IN PSIZE_T ViewSize);
NTKERNELAPI NTSTATUS MmUnmapViewInSystemSpace (IN PVOID MappedBase);
NTKERNELAPI NTSTATUS MmMapViewInSessionSpace (IN PVOID Section, OUT PVOID *MappedBase, IN OUT PSIZE_T ViewSize);
NTKERNELAPI NTSTATUS MmUnmapViewInSessionSpace (IN PVOID MappedBase);
// begin_wdm
// VOID MmInitializeMdl (IN PMDL MemoryDescriptorList, IN PVOID BaseVa, IN SIZE_T 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.
#define MmInitializeMdl(MemoryDescriptorList, BaseVa, Length) { \
(MemoryDescriptorList)->Next = (PMDL) NULL; \
(MemoryDescriptorList)->Size = (CSHORT)(sizeof(MDL) + \
(sizeof(PFN_NUMBER) * ADDRESS_AND_SIZE_TO_SPAN_PAGES((BaseVa), (Length)))); \
(MemoryDescriptorList)->MdlFlags = 0; \
(MemoryDescriptorList)->StartVa = (PVOID) PAGE_ALIGN((BaseVa)); \
(MemoryDescriptorList)->ByteOffset = BYTE_OFFSET((BaseVa)); \
(MemoryDescriptorList)->ByteCount = (ULONG)(Length); \
}
// PVOID MmGetSystemAddressForMdlSafe (IN PMDL MDL, IN MM_PAGE_PRIORITY PRIORITY)
// 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.
// Priority - Supplies an indication as to how important it is that this request succeed under low available PTE conditions.
// 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.
// Unlike MmGetSystemAddressForMdl, Safe guarantees that it will always return NULL on failure instead of bugchecking the system.
// This macro is not usable by WDM 1.0 drivers as 1.0 did not include MmMapLockedPagesSpecifyCache. The solution for WDM 1.0 drivers is to
// provide synchronization and set/reset the MDL_MAPPING_CAN_FAIL bit.
#define MmGetSystemAddressForMdlSafe(MDL, PRIORITY) \
(((MDL)->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA | MDL_SOURCE_IS_NONPAGED_POOL)) \
? ((MDL)->MappedSystemVa) : (MmMapLockedPagesSpecifyCache((MDL), KernelMode, MmCached, NULL, FALSE, (PRIORITY))))
// 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.
#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); \
}
typedef NTSTATUS (*PMM_DLL_INITIALIZE)(IN PUNICODE_STRING RegistryPath);
typedef NTSTATUS (*PMM_DLL_UNLOAD)(VOID);
// end_ntddk end_wdm 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)
PVOID MmAllocateSpecialPool (IN SIZE_T NumberOfBytes, IN ULONG Tag, IN POOL_TYPE Type, IN ULONG SpecialPoolType);
VOID MmFreeSpecialPool (IN PVOID P);
LOGICAL MmSetSpecialPool (IN LOGICAL Enable);
LOGICAL MmProtectSpecialPool (IN PVOID VirtualAddress, IN ULONG NewProtect);
LOGICAL MmIsSpecialPoolAddressFree (IN PVOID VirtualAddress);
SIZE_T MmQuerySpecialPoolBlockSize (IN PVOID P);
extern ULONG MmSpecialPoolTag;
extern PVOID MmSpecialPoolStart;
extern PVOID MmSpecialPoolEnd;
LOGICAL MmIsHydraAddress (IN PVOID VirtualAddress);
PUNICODE_STRING MmLocateUnloadedDriver (IN PVOID VirtualAddress);
// begin_ntddk
// Define an empty typedef for the _DRIVER_OBJECT structure so it may be referenced by function types before it is actually defined.
struct _DRIVER_OBJECT;
NTKERNELAPI LOGICAL MmIsDriverVerifying (IN struct _DRIVER_OBJECT *DriverObject);
// end_ntddk
LOGICAL MmTrimAllSystemPagableMemory (IN LOGICAL PurgeTransition);
#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 SIZE_T OldQuotaLimit, OUT PSIZE_T NewQuotaLimit);
VOID MmReturnPoolQuota(IN POOL_TYPE PoolType, IN SIZE_T 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
);
NTSTATUS MmGetSectionRange(IN PVOID AddressWithinSection, OUT PVOID *StartingSectionAddress, OUT PULONG SizeofSection);
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);
typedef VOID (FASTCALL *PPAGE_FAULT_NOTIFY_ROUTINE)(IN NTSTATUS Status, IN PVOID VirtualAddress, IN PVOID TrapInformation);
typedef VOID (FASTCALL *PHARD_FAULT_NOTIFY_ROUTINE)(IN HANDLE FileObject, IN PVOID VirtualAddress);
NTKERNELAPI VOID FASTCALL MmSetPageFaultNotifyRoutine(IN PPAGE_FAULT_NOTIFY_ROUTINE NotifyRoutine);
NTKERNELAPI VOID FASTCALL MmSetHardFaultNotifyRoutine(IN PHARD_FAULT_NOTIFY_ROUTINE NotifyRoutine);
NTSTATUS MmCallDllInitialize(IN PLDR_DATA_TABLE_ENTRY DataTableEntry);
// Crash dump only
// Called to initialize the kernel memory to include in a summary dump
VOID MmSetKernelDumpRange(IN PVOID DumpContext);
#ifdef NTPERF
#include "perfinfokrn.h"
#else
#define PERFINFO_ADDPOOLPAGE(CheckType, PoolIndex, Addr, PoolDesc)
#define PERFINFO_ADDTOWS(PageFrame, Address, Pid)
#define PERFINFO_BIGPOOLALLOC(Type, PTag, NumBytes, Addr)
#define PERFINFO_CM_CHECKCELLTYPE(Map)
#define PERFINFO_CM_CHECKCELLTYPE(Map)
#define PERFINFO_CM_HIVECELL_REFERENCE_FLAT(Hive, pcell, Cell)
#define PERFINFO_CM_HIVECELL_REFERENCE_PAGED(Hive, pcell, Cell, Type, Map)
#define PERFINFO_CONVERT_TO_GUI_THREAD(EThread)
#define PERFINFO_DECREFCNT(PageFrame, Flag, Type)
#define PERFINFO_DELETE_STACK(PointerPte, NumberOfPtes)
#define PERFINFO_DISPATCHFAULT_DECL()
#define PERFINFO_DRIVER_COMPLETIONROUTINE_CALL(irp, irpsp)
#define PERFINFO_DRIVER_COMPLETIONROUTINE_RETURN(irp, irpsp)
#define PERFINFO_DRIVER_INIT(pdo)
#define PERFINFO_DRIVER_INIT_COMPLETE(pdo)
#define PERFINFO_DRIVER_MAJORFUNCTION_CALL(irp, irpsp, pdo)
#define PERFINFO_DRIVER_MAJORFUNCTION_RETURN(irp, irpsp, pdo)
#define PERFINFO_EXALLOCATEPOOLWITHTAG_DECL()
#define PERFINFO_EXFREEPOOLWITHTAG_DECL()
#define PERFINFO_FREEPOOL(Addr)
#define PERFINFO_FREEPOOLPAGE(CheckType, PoolIndex, Addr, PoolDesc)
#define PERFINFO_GET_PAGE_INFO(PointerPte)
#define PERFINFO_GET_PAGE_INFO_REPLACEMENT(PointerPte)
#define PERFINFO_GET_PAGE_INFO_WITH_DECL(PointerPte)
#define PERFINFO_GROW_STACK(EThread)
#define PERFINFO_HARDFAULT(Address, InpageSupport)
#define PERFINFO_HARDFAULT_INFO(ProtoPte)
#define PERFINFO_HARDFAULT_IOTIME()
#define PERFINFO_HIVECELL_REFERENCE_FLAT(Hive, pcell, Cell)
#define PERFINFO_HIVECELL_REFERENCE_PAGED(Hive, pcell, Cell, Type, Map)
#define PERFINFO_IMAGE_LOAD(LdrDataTableEntry)
#define PERFINFO_IMAGE_UNLOAD(Address)
#define PERFINFO_INIT_POOLRANGE(PoolStart, PoolPages)
#define PERFINFO_INIT_PERFMEMTABLE(LoaderBlock)
#define PERFINFO_INIT_TRACEFLAGS(OptionString, SpecificOption)
#define PERFINFO_INSERTINLIST(Page, ListHead)
#define PERFINFO_INSERT_FRONT_STANDBY(Page)
#define PERFINFO_LOG_MARK(PMARK)
#define PERFINFO_LOG_MARK_SPRINTF(PMARK, VARIABLE)
#define PERFINFO_LOG_WMI_TRACE_EVENT( PData, xLength)
#define PERFINFO_LOG_WMI_TRACE_KERNEL_EVENT(GroupType, PData, xLength, Thread)
#define PERFINFO_LOG_WMI_TRACE_LONG_EVENT(GroupType, PData, xCount, Thread)
#define PERFINFO_LOG_WS_REMOVAL(Type, WsInfo)
#define PERFINFO_LOG_WS_REPLACEMENT(WsInfo)
#define PERFINFO_MIH_DECL
#define PERFINFO_MMINIT_DECL
#define PERFINFO_MMINIT_START()
#define PERFINFO_MOD_PAGE_WRITER3()
#define PERFINFO_PAGE_INFO_DECL()
#define PERFINFO_PAGE_INFO_REPLACEMENT_DECL()
#define PERFINFO_POOLALLOC(Type, PTag, NumBytes)
#define PERFINFO_POOLALLOC_ADDR(Addr)
#define PERFINFO_POOL_ALLOC_COMMON(Type, PTag, NumBytes)
#define PERFINFO_PRIVATE_COPY_ON_WRITE(CopyFrom, PAGE_SIZE)
#define PERFINFO_PRIVATE_PAGE_DEMAND_ZERO(VirtualAddress)
#define PERFINFO_PROCESS_CREATE(EProcess)
#define PERFINFO_PROCESS_DELETE(EProcess)
#define PERFINFO_DELETE_PAGE(ppfn)
#define PERFINFO_REMOVEPAGE(PageIndex, LogType)
#define PERFINFO_SECTION_CREATE(ControlArea)
#define PERFINFO_SEGMENT_DELETE(FileName)
#define PERFINFO_SOFTFAULT(PageFrame, Address, Type)
#define PERFINFO_THREAD_CREATE(EThread, ITeb)
#define PERFINFO_THREAD_DELETE(EThread)
#define PERFINFO_UNLINKFREEPAGE(Index, Location)
#define PERFINFO_UNLINKPAGE(Index, Location)
#define PERFINFO_WSMANAGE_ACTUALTRIM(Trim)
#define PERFINFO_WSMANAGE_DECL()
#define PERFINFO_WSMANAGE_DUMPENTRIES()
#define PERFINFO_WSMANAGE_DUMPENTRIES_CLAIMS()
#define PERFINFO_WSMANAGE_DUMPENTRIES_FAULTS()
#define PERFINFO_WSMANAGE_DUMPWS(VmSupport, SampledAgeCounts)
#define PERFINFO_WSMANAGE_FINALACTION(TrimAction)
#define PERFINFO_WSMANAGE_GLOBAL_DECL
#define PERFINFO_WSMANAGE_LOGINFO_CLAIMS(TrimAction)
#define PERFINFO_WSMANAGE_LOGINFO_FAULTS(TrimAction)
#define PERFINFO_WSMANAGE_PROCESS_RESET(VmSupport)
#define PERFINFO_WSMANAGE_PROCESS_RESET(VmSupport)
#define PERFINFO_WSMANAGE_STARTLOG()
#define PERFINFO_WSMANAGE_STARTLOG_CLAIMS()
#define PERFINFO_WSMANAGE_STARTLOG_FAULTS()
#define PERFINFO_WSMANAGE_TOTRIM(Trim)
#define PERFINFO_WSMANAGE_TRIMACTION(TrimAction)
#define PERFINFO_WSMANAGE_TRIMEND_CLAIMS(Criteria)
#define PERFINFO_WSMANAGE_TRIMEND_FAULTS(Criteria)
#define PERFINFO_WSMANAGE_TRIMWS(Process, SessionSpace, VmSupport)
#define PERFINFO_WSMANAGE_TRIMWS_CLAIMINFO(VmSupport)
#define PERFINFO_WSMANAGE_TRIMWS_CLAIMINFO(VmSupport)
#define PERFINFO_WSMANAGE_WAITFORWRITER_CLAIMS()
#define PERFINFO_WSMANAGE_WAITFORWRITER_FAULTS()
#define PERFINFO_WSMANAGE_WILLTRIM(ReductionGoal, FreeGoal)
#define PERFINFO_WSMANAGE_WILLTRIM_CLAIMS(Criteria)
#define PERFINFO_WSMANAGE_WILLTRIM_FAULTS(Criteria)
#define PERFINFO_DO_PAGEFAULT_CLUSTERING() 1
#endif // NTPERF
#endif // MM