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确保其使用的所有资源都被释放。

  • 相关阅读:
    leetcode 1. 两数之和
    leetcode 671. 二叉树中第二小的节点
    leetcode 100. 相同的树
    leetcode 110. 平衡二叉树
    leetcode 144. 二叉树的前序遍历
    1066. Root of AVL Tree (25)
    leetcode 100 相同的树
    leeCode 515 在每个树行中找最大值
    LeetCode 31.下一个排列
    面向对象UML中类关系
  • 原文地址:https://www.cnblogs.com/dyufei/p/2574013.html
Copyright © 2011-2022 走看看