/*-----------------------------------------------------------------------------
    caryMemory_lib.h -- cary's Virtual memory 管理。
    Waei(c) All rights reserved
    author: 許百勝Cary Hsu, 2000.10.8
-----------------------------------------------------------------------------*/
#ifndef __MEMDLL
#define __MEMDLL

#define _MEM_LIB

#ifdef _MEM_LIB
	#define MEMDLL_API
#else
	#ifdef MEMDLL_EXPORTS
		#define MEMDLL_API __declspec(dllexport)
	#else
		#define MEMDLL_API __declspec(dllimport)
	#endif
#endif

//回傳的錯誤***************************************************************************************
#define ERROR_MEMORY_OK				0x00000000
#define ERROR_MEMORY_INITFAILED		0x00000001	//配置Handle陣列錯誤

#define ERROR_HEAP_NOT_ENOUGH		0x00000010
#define ERROR_HEAP_LIST_NOT_ENOUGH	0x00000020

//*************************************************************************************************
/*	初始化記憶體函式庫
return:	ERROR_MEMORY_OK:		成功
		ERROR_MEMORY_INITFAILED:初始化失敗	*/
DWORD MemoryInit();

/*	釋放記憶體函式庫的記憶體	*/
void MemoryRelease();

//*************************************************************************************************
/*	保留一大範圍的Virtual Memory，並傳回Handle，建議以page為單位(先配置1個commit page的記憶體)
parameter:	lpdwHandle:	傳回Handle
			iSize:		要配置多少記憶體，並回傳建立的大小
return:		非NULL:		回傳配置記憶體的位址
			NULL:		失敗					*/
MEMDLL_API LPVOID VirtualReserve( LPDWORD lpdwHandle, int &iSize);

/*	釋放此Handle配置的記憶體
parameter:	lpdwHandle:	Handle值	*/
MEMDLL_API void VirtualRelease( LPDWORD lpdwHandle);

/*	發生Exception的處理函式
parameter:	dwHandle:						Handle值
			lpEP:							EXCEPTION_POINTERS的structure
return:		EXCEPTION_CONTINUE_EXECUTION:	繼續執行
			EXCEPTION_CONTINUE_SEARCH:		繼續尋找可處理exception handle	*/
MEMDLL_API int ExpFilter( DWORD dwHandle, LPEXCEPTION_POINTERS lpEP);

//*************************************************************************************************
//*************************************************************************************************
/*	配置iSize個記憶體當Heap
parameter:	lpdwHandle:		傳回Handle
			iSize:			要配置多少的記憶體
return:		TRUE:			配置成功
			FALSE:			失敗				*/
MEMDLL_API BOOL HeapCreate( LPDWORD lpdwHandle, int &iSize);

/*	釋放Heap的所有記憶體
parameter:	lpdwHandle:	Handle值	*/
MEMDLL_API void HeapRelease( LPDWORD lpdwHandle);

/*	清除Heap的List，再使用
parameter:	dwHandle:	Handle值	*/
MEMDLL_API void HeapReset( DWORD dwHandle);

/*	從lpheap中，配置dwSize大小的記憶體
parameter:	dwHandle:	Handle值
			dwSize:		要配置多少記憶體
return:		非NULL:		傳回配置的記憶體
			NULL:		失敗				*/
MEMDLL_API LPVOID HeapAlloc( DWORD dwHandle, DWORD dwSize);

/*	從lpheap中釋放掉Heap的memlt
parameter:	dwHandle:	Handle值
			lpAddress:	要釋放的記憶體位址的位址				*/
MEMDLL_API void HeapFree( DWORD dwHandle, LPVOID *lpAddress);

//*************************************************************************************************
//*************************************************************************************************
typedef struct USEDMEMORY{
	LPBYTE			lpbyStart;
	DWORD			dwSize;
}*LPUSEDMEMORY;

/*	取回lpheap的第一個Heap list
parameter:	dwHandle:	Handle值
return:		傳回使用中的address，NULL為最後一個	*/
MEMDLL_API LPUSEDMEMORY GetMemoryListHead( DWORD dwHandle);

/*	取回lpheap的下一個Heap list
parameter:	dwHandle:	Handle值
return:		傳回使用中的address，NULL為最後一個	*/
MEMDLL_API LPUSEDMEMORY GetMemoryListNext( DWORD dwHandle);

/*	取回錯誤值
parameter:	dwHandle:	Handle值
return:		回傳錯誤值			*/
MEMDLL_API DWORD GetCaryError( DWORD dwHandle);

//*************************************************************************************************
//*************************************************************************************************
/*	搬移記憶體，使用MMX做針對pentum II最佳化的處理
parameter:	dest:	目的位址
			src:	來源位址
			cnt:	搬移的byte數
return:		TRUE:	成功執行
			FALSE:	位址不合法						*/
MEMDLL_API BOOL mmx_CopyMemory( LPVOID dest, LPVOID src, int cnt);

/*	搬移記憶體，使用MMX做針對pentum II最佳化的處理
parameter:	dest:	目的位址
			src:	來源位址
			cnt:	搬移的byte數
return:		TRUE:	成功執行
			FALSE:	位址不合法						*/
MEMDLL_API BOOL mmx_CopyMemory_test( LPVOID dest, LPVOID src, int cnt);

#endif
