一、内核对象
1.可以理解为操作系统使用和管理的控制块,例如嵌入式操作系统里的任务控制块,邮箱控制块等。
2.内核对象中有少数的静态成员(全局可见)。
3.只有通过调用windows api 才能使用内核对象。
4.内核对象的作用域是基于进程的,这样做处于安全和健壮型考虑。
5.内核对象有一个静态成员用来计数,当内核对象被创建时计数值为1,如果有其他进程访问此内核对象(通过特殊的进程共享内核对象的方式)则计数值加1,进程结束,计数值减1,如果计数为0,则系统内核会释放此内核对象。
6.创建内核对象时需要指定内核对象的安全级别。
7.每个进程都有一个内核对象的列表,列表由内存块指针,访问掩码,和一些标志位组成。
8.内核对象的创建:在进程的内核对象列表中,找到一个空白位置,创建内核对象,句柄值/4(后两位windows系统用)就是内核对象在列表中的索引。所以说内核对象的句柄不是对象的首地址,只是内核对象在内核对象列表中的索引值。
9.内核对象的关闭:计数值减1,如果为0,则释放对象。
二、用户对象/GDI对象
用户创建的对象,用户具有使用权。
三、进程间共享内核对象有以下三种方式:
1.继承对象句柄,首先要在创建对象时在参数安全结构体(SECURITY_ATTIBUTES)中指明句柄是可继承的。
当指明对象的句柄是可继承时,那么在进程的内核对象列表中,标志位中关于可继承的位就会被置1.
那么在父进程创建子进程的时候,子进程就会继承父进程内核列表中所有的可继承的句柄,只继承一次。
但是子进程无法通过某种手段获知自己继承了哪些内核对象句柄,只能从程序文档中获知。
2.继承有名字的对象
如果进程A创建了一个名字“good”的内核对象,进程B可以创建相同类型相同名字的对象,那么就会有访问权了。
也可以直接open特定名字的内核对象。
3.还有一种方式是复制一个进程的内核对象列表DupilateHandle,很少用。