|
|
/*++
Copyright (c) 1996-1999 Microsoft Corporation
Module Name:
va.h
Abstract:
Include file for the helpers for the virtual memory thunks on platforms where page size is not equal to 4K.
Author:
Dave Hastings (daveh) creation-date 26-Feb-1996
Revision History:
--*/
//
// Don't want to include anything unless SOFTWARE_4K_PAGESIZE is enabled.
//
#ifdef SOFTWARE_4K_PAGESIZE
//
// Constants
//
#define INTEL_PAGESIZE 0x1000
#ifdef _ALPHA_
#define NATIVE_PAGESIZE 0x2000
#endif
#ifdef _WHNT32_C_
#define NtAllocateVirtualMemory(a,b,c,d,e,f) VaAllocateVirtualMemory(a,b,c,d,e,f)
#define NtFreeVirtualMemory(a,b,c,d) VaFreeVirtualMemory(a,b,c,d)
#define NtProtectVirtualMemory(a,b,c,d,e) VaProtectVirtualMemory(a,b,c,d,e)
#define NtQueryVirtualMemory(a,b,c,d,e,f) VaQueryVirtualMemory(a,b,c,d,e,f)
#define NtMapViewOfSection(a,b,c,d,e,f,g,h,i,j) VaMapViewOfSection(a,b,c,d,e,f,g,h,i,j)
#define NtUnmapViewOfSection(a,b) VaUnmapViewOfSection(a,b)
#endif
//
// Useful macros
//
#define INTEL_PAGEROUND(a) (a & ~(INTEL_PAGESIZE - 1))
#define INTEL_PAGEMASK(a) (a & (INTEL_PAGESIZE - 1))
#define NATIVE_PAGEROUND(a) (a & ~(NATIVE_PAGESIZE - 1))
#define NATIVE_PAGEMASK(a) (a & (NATIVE_PAGESIZE - 1))
#define VaNextNode(n) n->Next
typedef ULONG_PTR STATE; typedef PULONG_PTR PSTATE; typedef ULONG PROT; typedef PULONG PPROT;
#if DBG
#define ASSRT(e) if (!(e)) { \
DbgBreakPoint(); \ } #else
#define ASSRT(e)
#endif
//
// Value used to mark allocation sentinels. This is put in both
// the IntelState field of the sentinal
//
// Things to know about sentinels
//
// IntelState == VA_SENTINEL
// IntelEnd == 0
// State == Intel ending address
// Protect = Sentinel Flags
//
// The above have to be true for the sentinels to be inserted into the
// list and function correctly. There are sentinels only at the beginning
// of a memory allocation.
//
#define VA_SENTINEL 0xFFFFFFFF
// Sentinal flags in NativeProtect
#define VA_MAPFILE 0x80000000
//
// Structure to track the state of the virtual address space
// An instance of this inclusively describes a portion of the
// address space
//
typedef struct _VANODE { struct _VANODE *Prev; struct _VANODE *Next; PUCHAR Start; PUCHAR End; STATE State; STATE IntelState; PROT Protection; PROT IntelProtection; } VANODE, *PVANODE;
//
// structure used to figure out how to satisfy the requested memory function
//
typedef enum _MEMACTION { CallSystem, FillMem, None } MEMACTION, *PMEMACTION;
typedef struct _MEMCHUNK { PUCHAR Start; PUCHAR End; STATE State; PROT Protection; MEMACTION Action; } MEMCHUNK, *PMEMCHUNK; //
// Functions called by the thunks
//
BOOLEAN VaInit();
NTSTATUS VaAllocateVirtualMemory( IN HANDLE ProcessHandle, IN OUT PVOID *BaseAddress, IN ULONG_PTR ZeroBits, IN OUT PSIZE_T RegionSize, IN ULONG AllocationType, IN ULONG Protect );
NTSTATUS VaFreeVirtualMemory( IN HANDLE ProcessHandle, IN OUT PVOID *BaseAddress, IN OUT PSIZE_T RegionSize, IN ULONG FreeType );
NTSTATUS VaQueryVirtualMemory( IN HANDLE ProcessHandle, IN PVOID BaseAddress, IN MEMORY_INFORMATION_CLASS MemoryInformationClass, OUT PVOID MemoryInformation, IN ULONG MemoryInformationLength, OUT PULONG ReturnLength OPTIONAL );
NTSTATUS VaProtectVirtualMemory( IN HANDLE ProcessHandle, IN OUT PVOID *BaseAddress, IN OUT PSIZE_T RegionSize, IN ULONG NewProtect, OUT PULONG OldProtect );
NTSTATUS VaMapViewOfSection( IN HANDLE SectionHandle, IN HANDLE ProcessHandle, IN OUT PVOID *BaseAddress, IN ULONG_PTR ZeroBits, IN SIZE_T CommitSize, IN OUT PLARGE_INTEGER SectionOffset OPTIONAL, IN OUT PSIZE_T ViewSize, IN SECTION_INHERIT InheritDisposition, IN ULONG AllocationType, IN ULONG Protect );
NTSTATUS VaUnmapViewOfSection( IN HANDLE ProcessHandle, IN PVOID BaseAddress );
//
// Internal functions used to implement the above
//
BOOL VaQueryIntelPages( IN PVOID Address, OUT PULONG NumberOfPages, OUT PSTATE IntelState, OUT PPROT IntelProtection, OUT PSTATE NativeState, OUT PPROT NativeProtection );
BOOL VaRecordMemoryOperation( PVOID IntelStart, PVOID IntelEnd, STATE State, PROT Protection, PMEMCHUNK Pages, ULONG Number );
PVANODE VaFindNode( PVOID Address ); PVANODE VaRemoveNode( PVANODE VaNode ); PVANODE VaInsertNode( PVANODE VaNode ); BOOL VaGetAllocationInformation( PUCHAR Address, PUCHAR *IntelBase, PULONG NumberOfPages, PSTATE IntelState, PPROT IntelProtection ); VOID VaDeleteRegion( PCHAR Start, PCHAR End );
PVANODE VaFindSentinel( PCHAR Address );
PVANODE VaFindContainingSentinel( PCHAR Address ); PVANODE VaInsertSentinel( PVANODE VaNode );
void VaAddMemoryRecords( HANDLE ProcessHandle, LPVOID lpvAddress );
#ifdef DBG
VOID VaDumpNode(PVANODE); VOID VaDumpList(); VOID VaDumpState( STATE State ); VOID VaDumpProtection( PROT Protection ); #endif
#endif // SOFTWARE_4K_PAGESIZE
|