一、系统中的内核对象有:比如存取符号对象、 事件对象、文件对象、文件映射对象、I / O 完成端口对象、作业对象、信箱对象、互斥对象、管道对象、进程对象、信标对象、线程对象和等待计 时器对象等。
二、对于内核的理解:
每个内 核对象只是内核分配的一个内存块,并且只能由该内核访问。
该内存块是一种数据结构,它的成员负责维护该对象的各种信息。
有些数据成员(如安全性描述符、使用计数等)在所有对象类型中是相同的,但大多数数据成员属于特定的对象类型。
例如,进程对象有一个进程I D 、一个基 本优先级和一个退出代码,而文件对象则拥有一个字节位移、一个共享模式和一个打开模式。
三、特别需要注意的一个事实:内核对象的存在时间可以比创建该对象的进程长。
实现的机理:1、内核对象由内核所拥有,而不是由进程所拥有。2内核对象的使用计数
四、究竟是用户对象还是内核对象呢?若要确定一个对象是否属于内核对象,最容易的方法是观察创建该对象所用的函数。创建内核对象的所有函数几乎都有一个参数,你可以用来设定安全属性的信息。
五、进程的内核对象句柄表
进程的句柄表,它只是个数据结构的数组。每个结构都包含一个指向内核对象的指针、一个访问屏蔽和一些标志。
六、跨越进程边界共享内核对象
在不同进程中运行的线程需要共享内核对象。下面是为何需要共享的原因:
• 文件映射对象使你能够在同一台机器上运行的两个进程之间共享数据块。
• 邮箱和指定的管道使得应用程序能够在连网的不同机器上运行的进程之间发送数据块。
• 互斥对象、信标和事件使得不同进程中的线程能够同步它们的连续运行,这与一个应用程序在完成某项任务时需要将情况通知另一个应用程序的情况相同。
七、命名对象
共享跨越进程边界的内核对象的第二种方法是给对象命名。
所有这些函数都有一个共同的最后参数p s z N a m e 。
当为该参数传递N U L L 时,就向系统指明了想创建一个未命名的(匿名)内核对象。
命名对象常常用来防止运行一个应用程序的多个实例。
创建一个命名对象后,怎么判断该命名对象是否已经创建过。
当C r e a t e *函数返回时,调用G e t L a s t E r r o r 函数。
如果G e t L a s t E r r o r 函数返回E R R O R _ A L R E A D Y _ E X I S T S ,那么你的应用程序的另一个实例正在运行
为了保证对象的唯一性,建议创建一个G U I D ,并将G U I D 的字符串表达式用作对象名。
八、 存在的几个疑惑:句柄能够在进程之间拷贝? 这样做有意义吗?
句柄,喔 用途上还没有概念。。。