内核对象与用户对象/GDI对象

一、内核对象:

    是操作系统为一些系统级别对象维护的一些数据结构。

二、内核对象放在什么位置:

    内核对象放在进程的内核对象句柄表中,出于安全性与健壮性。

三、如何访问内核对象

     1.内核对象是通过HANDLE来表示的。

     2.只有通过调用Windows API,通过HANDLE来间接操作内核对象。   

   3.通过内核对象可以操作内核的设备。

   4.内核对象有安全权限(SECURITY_ATTRIBUTES)

四、内核对象的生命周期:

     1.内核对象有一个静态成员用来计数,当内核对象被创建时计数值为1,访问此内核对象,则计数值加1,访问结束,计数值减1,当计数为0,则系统自动释放此内核对象。  

   2.虽然内核对象是与进程相关的,但是生命周期与进程的生命周期并不完全相同。

五、常见的内核对象:

  事件对象、文件对象、I/O完成端口、邮件槽、互斥对象、进程对象、线程对象、信号量对象、可等待的计时器、线程池工厂对象。

六、为内核对象的专有命名空间  

  作用:

    1、避免被劫持

    2、可以根据名字来保证操作系统中只有一个运行实例。 

  方法:

    http://www.cnblogs.com/wang-can/p/3331047.html

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

     1.继承内核对象句柄

    1、内核对象可以继承。

    2、继承

    3、通知子进程。(在子进程与父进程之间的内核对象句柄值一样,因为子进程是一创建一张新表,然后再将父进程的内核对象复制上去)

     2.通过命名的内核对象

    1、内核对象有一个自定义的名字。

    2、在任何进程中,再次创建具有相同名字的内核对象。系统会检查是否已经存在一个以这个名字命名的相同类型的内核对象,并且会检查调用者是否具有足够的权限来访问它,如果满足,则会将内核对象复制到当前进程中。但是请注意,因为内核对象是针对进程的,所以这个复制而来的句柄值不一样,因为索引不一定相同。

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

    1、需要知道两个进程的句柄。

    2、复制后,要通知子进程。

      

八、用户对象/GDI对象   

     用户对象:用户创建的对象,用户具有使用权。

   GDI对象就是图形对象,用户创建,用户具有使用权。 

原文地址:https://www.cnblogs.com/wang-can/p/3324730.html