Windows系统内核对象
一.神马是内核对象:
咱们经常在书上看到“内核对象”这个东东,那么“内核对象”到底是个啥东东呢?实践上一个内核对象即是在系统堆中占有一块空间的布局体。不相同品种的内核对象用来同OS管理不相同的资源,比方进程,线程,文件。。。已然OS是靠内核对象来管理这些资源的,那么内核对象中必定是存放了相应资源的一些信息,OS即是依据这些信息来对进程,线程,文件等资源进行管理的。一起咱们也能够看到内核对象依据管理的资源不相同也分为不相同的类型,那么内核对象里边必定也应该有相应的字段来表明它所属的类型,这样OS才干晓得某个内核对象是用来管理啥资源的。内核对象是关键性的系统数据布局,放在KERNEL32 heap 之中。林林总总的内核对象,通通都以相同的表头开端。每一个内核对象都以一个共通的表头开端。此表头具有以下字段:
00h DWORD
对象型态。此值决议后续的布局成员怎么解说。
04h DWORD
这是对象的参用次数(reference count),代表对象被运用的次数。例如,当你调用GetFileInformationByHandle,被问询的文件对象的参用次数就会累加1;而在函数回返之前,参用次数又会减1。如今,你或许巴望晓得有哪些内核对象型态。以下即是一份Window 95中的内核对象清单:
K32OBJ_SEMAPHORE(0×1)
K32OBJ_event(0×2)
K32OBJ_mutex(0×3)
K32OBJ_CRITICAL_SECTION(0×4)
K32OBJ_PROCESS(0×5)
K32OBJ_THREAD(0×6)
K32OBJ_FILE(0×7)
K32OBJ_CHANGE(0×8)
K32OBJ_CONSOLE(0×9)
K32OBJ_SCREEN_BUFFER(0xA)
K32OBJ_MEM_MAPPED_FILE(0xB)
K32OBJ_SERIAL(0xC)
K32OBJ_DEVICE_IOCTL(0xD)
K32OBJ_PIPE(0xE)
K32OBJ_MAILSLOT(0xF)
K32OBJ_TOOLHELP_SNAPSHOT(x10)
K32OBJ_SOCKET(0×11)
整个KERNEL32 和VWIN32.VXD 中,程序代码会先查看对象的第一个DWORD,以断定它所处置的对象型态。一个process database 其实即是一个K32_PROCESS 对象,而一个thread database 其实即是一个K32_THREAD 对象。
二.系统怎么管理对象:
同一类型的对象必定运用链表或许数组等某种方法组织起来进行管理的。它们应该是在系统初始化的时分进行相应的初始化,然后就能够作为一种资源以供系统或许进程以申请和开释的方法进行运用。这是系统对同一类内核对象能够的管理方法(不是书上讲的,我臆测的)。不过书中具体介绍了一个进程是怎么管理归于它自身的一切内核对象的。在PDB中有一个指针指向了一个process handle table,一个process handle table 其实即是一个指针数组,每一个指针指向林林总总的内核对象。而所谓的句柄,则是归于该进程的某个内核对象在process handle table数组中的索引,比方说有一个句柄值为5的文件内核对象传给了系统函数,那么这个函数就会在process handle table中找到第五项,然后从中取出那个文件内核对象在内存中的地址,这样便经过句柄结尾找到了内核对象自身。
handle 的内容理论上来讲是不透明的,也即是说handle 自身没有办法通知你它终究代表啥东西。假如它的值是5,你判别不出这是一个file handle 仍是一个mutex handle。但是,一旦你知道Windows 95 进程的handle tables,你就能够轻易地将一个handle 值和其参考到的数据发生联系。下面咱们在具体谈一下handle table,Windows 95 进程的handle table 布局非常简略,第一个DWORD 放的是这个表格的最大容量(项目个数)。此值初始为0×30(48)。但是这并不意味进程最多只能有48个翻开的handles。当进程需求更多的handles,KERNEL32 会重新装备一块内存,使表格有生长空间。第一个DWORD 之后,是由许多布局所组成的数组。每一个布局都由两个DWORD 构成:
DWORD flags
DWORD pK32Object
其间第二字段是个指针,指向17 种能够的K32 对象型态。至于第一个字段则是此一对象的access control flags。这些符号的含义视对象是何种型态而定。一个没有用的handle,其两个DWORD 一定都填满0。当程序装备一个新的handle,KERNEL32 就运用handle table 中的第一笔空白项的索引值做为handle。
上面临进程管理内核对象的方法是Window 95中的方法,在《Windows 高档程序设计》中我看到上面说在Window NT中大约思路也是相同的,只不过是句柄值如同不是一个索引了,而变成了其他的东东,而且process handle table里边对于每一个内核对象除了其地址外还加入了其他信息,比方安全特点,承继符号等。
转自天狼鼠的博客

浙公网安备 33010602011771号