Leaked source code of windows server 2003
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

//----------------------------------------------------------------------------
//
// 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__