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.
163 lines
4.5 KiB
163 lines
4.5 KiB
//----------------------------------------------------------------------------
|
|
//
|
|
// Memory cache object.
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1997-2002.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#ifndef __MCACHE_HPP__
|
|
#define __MCACHE_HPP__
|
|
|
|
typedef struct _CACHE* PCACHE;
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// MemoryCache.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class MemoryCache
|
|
{
|
|
public:
|
|
MemoryCache(ULONG MaxSize);
|
|
~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, TargetInfo* Target);
|
|
|
|
void Dump(void);
|
|
void DumpNode(PCACHE Node);
|
|
|
|
BOOL ChangeSuspend(BOOL Active)
|
|
{
|
|
if (Active)
|
|
{
|
|
if (m_Suspend > 0)
|
|
{
|
|
m_Suspend--;
|
|
return TRUE;
|
|
}
|
|
}
|
|
else if (m_Suspend < 0xffffffff)
|
|
{
|
|
m_Suspend++;
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
TargetInfo* m_Target;
|
|
|
|
ULONG m_MaxSize;
|
|
ULONG m_UserSize;
|
|
BOOL m_DecodePTEs;
|
|
BOOL m_ForceDecodePTEs;
|
|
ULONG 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:
|
|
VirtualMemoryCache(void)
|
|
: MemoryCache(1000 * 1024)
|
|
{
|
|
m_Process = NULL;
|
|
}
|
|
|
|
void SetProcess(ProcessInfo* Process);
|
|
|
|
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);
|
|
|
|
ProcessInfo* m_Process;
|
|
};
|
|
|
|
//----------------------------------------------------------------------------
|
|
//
|
|
// PhysicalMemoryCache.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class PhysicalMemoryCache : public MemoryCache
|
|
{
|
|
public:
|
|
PhysicalMemoryCache(void)
|
|
: MemoryCache(1000 * 1024) {}
|
|
|
|
void SetTarget(TargetInfo* Target);
|
|
|
|
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);
|
|
};
|
|
|
|
#endif // #ifndef __MCACHE_HPP__
|