模拟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_)


 

通过api获取句柄控制其他窗体

很多时候,编写程序模拟鼠标和键盘操作可以方便的实现你需要的功能,而不需要对方程序为你开放接口。比如,操作飞信定时发送短信等。我之前开发过飞信耗子,用的是对飞信协议进行抓包,然后分析协议,进而模拟协议的...
  • u010984552
  • u010984552
  • 2016年08月23日 15:19
  • 4029

深入了解Windows句柄到底是什么

总是有新入门的Windows程序员问我Windows的句柄到底是什么,我说你把它看做一种类似指针的标识就行了,但是显然这一答案不能让他们满意,然后我说去问问度娘吧,他们说不行网上的说法太多还难以理解。...
  • wenzhou1219
  • wenzhou1219
  • 2013年12月30日 11:02
  • 58727

Socket模拟客户端与服务器

SOCKET与多线程
  • u012532305
  • u012532305
  • 2015年07月09日 22:47
  • 803

C++串口操作以及串口模拟测试

C++操作串口以及模拟串口测试
  • superyang198608
  • superyang198608
  • 2017年01月08日 12:34
  • 944

Pthread使用总结

摘要最近由于开发需要用到多线程,以前看的ARTOOKIT项目中有用到pthread,所以又重新看了一下,重点分析了它的多线程实现。它的实现方式的确很nice,以前没有注意到,现在整理在这里,一方面便于...
  • liujiabin076
  • liujiabin076
  • 2016年12月04日 22:02
  • 1067

linux异步信号handle浅析

在初学linux编程的时候,一直觉得异步信号handle是个很神奇的东西,用户程序可以使用singal之类的系统调用为某某信号注册一个信号处理函数(handle函数)。       程序的二进制代码...
  • ctthunagchneg
  • ctthunagchneg
  • 2013年05月11日 15:43
  • 1316

[Bluetooth]使用虚拟串口连接到远程蓝牙设备

你可以利用Microsoft Windows CE的串口模拟器在两个蓝牙设备间建立连接。串口模拟器处于蓝牙协议栈的顶层,在虚拟串口的基础上提供连接RFCOMM的通路。它没有暴露栈的接口,而是提供了一个...
  • JamesXing
  • JamesXing
  • 2007年07月20日 13:45
  • 4285

Wince蓝牙虚拟串口通信(server & client)

微软官网文章标题:Creating a Connection to a Remote Device Using a Virtual COM Port 很多内容参照此文章http://blog.csd...
  • luliyuan
  • luliyuan
  • 2014年12月09日 12:28
  • 2579

Handle机制详解

一、Android消息机制一          Android 有一种叫消息队列的说法,这里我们可以这样理解:假如一个隧道就是一个消息队列,那么里面的每一部汽车就是一个一个消息,这里我们先忽略掉...
  • Ivory_wiki
  • Ivory_wiki
  • 2016年06月07日 13:28
  • 742

handle与多线程

handle的post的方法: Post   对于Handler的Post方式来说,它会传递一个Runnable对象到消息队列中,在这个Runnable对象中,重写run()方法。一般...
  • bestone0213
  • bestone0213
  • 2015年01月18日 14:58
  • 1102
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:模拟Windows句柄的实现于管理
举报原因:
原因补充:

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