内核对象

什么是内核对象?
C++中 类有类的对象,对象有权限访问类中的方法和属性。同理,Windows也自己的类,但不是公开的。可以通过调用函数创建这些不公开类的对象对Windows进行操作。而产生的对象,就称为内核对象。

 

内核对象的基本概念:
  Windows系统是非开源的,它提供给我们的接口是用户模式的,即User-Mode API。当我们调用某个API时,需要从用户模式切换到内核模式的I/O System Services API。例如我们调用Kernel32.dll中的CreateFile创建文件,最终将执行ntdll.dll中的系统服务NtCreateFile。

 

特点:
  内核对象和普通的数据结构间的最大区别在于其内部数据结构是隐藏的,我们无法(系统没有操作接口)直接读或改变对象内部的数据结构。
  注意:我们编写程序都是在用户模式下进行的。应用程序可以使用其他类型的对象,如菜单、窗口、鼠标光标、刷子和字体等。这些对象属于用户对象或图形设备接口(GDI)对象,而不是内核对象。

  内核对象的数据结构只能被内核访问,因此应用程序无法在内存中找到这些数据结构并直接改变它们的内容。Microsoft 规定了这个限制条件,目的是为了确保内核对象结构保持状态的一致。这个限制也使Microsoft能够在不破坏任何应用程序的情况下在这些结构中添加、 删除和修改数据成员。
  当调用一个用于创建内核对象的函数时,该函数就返回一个用于标识该对象的句柄。如果将该句柄值传递给另一个进程中的一个线程,那么这另一个进程使用你的进程的句柄值所作的调用就会失败。如果想在多个进程中共享内核对象,要通过一定的机制。如对象句柄的继承性,命名对象,复制对象句柄。

 

判别方法:

  若要确定一个对象是否属于内核对象,最容易的方法是观察创建该对象所用的函数

 

内核对象的分类:
  存取符号对象、事件对象、文件对象、文件映射对象、I / O完成端口对象、作业对象、信箱对象、互斥对象、管道对象、进程对象、信标对象、线程对象和等待计时器对象等。这些对象都是通过调用函数来创建的。

posted @ 2017-05-29 18:27  gd_沐辰  阅读(342)  评论(0)    收藏  举报