《Windows核心编程》之“内核对象”

    内核对象(Kernel Object)是Winodws操作系统中最核心的一个概念,本章主要介绍“内核对象”整个抽象概念的共性,而不针对具体的某个内核对象。

    这一章介绍了“内核对象”的公共属性:usage count(使用计数) 和 Security Descriptor (SD,安全描述符)、进程的内核对象句柄、内核对象的命名空间和跨进程共享内核对象。   

    要理解本章的知识点,最好使用 winobj.exe 去观察各种内核对象和 Global 名称空间。还需要掌握用 Procexp.exe 去观察某个进程的 handle table 。  
    使用这两个工具去观察 03-Singleton.exe 进程及其相关的内核对象和句柄,会发现捕获不到相关的内核对象,这是因为它们被放到了 Private Namespace 。

一、什么是内核对象

1,内核对象是对操作系统各项资源的抽象。

    Windows操作系统采用的是面向对象的编程模式,它将其管理的各项资源,都抽象为各种对象。比如:file、event、process、thread、iocompletationport、mailslot、mutex和 registry 等。

    使用wintellect公司的sysinternals套件中的“winobj.exe”工具可以查看Windows Kernel Object的相关信息。其中,在它的目录树中的“ObjectType”中列出了各种内核对象的名称。需要注意的是,创建内核对象的函数名和内核对象的名称并都不是相似的,比如:文件映射对象,它的对象类型为session,而它是通过“CreateFileMapping”函数来创建的。

 

2,内核对象是内核代码中的一种数据结构

    Windows操作系统代码是由C语言(部分汇编)实现的。与C++语言的class不同,C语言的对象就是一个“数据结构” + 操作该数据结构的相关函数

    在驱动编程中,DriverObject、DeviceObject等,我们查看它的定义(在wdm.h文件中),发现它们就是一个数据结构。事实上,其他内核对象在代码层面来说,也都是一中数据结构(结构体)。

    内核对象是存在内核地址空间的一种数据结构(结构体),它由操作系统管理,而不是具体的某个进程管理。但是,需要注意的是:进程的内核对象句柄(后面简称“句柄”)是属于“进程级别”的,从某种程度来说,句柄是内核对象在进程句柄表中的索引(32bits or 64bits 整数)。

 

3,内核对象的属性

   从代码层面来说,内核对象的属性就是表示该内核对象的结构体的各个成员。当然,不同的内核对象,对应不同的结构体,它们的成员各部相同。但是,也有那么几项所有内核对象都具有的属性。

1)使用计数(usage count)

    数据结构是静态的,内核对象是操作系统在运行时保有的一种活的资源,操作系统需要管理内核对象的生死。此外,内核层代码是被所有应用层进程共享,操作系统需要管理这种共享资源。

    操作系统是怎样来管理内核对象的呢?最基础的一个机制,正是“使用计数”。大致规则是:内核对象被初次创建,计数为1;内核对象被另一个进程获取,计数加1;内核对象被一个进程释放,计数减1;内核对象计数为0时,系统会销毁它。该属性由操作系统维护,应用程序开发者只需知道这个机制即可。

    在《Windows驱动开发技术详解》CH11 提到,可以通过内核函数 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值