zoukankan      html  css  js  c++  java
  • 第三章 内核对象(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确保其使用的所有资源都被释放。

  • 相关阅读:
    Tenserflow学习日记(13)
    Tenserflow学习日记(12)
    Tenserflow学习日记(10)
    利用file_get_contents();抓取网络上需要的信息
    laravel5.4自定义验证规则
    getimagesize();获取图片的长度与宽度
    php得到程序的执行时间
    laravel 处理图片
    siege 压力测试工具的安装与使用
    laravel 实现点赞功能
  • 原文地址:https://www.cnblogs.com/dyufei/p/2574013.html
Copyright © 2011-2022 走看看