136 lines
3.9 KiB
C++
136 lines
3.9 KiB
C++
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Memory cache object.
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1997-2001.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#ifndef __MCACHE_HPP__
|
||
|
#define __MCACHE_HPP__
|
||
|
|
||
|
typedef struct _CACHE* PCACHE;
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// MemoryCache.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class MemoryCache
|
||
|
{
|
||
|
public:
|
||
|
MemoryCache(void);
|
||
|
~MemoryCache(void);
|
||
|
|
||
|
HRESULT Read(IN ULONG64 BaseAddress,
|
||
|
IN PVOID UserBuffer,
|
||
|
IN ULONG TransferCount,
|
||
|
OUT PULONG BytesRead);
|
||
|
HRESULT Write(IN ULONG64 BaseAddress,
|
||
|
IN PVOID UserBuffer,
|
||
|
IN ULONG TransferCount,
|
||
|
OUT PULONG BytesWritten);
|
||
|
|
||
|
void Add(IN ULONG64 BaseAddress,
|
||
|
IN PVOID UserBuffer,
|
||
|
IN ULONG Length);
|
||
|
void Remove(IN ULONG64 BaseAddress,
|
||
|
IN ULONG Length);
|
||
|
void Empty(void);
|
||
|
|
||
|
void ParseCommands(void);
|
||
|
|
||
|
//
|
||
|
// Internal methods.
|
||
|
//
|
||
|
|
||
|
virtual HRESULT ReadUncached(IN ULONG64 BaseAddress,
|
||
|
IN PVOID UserBuffer,
|
||
|
IN ULONG TransferCount,
|
||
|
OUT PULONG BytesRead) = 0;
|
||
|
virtual HRESULT WriteUncached(IN ULONG64 BaseAddress,
|
||
|
IN PVOID UserBuffer,
|
||
|
IN ULONG TransferCount,
|
||
|
OUT PULONG BytesWritten) = 0;
|
||
|
|
||
|
PCACHE Lookup(ULONG64 Offset,
|
||
|
ULONG Length,
|
||
|
PULONG LengthUsed);
|
||
|
|
||
|
void InsertNode(IN PCACHE node);
|
||
|
|
||
|
PUCHAR Alloc(IN ULONG Length);
|
||
|
VOID Free(IN PUCHAR Memory,
|
||
|
IN ULONG Length);
|
||
|
|
||
|
VOID PurgeType(ULONG type);
|
||
|
|
||
|
VOID SetForceDecodePtes(BOOL Enable);
|
||
|
|
||
|
void Dump(void);
|
||
|
void DumpNode(PCACHE Node);
|
||
|
|
||
|
ULONG m_MaxSize;
|
||
|
ULONG m_UserSize;
|
||
|
BOOL m_DecodePTEs;
|
||
|
BOOL m_ForceDecodePTEs;
|
||
|
BOOL m_Suspend;
|
||
|
|
||
|
ULONG m_Reads, m_CachedReads, m_UncachedReads;
|
||
|
ULONG64 m_CachedBytes, m_UncachedBytes;
|
||
|
ULONG m_Misses;
|
||
|
ULONG m_Size;
|
||
|
ULONG m_NodeCount;
|
||
|
BOOL m_PurgeOverride;
|
||
|
PCACHE m_Root;
|
||
|
};
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// VirtualMemoryCache.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class VirtualMemoryCache : public MemoryCache
|
||
|
{
|
||
|
public:
|
||
|
virtual HRESULT ReadUncached(IN ULONG64 BaseAddress,
|
||
|
IN PVOID UserBuffer,
|
||
|
IN ULONG TransferCount,
|
||
|
OUT PULONG BytesRead);
|
||
|
virtual HRESULT WriteUncached(IN ULONG64 BaseAddress,
|
||
|
IN PVOID UserBuffer,
|
||
|
IN ULONG TransferCount,
|
||
|
OUT PULONG BytesWritten);
|
||
|
};
|
||
|
|
||
|
extern VirtualMemoryCache g_VirtualCache;
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// PhysicalMemoryCache.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class PhysicalMemoryCache : public MemoryCache
|
||
|
{
|
||
|
public:
|
||
|
virtual HRESULT ReadUncached(IN ULONG64 BaseAddress,
|
||
|
IN PVOID UserBuffer,
|
||
|
IN ULONG TransferCount,
|
||
|
OUT PULONG BytesRead);
|
||
|
virtual HRESULT WriteUncached(IN ULONG64 BaseAddress,
|
||
|
IN PVOID UserBuffer,
|
||
|
IN ULONG TransferCount,
|
||
|
OUT PULONG BytesWritten);
|
||
|
};
|
||
|
|
||
|
extern PhysicalMemoryCache g_PhysicalCache;
|
||
|
extern BOOL g_PhysicalCacheActive;
|
||
|
|
||
|
#define InvalidateMemoryCaches() \
|
||
|
( g_VirtualCache.Empty(), g_PhysicalCache.Empty() )
|
||
|
|
||
|
#endif // #ifndef __MCACHE_HPP__
|