模拟Windows句柄的实现于管理

来源:互联网 发布:idc销售平台php源码 编辑:程序博客网 时间:2024/04/30 01:07
#ifndef _HANDLE_MGR_H_#define _HANDLE_MGR_H_#undef MALLOC#undef FREE#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))#define TABLE_SIZE 1024*1024#pragma pack(push,1)//句柄信息typedef struct tagHandleItem{    unsigned int   ID;        //句柄ID    void         * Pointer;   //句柄指针    unsigned char  bValid;    //指针是否有效}HandleItem;typedef struct tagHandleTable{    HandleItem       hands[TABLE_SIZE];    tagHandleTable  *next;}HandleTable;#pragma pack(pop)class CHandleMgr{public:    CHandleMgr()    {        m_pHandTable=NULL;    }    virtual ~CHandleMgr()    {        tagHandleTable  *next;        while(m_pHandTable)        {            next=m_pHandTable->next;            FREE(m_pHandTable);            m_pHandTable=next;        }    }private:    HandleTable *m_pHandTable;    HANDLE CreateHandle(HandleTable *pHandTable, void *p, UINT iTable)    {        if (pHandTable)        {            //检测当前表            for (size_t i=0;i<TABLE_SIZE;i++)            {                if (!pHandTable->hands[i].bValid || pHandTable->hands[i].Pointer==NULL)                {                    pHandTable->hands[i].ID=iTable*TABLE_SIZE+i+1;                    pHandTable->hands[i].bValid=TRUE;                    pHandTable->hands[i].Pointer=p;                    return HANDLE((DWORD)pHandTable+(i*sizeof(HandleItem)));                }            }            //检测下一个表            if (pHandTable->next)            {                HANDLE handle=CreateHandle(pHandTable->next,p,iTable+1);                if (handle) return handle;            }            //未找到可用的,则在最后增加一个表            HandleTable *ptable=(HandleTable *)MALLOC(sizeof(HandleTable));            if (ptable)            {                memset(ptable,0,sizeof(HandleTable));                pHandTable->next=ptable;                ptable->hands[0].ID=iTable*TABLE_SIZE+1;                ptable->hands[0].bValid=TRUE;                ptable->hands[0].Pointer=p;                return HANDLE(ptable);            }        }        return NULL;    }    void *IndexToPointer(HandleTable *pHandTable, UINT iTable, UINT index)    {        if (NULL==pHandTable) return NULL;        UINT iStart=iTable*TABLE_SIZE;        if (index>=iStart && index<iStart+TABLE_SIZE)        {            index-=iTable*TABLE_SIZE;            if ( pHandTable->hands[index].bValid && pHandTable->hands[index].Pointer )            {                return pHandTable->hands[index].Pointer;            }                    }else{            return IndexToPointer(pHandTable->next,iTable+1,index);        }                return 0;    }    HANDLE IndexToHandle(HandleTable *pHandTable, UINT iTable, UINT index)    {        if (NULL==pHandTable) return NULL;        UINT iStart=iTable*TABLE_SIZE;        if (index>=iStart && index<iStart+TABLE_SIZE)        {            index-=iTable*TABLE_SIZE;            if ( pHandTable->hands[index].bValid && pHandTable->hands[index].Pointer )            {                return HANDLE(&pHandTable->hands[index]);            }                    }else{            return IndexToHandle(pHandTable->next,iTable+1,index);        }                return 0;    }public:    HANDLE CreateHandle(void *p)    {        if (m_pHandTable==NULL)        {            //未找到可用的,则在最后增加一个表            m_pHandTable=(HandleTable *)MALLOC(sizeof(HandleTable));            if (m_pHandTable)            {                memset(m_pHandTable,0,sizeof(HandleTable));                m_pHandTable->hands[0].ID=1;                m_pHandTable->hands[0].bValid=TRUE;                m_pHandTable->hands[0].Pointer=p;                return HANDLE(m_pHandTable);            }        }        return CreateHandle(m_pHandTable,p,0);    }    BOOL CloseHandle(HANDLE handle)    {        if (handle && !IsBadWritePtr(handle,sizeof(HandleItem)))        {            if ( ((HandleItem *)handle)->bValid && ((HandleItem *)handle)->Pointer )            {                ((HandleItem *)handle)->bValid=FALSE;                ((HandleItem *)handle)->Pointer=NULL;            }        }        return TRUE;    }    void *HandleToPointer(HANDLE handle)    {        if (handle && !IsBadWritePtr(handle,sizeof(HandleItem)))        {            if ( ((HandleItem *)handle)->bValid && ((HandleItem *)handle)->Pointer )            {                //TRACE("%08X %08X", handle, ((HandleItem *)handle)->Pointer);                return ((HandleItem *)handle)->Pointer;            }        }        return NULL;    }    UINT HandleToID(HANDLE handle)    {        if (handle && !IsBadWritePtr(handle,sizeof(HandleItem)))        {            if ( ((HandleItem *)handle)->bValid && ((HandleItem *)handle)->Pointer )            {                return ((HandleItem *)handle)->ID;            }        }        return 0;    }    HANDLE IDToHandle(UINT ID)    {        if (ID==0) return NULL;        UINT index=ID-1;        return IndexToHandle(m_pHandTable,0,index);    }    void *IDToPointer(UINT ID)    {        if (ID==0) return NULL;        UINT index=ID-1;        return IndexToPointer(m_pHandTable,0,index);    }};#endif //(_HANDLE_MGR_H_)