概念:内核对象可以供系统和应用程序使用来管理各种各样的资源,Windows程序员可以调用Windows API去创建、打开和操作各种内核对象。常见的内核对象有:访问令牌、事件对象、文件对象、文件映射对象、I/O完成端口、作业对象、邮件槽对象、互斥量对象、管道对象、进程对象、信号量对象、线程对象、可等待计时器对象以及线程池工厂对象等。

本质:内核对象本质上是由操作系统内核分配的一个内存块,并且只能由操作系统内核访问(应用程序不能再内存中定位该内存块并直接更改其内容,只能通过Windows提供的一组函数来操作这些结构)。这个内存块的数据结构维护着与对象相关的信息。其中安全描述符和使用计数器是所有内核对象都有的数据成员,但大多数成员都是不同的类型所特有的,例如进程对象的进程ID,文件对象的字节偏移量等。

操作内核对象:通过调用内核对象创建函数(Windows API,如CreateFileMapping)会返回一个内核对象句柄,该句柄的位数与操作系统的位数一致。为了增强操作系统可靠性,句柄与进程相关联(即使句柄值相同,再不同进程间表示的内核对象也是不一样的)。

使用计数:内核对象的所有者是操作系统而非进程,即内核对象的生命周期并不一定会随着创建该对象的进程的消亡而消亡,这一点是通过使用计数来实现的。使用计数是所有内核对象固有的属性,操作系统通过使用计数维护内核对象的生命周期,当使用计数为0的时候,操作系统将销毁该内核对象。内核对象被创建时,其使用计数为1,另一个进程访问该内核对象后,使用计数加1,当进程终止时,使用计数减1。

内核对象安全性:内核对象的安全性是有内核对象的一个叫安全描述符的属性来保证的。创建内核对象的API通常有一个指向SECURITY_ATTRIBUTES结构体的指针作为参数,该结构体描述了谁拥有对象(一般是内核对象的创建者)、哪些组和用户允许被访问和使用此对象、哪些组和用户被拒绝访问此对象。

typedef struct _SECURITY_ATTRIBUTES{

DWORD nlength;//结构体大小

LPVOID lpSecurityDescriptor;//

BOOL bInheritHandle;//

}SECURITY_ATTRIBUTES

进程内核对象句柄表:前面讲过句柄与进程相关联,这是通过进程的句柄表来实现的,进程初始化时,系统将为它分配一个句柄表,用以存在内核对象。可以将句柄表看成一个数组,每个数组成员存放一个句柄的相关信息:指向内核对象的指针、一个访问掩码和一些标志。

创建和关闭内核对象:当进程首次初始化的时候,其句柄表为空,当进程内的一个线程调用一个会创建内核对象的函数时,操作系统将为这个对象分配并初始化一块内存,然后扫描进程的句柄表,查找到一个空白的记录项,填入该内核对象的相关信息,最后返回对象句柄。可以调用CloseHandle来关闭内核对象句柄,该函数首先检查主调进程的句柄表,验证被关闭的对象句柄值是该经常确实有权访问的一个对象,如果句柄有效,系统将获得内核对象的数据结构地址,并将使用计数减1,如果使用计数变为0,内核对象将被销毁,并从内存中除去。一个内核对象不用了应该调用CloseHandle关闭对象,否则程序运行时将泄漏内核对象,当然,当进程终止后,也能保证内核对象被正确清除。

注意内核对象和用对象(GDI对象)的区别:内核对象创建时有安全属性(SECURITY_ATTRIBUTES),而用户对象或GDI对象没有。

应用程序对象正在关闭_Windows核心编程-内核对象相关推荐

  1. 在应用程序中使用虚拟内存——Windows核心编程学习手札之十五

    在应用程序中使用虚拟内存 --Windows核心编程学习手札之十五 Windows提供了3种进行内存管理的方法: 1)  虚拟内存,最适合用来管理大量对象或结构数组: 2)  内存映射文件,最适合用来 ...

  2. 线程与内核对象的同步——Windows核心编程学习手札之九

    线程与内核对象的同步 --Windows核心编程学习手札之九 用户方式下的线程同步机制具有速度快的特点,但有其局限性,对于许多应用程序来说,并不合适.例如,互锁函数家族只能在单值上运行,根本无法使线程 ...

  3. 对程序错误的处理——Windows核心编程学习手札之一

    对程序错误的处理 --Windows核心编程学习手札之一 函数被调用执行时,先检验传递给它的各个参数的有效性,后执行任务.函数执行中若因参数无效或因某种原因导致无法正常完成函数任务,那么操作系统会返回 ...

  4. 菜鸟程序员内功心法--C++(核心编程)

    C++学习-2.0_核心编程 主要针对面向对象编程技术,学习C++中的核心和精髓 一.内存分区模型 C++程序执行时,将内存大方向划分讷维4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的 ...

  5. python函数赋值给对象_【Python核心编程笔记】一、Python中一切皆对象

    Python中一切皆对象本章节首先对比静态语言以及动态语言,然后介绍 python 中最底层也是面向对象最重要的几个概念-object.type和class之间的关系,以此来引出在python如何做到 ...

  6. python核心编程——python对象

    一.什么是python对象 在python中,构造的不论什么类型的值都是一个对象.比方一个整数类型的值,一个字符串.一个列表等,都能够看做是对象. 全部的对象分为三部分: (1)身份.每一个对象都有个 ...

  7. 转 windows核心编程 学习笔记 目录

    windows核心编程--SEH(结构异常处理) SEH 的工作原理.         Windows 程序设计中最重要的理念就是消息传递,事件驱动.当GUI应用程序触发一个消息时,系统将把该消息放入 ...

  8. C++核心编程:P10->类和对象----多态

    本系列文章为黑马程序员C++教程学习笔记,前面的系列文章链接如下 C++核心编程:P1->程序的内存模型 C++核心编程:P2->引用 C++核心编程:P3->函数提高 C++核心编 ...

  9. Windows核心编程 第九章 线程与内核对象的同步(下)

    9.4 等待定时器内核对象 等待定时器是在某个时间或按规定的间隔时间发出自己的信号通知的内核对象.它们通常用来在某个时间执行某个操作. 若要创建等待定时器,只需要调用C r e a t e Wa i ...

最新文章

  1. jquery中ajax请求后台数据成功后既不执行success也不执行error解决方法
  2. springCloud-4.RestTemplat的使用(两个client之间的调用)
  3. 需要在Emulator上模拟来电 效果
  4. python列表对象相同_Python中的学习列表对象,List
  5. ubuntu 安装过程所需软件
  6. C-Power 自主无人海上电力系统有望通过高效能源传输及远程高带宽通信技术,开启新的海上应用
  7. 秋式开源团队,欢迎您的加入!
  8. dnf强化卷代码_这行代码告诉你!为什么你地下城与勇士(DNF)的装备强化老是失败?...
  9. centos7的网卡配置 实用经典总结
  10. Java List相关用法
  11. kvm实战--convirt使用
  12. winform界面嵌入dwg图纸_完美解决窗体中预览DWG图形(C#版)
  13. Xamarin 打包生成 Android apk 文件
  14. Java重写《C经典100题》 --08
  15. 【使用pycharm管理github仓库】github代码版本控制
  16. winform之控件在Panel中居中
  17. 【MySQL】增大字符串长度不会锁表吗
  18. 商用密码企业调研(必做) 20181314
  19. 实验4-1-12 黑洞数
  20. 今天安利几个实用的APP给你

热门文章

  1. 欧拉公式cos_谈谈欧拉公式与复指数信号
  2. java中怎样创建多个对象,java中StringBuilder.appent方法创建几个对象
  3. 一天1个机器学习知识点(四)
  4. 科普:String hashCode 方法为什么选择数字 31 作为乘子
  5. 连接池Connection Pool 单例设计
  6. 使用Eclipse进行Javaweb项目开发时,如何设置外置浏览器Chrome
  7. 2019北邮计算机考研大纲,2019年北京邮电大学802电子电路考研大纲
  8. 《R语言实战》第4章
  9. oracle 日志注册,Oracle日常维护中管理用户以及重做日志文件的方法
  10. python定义函数的关键字是_python 函数定义