句柄是WINDOWS用来标识被应用程序所建立或使用资源的唯一整数,WINDOWS使用各种各样的句柄标识各种资源或内部对象(诸如应用程序实例,窗口,控制,位图,GDI对象等等)。实际上要使用这些内部对象,可以直接通过物理内存地址(指针),但WINDOWS出于安全性以及保密性考虑,并不希望应用程序随意移动和修改内部对象,所以它把指针伪装成“句柄”(句柄是和对象一一对应的32位无符号整数值。对象可以映射到唯一的句柄,句柄也可以映射到唯一的对象)。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象,例如:
hMem=GlobalAlloc(......);
lpMem=GlobalLock(hMem);
本质上,内核对象句柄,是用来标识某个内核对象的一个ID(并非简单的一个直接索引值),同一个对象的该ID对于每个进程是不同的,具体如何实现是MS不公开的算法,以下是一个近似的,可能的算法:
进程创建时,WINDOWS系统为进程构造了一个句柄表(即内核对象地址链表,并且为适应虚拟内存的要求,句柄表的地址空间是固定的),当该进程希望获得一个内核对象句柄或者创建一个内核对象从而获得该对象句柄时,系统会将在句柄表中增加一个表项,表项的内容中存储了指向目标内核对象的指针,同时,系统返回这个表项在句柄表中的索引(经过某种伪装后)作为句柄。
分配的句柄(稳定)→对象在内存中的地址(不稳定)→实际对象
posted on 2009-02-01 23:51
布迦糖 阅读(301)
评论(0) 编辑 收藏 引用 所属分类:
Windows Kernel