内核对象

来源:互联网 发布:apache怎么读 编辑:程序博客网 时间:2024/04/17 05:05
        内核对象只是内核分配的的一个内存块,并且只能由该内核访问。该内存块是一种数据结构,它的成员负责维护该对象的各种信息。有些数据成员(如安全性描述符、使用计数等)在所有对象类型中是相同的,但大多数数据成员属于特定的对象类型。例如。进程对象有一个进程ID、一个基本优先级和一个退出代码,而文件对象则拥有一个字节唯一、一个共享模式和一个打开模式。
    内核对象的数据结构只能被内核访问,因此应用程序无法在内存中找到这些数据结构并直接改变它们的内容。
    Windows提供了一组函数,对内核对象的操作,这些内核时钟都可以通过这些函数进行访问。当调用一个用于创建内核对象的函数时,该函数就返回一个用于标识该对象的句柄。该句柄可以被视为一个透明值,你的进程中的任何线程都可以使用这个值。将这个句柄传递给Windows的各个函数,这样系统就能知道你想操作那个内核对象。
    内核对象由内核所拥有,而不是由进程所拥有。换句话说,如果你的进程调用了一个创建内核对象的函数,然后你的进程终止运行,那么内核对象不一定被撤销。
    内核对象使用计数。而且内核对象存在时间可以比创建对象的进程长。
    内核对象的创建函数都会有安全属性参数(PSECURITY_ATTRIBUTES),而创建用户对象的函数没有这个参数。
    内核对象关闭。调用函数CloseHandle(HANDLE hobj).函数首先检查调用进程的句柄表,以确保传递给他的索引用于标识一个进程实际上无权访问的对象。如果该索引是有效的,那么系统就可以获得内核对象的数据结构地址,并课确定结构中使用计数的数据成员,如果使用计数是0,该内核便从内核中撤销该内核对象。
    当进程终止运行时,系统会自动扫描进程的句柄表。如果该表拥有任何无效项目(即在终止进程运行前没有关闭的对象),系统将关闭这些对象句柄。如果这些对象中的任何对象的使用计数降为0,那么内核便撤销该对象。

    内核对象的继承性
    当为CreateProcess中安全参数的可继承为TRUE,那么子进程就可以继承父进程的可继承句柄值。当传递TRUE时,操作系统就创建该新子进程,但是不允许子进程立即开始执行它的代码。当然,系统为紫禁城创建一个新的和空的句柄表,它遍历父进程的句柄表,对于找到的包含有效的可继承句柄的每个项目,系统会将该项目准确的拷贝到子进程的句柄表中。该项目拷贝到子进程的句柄表中的位置和父进程的句柄表中的位置完全相同,标志着内核对象所有的句柄值相同。系统还要等增内核对象的使用计数,因为现在两个进程都使用该对象。
    命名对象:
    HANLDE hMutexProcessA = CreateMutex(NULL,FALSE,"JeffMutex");
    HANDLE hMutexProcessB = CreateMutex(NULL,FALSE,"JeffMutex");
    当Process B调用C r e a t e M u t e x时,系统首先要查看是否已经存在一个名字为“ J e ff M u t e x” 的内核对象。由于确实存在一个带有该名字的对象,因此内核要检查对象的类型。由于试图创建一个互斥对象,而名字为“ J e ff M u t e x”的对象也是个互斥对象,因此系统会执行一次安全检查,确定调用者是否拥有对该对象的完整的访问权。如果拥有这种访问权,系统就在 Process B的句柄表中找出一个空项目,并对该项目进行初始化,使该项目指向现有的内核对象。 如果该对象类型不匹配,或者调用者被拒绝访问,那么C r e a t e M u t e x将运行失败(返回N U L L)。当ProcessB 对CreateMutex的调用成功时,他并不实际创建一个互斥对象。ProcessB只是被赋予一个与进程有关的句柄值,用于标识内核中现有的互斥对象。当然,由于ProcessB的句柄表中的一个新项目要引用该对象,互斥对象的使用计数就会递增。在ProcessA与ProcessB同时关闭他们的对象句柄之前,该对象是不会被撤销的。
    请注意:这两个进程中的句柄值可能是不同的值。但是操作的是同一个内核对象。



















0 0
原创粉丝点击