S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
Windows NT文件系统内幕读书笔记(一)
2008-11-22 11:29

“在WINDOWS NT执行体的内核组件创建的所有对象可以用两种方式引用,一种是使用当创建或者打开的时候NT对象管理器返回的对象句柄,一种是使用对象的指针。注意通常由内核组件分配的对象的指针在所有执行环境中都有效,因为对象引用的虚拟地址将在核心虚拟地址空间。但是,前面提到的,对象的句柄是特定于得到这个句柄的线程的执行上下文的,因此只有在那个特定在执行上下文中有效。

        记住每个NT对象管理器创建的对象都有一个相关的引用计数器。当对象最初创建的时候这个引用计数器设置为1.每当一个内核组件请求对象管理器增加引用计数器的时候引用计数器增加,通常是调用ObReferenceObjectByHandle(在DDK中描述)。引用计数器当在对象句柄上执行关闭操作的时候递减。内核驱动使用ZwClose系统服务调用来关闭系统创建的任何对象句柄。引用计数器在内核组件调用 ObDereferenceObject()的时候也递减,这个函数要求传递对象的指针。当对象计数器变成0的时候,NT对象管理器将会删除这个对象。

在这本书的进程中,你会经常发现我们打开一个对象,收到一个句柄,然后得到这个对象的指针,然后藏到某个地方(可能在全局内存中),引用这个对象,关闭句柄。这给我们两个好处:

1、通过保存对象的指针,我们能够在不是原来的打开对象的线程上下文中重新得到相同对象的句柄,你会在这本书后面发现这样的例子。

2、通过引用这个对象和关闭原来的句柄,我们确保对象不会被删除(知道我们最后一次解除引用),我们还确保一旦我们最后解除引用,对象将会自动被删除。”

……

“你初始化的例程将在系统进程上下文中被调用:这一点尤其重要要记住,如果你打开或者创建任何对象得到一个句柄,任何这样的句柄只是在这个系统进程的上下文中才有效。为了能够在其他进程的上下文中使用这些句柄,你不得不使用这章中前面讲的方法,你可以得到这个对象的指针然后需要的时候再在其他线程上下文中得到对象的句柄。”


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理