• 第三章 内核对象(1)


     

    进程的内核对象与句柄表

    当进程初始化时系统为他分配一张句柄表,该句柄表只能用于内核对象而不能用于用户和GDI对象。

    1. 创建内核对象

    当进程首次初始化时句柄表还是空的,当进程中的某一线程调用了创建内核对象的函数时,内核就为该对象分配一块内存,并且初始化它。然后内核扫描进程句柄表,寻找一个空白项,进行初始化。

    所有创建内核对象的函数都返回一个与进程相关的句柄,它能被所有运行在该进程中的线程正确的使用。

    当调用接受核心对象句柄作为参数的WIN32函数时,要传递由某个Create *函数返回的值。在内部函数将查找进程句柄表来得到想要操作的内核对象的地址,然后用定义良好的方式来操作该对象的数据结构。

    句柄值是进程相关的,不能被别的进程正确的使用。如果创建内核对象的函数失败了,则返回的句柄值通常时0NULL),也有返回-1INVALID_HANDLE_VALUECreate File 没能打开文件时返回-1。只有在调用Create File时才能把返回值同INVALID_HANDLE_VALUE比较

    1. 关闭内核对象

    不管内核对象时如何创建的,都是通过Close Handle来告诉系统已经完成了对对象的操作。

    BOOL Close HandleHANDLE hobj

    该函数首先检查调用进程的句柄表,来确认进程是否对传递的句柄所指的对象有访问权,

    A:如果传递的是无效句柄函数返回FALSEGet Last Error 返回 ERROR INVALID_HANDLE

    B:如果索引时有效的,系统将得到内核对象的数据结构的地址,把结构中的使用计数成员减1;如果计数变为0,内核将从内存中释放该内核对象。计数还未减到0则不会释放。

    Close Handle返回之前,它清除了在进程句柄表中所占的表项(该句柄无效不能再访问它,无论内核对象释放与否都要进行清除)。如果忘记调用Close Handle函数,可能会发生资源泄露。进程终结时OS确保其使用的所有资源都被释放。

  • 相关阅读:
    js ++i和i++的区别
    js斐波那契数列
    js二分查找算法
    js查找、自组织数据
    查找数组最小值、最大值
    CSS布局(圣杯、双飞翼、flex)
    碰撞检测实现
    ECharts注释
    购物查看放大
    动手封装一个滚轮事件吧!
  • 原文地址:https://www.cnblogs.com/dyufei/p/2574013.html
Copyright © 2020-2023  润新知