内核对象

一、内核对象

     1.可以理解为操作系统使用和管理的控制块,例如嵌入式操作系统里的任务控制块,邮箱控制块等。

     2.内核对象中有少数的静态成员(全局可见),如计数和安全描述符。

     3.只有通过调用windows api 才能使用内核对象。

     4.内核对象的作用域是基于进程的,这样做处于安全和健壮型考虑。

     5.内核对象有一个静态成员用来计数,当内核对象被创建时计数值为1,如果有其他进程访问此内核对象(通过特殊的进程共享内核对象的方式)则计数值加1,进程结束,计数值减1,如果计数为0,则系统内核会释放此内核对象。

     6.创建内核对象时需要指定内核对象的安全级别。

     7.每个进程都有一个内核对象的列表,列表由内存块指针,访问掩码,和一些标志位组成。

     8.内核对象的创建:在进程的内核对象列表中,找到一个空白位置,创建内核对象,句柄值/4(后两位windows系统用)就是内核对象在列表中的索引。所以说内核对象的句柄不是对象的首地址,只是内核对象在内核对象列表中的索引值。       

     9.内核对象的关闭:计数值减1,如果为0,则释放对象。 

二、用户对象/GDI对象   

     用户创建的对象,用户具有使用权。一般创建内核对象的函数的参数中,都有安全标示的参数。但用户对象/GDI对象则一般没有。

三、进程间共享内核对象有以下三种方式:

     1.继承对象句柄,首先要在创建对象时在参数安全结构体(SECURITY_ATTIBUTES)中指明句柄是可继承的。

        当指明对象的句柄是可继承时,那么在进程的内核对象列表中,标志位中关于可继承的位就会被置1.

        那么在父进程创建子进程的时候,子进程就会继承父进程内核列表中所有的可继承的句柄,只继承一次。

        但是子进程无法通过某种手段获知自己继承了哪些内核对象句柄,只能从程序文档中获知。

     2.继承有名字的对象

        如果进程A创建了一个名字“123”的内核对象,进程B可以创建相同类型相同名字的对象,那么就会有访问权了。

        也可以直接打开特定名字的内核对象。

     3.还有一种方式是复制一个进程的内核对象列表DupilateHandle,很少用。

你可能感兴趣的:(windows,api,Security,文档,任务,嵌入式操作系统)