www.pudn.com > WinGOS.rar > Memory.h


#ifndef _GOS_MEMORY_H_ 
#define _GOS_MEMORY_H_ 
 
#define ZeroMemory(pDest,nLength) FillMemory(pDest,nLength,0) 
#define AllocSize(pBlock) (*(PDWORD(pBlock)-1)) 
#define _msize(pBlock) (pBlock?AllocSize(pBlock):0) 
#define malloc(size) g_pKernel->GetCurHeap().Alloc(size) 
#define realloc(memblock,size) g_pKernel->GetCurHeap().ReAlloc(memblock,size) 
#define free(memblock) g_pKernel->GetCurHeap().Free(memblock) 
#define memmove(dest,src,count) CoyMemory(dest,src,count) 
#define memcpy(dest,src,count) CoyMemory(dest,src,count) 
#define memset(dest,c,count) FillMemory(dest,count,c) 
#define IsWritablePtr(ptr) g_pKernel->GetCurHeap().IncludePtr(ptr) 
#define PAGESIZE 4096 
#define PAGESHIFT 12 
 
PVOID operator new(UINT nSize,PVOID pObj); 
VOID operator delete(PVOID pData,PVOID pObj); 
PVOID operator new[](UINT nSize); 
VOID operator delete[](PVOID pData); 
PVOID operator new(UINT nSize); 
VOID operator delete(PVOID pData); 
 
class CHeap 
{ 
public: 
	void Create(PVOID pBlock); 
	PVOID Delete(); 
	PVOID Alloc(DWORD nSize); 
	PVOID ReAlloc(PVOID pBlock,DWORD nSize); 
	void Free(PVOID pBlock); 
	BOOL IncludePtr(PCVOID pBlock); 
	DEBUG_ONLY(DWORD m_nPushCnt); 
public: 
	static ElementCount(int nElementBytes,int nCount,int nReservedBytes=0); 
private: 
	PDWORD m_pHeap; 
	PDWORD MergeBlock(PVOID pBlock,DWORD nGroup,PDWORD pToGroup); 
	void SplitBlock(PVOID pBlock,DWORD nGroup,DWORD nToGroup); 
	PVOID PageAlloc(PVOID pBlock,DWORD nSize); 
	void PageFree(PVOID pBlock,DWORD nSize); 
	void ChainPush(PDWORD pBlock,DWORD nGroup); 
	PDWORD ChainPop(DWORD nGroup); 
	static DWORD Group(DWORD nSize); 
}; 
 
void CopyMemory(PVOID pDest,PCVOID pSrc,DWORD nLength); 
void FillMemory(PVOID pDest,DWORD nLength,BYTE nFill); 
 
#endif //_GOS_MEMORY_H_