模拟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_)
- 模拟Windows句柄的实现于管理
- windows 句柄的实现原理 初解
- TLS(线程局部存储)模拟句柄的实现
- TLS(线程局部存储)模拟句柄的实现
- windows句柄的详解
- Windows句柄的理解
- Windows的用户管理中的用户模拟
- Windows句柄数的限制
- windows中的句柄的概念
- 关于windows句柄的含义
- 常用的windows句柄数据类型
- Windows 进程的句柄表
- Windows下编程--模拟时钟的实现
- 新的Windows Azure服务管理API使得存储服务更易于管理
- 有关于句柄
- Windows的用户管理中的用户模拟 impersonate
- .NET对象与Windows句柄(一):句柄的基本概念
- windows 句柄
- 第六周任务一
- Android内存泄露利器(全自动篇)
- 深入理解 Android消息处理系统的原理
- spring.net 获得session
- cursor的形状
- 模拟Windows句柄的实现于管理
- python 性能优化(2)
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- [转]Android中uri的组成
- JAVA代码中使用魔法数值
- 邮件发送附件
- 在CentOS5.8下从源码安装xen-3.4.4.tar.gz
- 常用的Struts 2.0的标志(Tag)介绍
- SQL 转置行为列,合并多行