windows核心编程第三章

3.1.1  内核对象的使用计数

内核对象由内核所拥有,而不是由进程所拥有。换句话说,如果你的进程调用了一个创建内核对象的函数,然后你的进程终止运行,那么内核对象不一定被撤消。在大多数情况下,对象将被撤消,但是如果另一个进程正在使用你的进程创建的内核对象,那么该内核知道,在另一个进程停止使用该对象前不要撤消该对象,必须记住的是,内核对象的存在时间可以比创建该对象的进程长。


3.2.1 创建内核对象

如果调用一个函数创建内核对象,但是调用失败了,那么返回的句柄值通常是0(N U L L)。不过有少数函数在运行失败时返回的句柄值是-1(I N VA L I D H A N D L E VA L U E)。例如,C r e a t e F i l e,所以在返回值验证是否成功的时候需要注意


3.2.2 关闭内核对象

假如忘记调用C l o s e H a n d l e函数,那么会不会出现内存泄漏呢?答案是可能的,但是也不一定。在进程运行时,进程有可能泄漏资源(如内核对象)。但是,当进程终止运行时,操作系统能够确保该进程使用的任何资源或全部资源均被释放,这是有保证的。对于内核对象来说,系统将执行下列操作:当进程终止运行时,系统会自动扫描进程的句柄表。如果该表拥有任何无效项目(即在终止进程运行前没有关闭的对象),系统将关闭这些对象句柄。如果这些对象中的任何对象的使用计数降为0,那么内核便撤消该对象。



你可能感兴趣的:(windows核心编程第三章)