内核对象

来源:互联网 发布:服装批发零售软件 编辑:程序博客网 时间:2024/04/30 07:08

几个知识点:

1.内核对象是由内核拥有的对象,可以供系统和应用程序使用来管理各种各样的资源。如事件对象、文件对象、文件映射对象、I/O完成端口对象、互斥对象、管道对象等等。

2.系统采用使用计数的机制来撤销对象。内核对象能够得到安全描述符的保护。安全描述符用于描述谁创建了该对象,谁能够访问或使用该对象,谁无权访问该对象,安全描述符通常在编写服务器应用程序时使用。

3.用于判断一个对象究竟是用户对象还是内核对象的最简单方法:用于创建内核对象的函数几乎都有一个指向SECURITY_ATTRIBUTES结构的指针作为其参数。

4.当一个进程被初始化时,系统要为其分配一个句柄表。该句柄表只用于内核对象,不用于用户对象或者GDI对象。用于创建内核对象的函数有(但不限于):CreateThread、CreateFile、CreateFileMapping、CreateSemaphore等等。

5.调用一个函数创建内核对象,如果调用失败的话,返回的句柄通常是0(NULL),但是也有少数函数在运行失败时返回的句柄值是-1(INVALID_HANDLE_VALUE),所以,在不清楚返回值的情况下,用以检查函数是否失败需要同时检测这两个值。

6.许多情况下,在不同进程中运行的线程需要共享内核对象。如:文件映射对象能够在同一台机器上运行的两个进程之间共享数据块;邮箱和指定的管道使得应用程序能够在连网的不同机器上运行的进程之间发送数据块;而互斥对象、信标和事件使得不同进程中的线程能够同步他们的连续运行。

7.对象句柄的继承性。只有当进程具有父子关系时,才能使用对象句柄的继承性。使用继承性必须该进程中的内核对象句柄和进程的子进程同时被标记为可继承的。句柄的可继承性,可以使用SetHandleInformation函数来改变。

8.共享跨越进程边界的内核对象的第二种方法是给对象命名(第一种方法就是父子进程之间的共享)。许多(但不是全部)内核对象是可以命名的。例如下面的函数可以创建命名的内核对象:CreateMutex、CreateEvent、CreateSemaphore、CreateWaitableTimer、CreateFileMapping、CreateJobObject等等。按照命名对象共享时,注意所有这些对象共享同一个名字空间。使用CreateXxx来创建内核对象时(指定名字),可以通过检查(GetLastError == ERROR_ALREADY_EXIST)来判断是否是新建的内核对象。按名字共享内核对象的另外一种方法,是另外一个进程调用OpenXxx函数来打开内核对象。这个系列函数与CreateXxx函数之间的主要区别是如果对象不存在,CreateXxx将创建该对象,而OpenXxx函数将运行失败。

9.在终端服务器上,可以拥有内核对象的多个名字空间。

10.共享跨越进程边界的内核对象的第三个方法是使用DuplicateHandle函数。

原创粉丝点击