由于.net Framework中很多地方需要用到以前Win32中的一些知识点,不了解其中的来胧去脉学习起来会比较吃力,于是准备用点时间补一下Windows 核心方面的知识点,参考书本是经典的<Windows核心编程>.学完后,可以有这个基础去研究.Net中的<.Net 框架程序设计>这本经典.
从第三章内核对象开始....
什么是内核对象,有何特性?
在windows编程中,创建一个比如 HPen pen=new HPen()就相当于创建一个对象,Windows API内置了许许多多的类,比如画笔类,字体类,矩形类等. 根据类来创建的对象并不全是内核对象,那么,什么才算是内核对象呢?内核对象有什么基本的特征呢?
内核对象是内核分配的一个内存块,这种内存块是一个数据结构,表示内核对象的各种特征。并且只能由内核来访问。应用程序若需要访问内核对象,需要通过操作系统提供的函数来进行,不能直接访问内核对象(Windows从安全性方面来考虑的)。
注意几点,其一,内核对象是由内核来分配的,并不是客户实例化出来的对象,所以new 出来的对象并不是内核对象,必须用系统的函数Create*()来创建内核对象(比如CreateFileMapping就是创建一个文件映射内核对象等).
其二,对象者,数据结构上所承载的数据也。不同于其它对象,数据结构可以自由更改,内核对象的数据结构必须有几点是符合规范的,且都是固定的。应用程序只能创建,使用,修改内核对象内的数据,而无法更改其内存的结构状态。
其三,创建内核对象是返回该对象的一个句柄(可以理解为一种特殊的指针),这些句柄可在创建该内核的进程内使用,而不可在外部进程中使用,我们通过操纵句柄来操纵内核对象。(注:是句柄不可在外部进程中使用,而非内核对象,内核对象可以在多个进程间共享。)
其四,即然我们无法更改内核对象的数据结构,我们如何来操纵这些内核对象,答:Microsoft定义了一组函数,以便用很好的方法来对这些数据结构进行操作。我们将创建得到的句柄传给这些函数,系统就知道你要操作哪个内核对象, 然后会按系统定义的方法来进行操作。
其五,内核对象由系统来分配创建,它的拥有者是属于内核的,而不是属于进程的。所以,如果该进程调用了一个创建内核对象的函数,然后进程终止运行,但是内核对象不一定会被撤销。(在大多数情况下,内核对象是会被撤销的,如果有另一进程拥有这个内核对象的句柄,则不会被撤销。)记住:内核对象存在的时间可能会比创建该对象的进程寿命要长。
其六,正是由于多个进程可以共享一个内核对象,所以,内核对象的数据结构中必须有一项计数器的数据成员,以表示有多少个进程拥有该内核对象。
内核对象的安全性:
内核对象能够得到安全描述符的保护,安全描述符描述了谁创建了该对象,谁可以使用该对象,谁无权使用该对象。那么,如何使用该安全特性呢?
举一例:
HANDLE CreateFileMapping(
HANDLE hFile.
PSECURITY_ATTRIBUTES psa,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximuniSizeLow,
PCTSTR pszNarne);
其中,第二个参数PSECURITY_ATTRIBUTES就是关于安全性的参数,一般传入NULL即可,表示默认安全。
关于Windows中的其它对象。应用程序可以创建诸如菜单,窗口,光标,刷子等对象,这些属于用户对象或图形设备接口对象,而并不是内核对象,一定要区分开来。若要确定创建的对象是否属于内核对象,则要查看创建对象的函数,是否有安全描述符参数。
关闭内核对象,调用系统的函数BOOL CloseHandle(HANDLE Hobj)来关闭内核。