模拟Windows句柄的实现于管理

原创 2012年03月28日 13:32:48
#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_)


 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

TLS(线程局部存储)模拟句柄的实现

这是今天做一个邮件发送模块把一个类包装成Win32 API形式调用时想到的。简单的实现了一下句柄的概念,对于理解内核对象和句柄的概念有一定帮助,看起来还颇像那么回事,呵呵。不过这里的“句柄表”是借助了...

Windows 句柄泄露学习总结

句柄泄露实例分析 http://www.cnblogs.com/Leo_wl/p/5397274.html 在上篇文章.NET对象与Windows句柄(二):句柄分类和.NET句柄泄露的例子中,我...

Windows API学习之路一:程序入口、LPSTR与句柄

就像C/C++和JAVA有一系列的库函数一样,任何一种程序开发平台都会提供众多的接口函数供开发人员使用,Windows应用程序的开发核心问题是如何使用Windows SDK所提供的API。

Windows对象、句柄与MFC对象

Windows对象、句柄与MFC对象  (2009-04-28 22:11:34)转载标签:  windows对象   句柄   mfc对象   杂谈分类: MFC以及Windows编...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)