windows-nt/Source/XPSP1/NT/sdktools/debuggers/ntsd64/mcache.hpp
2020-09-26 16:20:57 +08:00

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__