句柄表和继承

作者: Asura_Luo | 来源:发表于2018-05-04 02:37 被阅读0次

句柄表和继承

image

句柄代表着备操作的对象

句柄的本质(handler)

句柄表可以看做一个非常大的机构体数组
句柄表的结构

image

索引值: 进程通过索引找到句柄表中对应的选项
内核对象地址: 通过地址直接找到对应的内核对象
访问掩码: 控制了访问权限
标志位: 标志改句柄能否被继承

句柄表是如何工作的:

每个进程的内核对象,都有一个句柄与之对应
操作对应进程,需要获得进程句柄。通过系统api操作

比如A要操作B进程
A会在A的句柄表中空白的位置存储B的内核地址,返回索引值 就是句柄
当操作B进程的时候 就使用句柄调用系统api操作B进程

类似于的 如果有C、D等进程和A进程一起操作B进程的话,这样一来 C.D自己的句柄表中都会存储B的内核对象地址。这么一来就带来一个问题
如果A C D 同时访问B的资源,突然间B的内核对象被销毁释放了,那么A C D三个都会出错

为了缓解此类错误,windows操作系统使用了内核对象使用计数机制:

内核对象的使用计数:

每一个内核对象都有一个使用计数的属性
每当内核对象被获得过一次,此内核对象的使用计数就会+1
当其他句柄中此内核对象的句柄销毁时,此内核对象并不会被销毁,而是使用计数-1
当内核对象的使用计数为0 的时候 就说明此时并没有其他地方再使用此内核对象了,此时内核对象就会被销毁

//销毁句柄 内核计数-1
BOOL CloseHandle
(
    HANDLE hObject //关闭的目标句柄
)

句柄的继承关系

当父进程创建子进程的时候,父进程标志位为0的,表示此条索引(句柄)不想被子进程继承

image image
BOOL CreateProcess(
  LPCTSTR lpApplicationName,                // 路径
  LPTSTR lpCommandLine,                      // 命令行
  LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程安全属性
  LPSECURITY_ATTRIBUTES lpThreadAttributes,  // 线程安全属性
  BOOL bInheritHandles,                        // 继承标志位
  DWORD dwCreationFlags,                    // 创建标志
  LPVOID lpEnvironment,                        // 环境块
  LPCTSTR lpCurrentDirectory,                // 驱动目录
  LPSTARTUPINFO lpStartupInfo,            // 启动信息
  LPPROCESS_INFORMATION lpProcessInformation // 进程信息
);

进程标志位参数 BOOL bInheritHandles
表示了新进程(子进程)是否继承父进程句柄表中的句柄,如果为true,那么就继承父句柄表中可被继承的句柄,并且继承的句柄具有和原始句柄相同的值和访问权限

进程安全属性和线程安全属性 参数,决定是否可以由子进程(线程)继承返回的句柄。如果是NULL 则表示不能被继承

//安全属性

SECURITY_ATTRIBUTE
{
    DWORD  nLength;  //结构体宽度
    LPVOID lpSecurityDescriptor;//安全描述符
    BOOL   bInheritHandle;//被创建的句柄能否被继承
} 

//安全描述符:决定了用户的访问权限,可以由他指定哪些用  户可以访问,以及一些访问权限,一般填NULL
//句柄继承选项:决定了被创建的对象的句柄是否是可以被继  承的

相关文章

  • 句柄表和继承

    句柄表和继承 句柄代表着备操作的对象 句柄的本质(handler) 句柄表可以看做一个非常大的机构体数组句柄表的结...

  • 共享内核对象

    使用对象句柄继承 进程之间的继承。 父进程指定对象句柄可以继承,把SECURUTY_ATTRIBUTES的bInh...

  • java

    句柄 参考 java句柄 什么是句柄句柄(Handle)来标示应用程序中不同的对象和同类中不同的实例注意:句柄有人...

  • windows文件句柄和句柄

    1、文件句柄: 在文件I/O中,要從一個文件讀取數據,應用程序首先要調用操作系統函數並傳送文件名,並選一個到該文件...

  • Perl语言学习(八)Perl文件操作

    八、Perl文件操作 1、Perl句柄 句柄的定义Perl通过句柄和“外面”的世界连接句柄是一个顺序号,对于打开的...

  • 06.Perl -- 文件操作

    Perl 句柄 句柄的定义 Perl通过句柄和“外面”的世界连接 句柄是一个顺序号,对于打开的文件是唯一的识别依据...

  • 寻找Windows系统文件簇号

    句柄: 在windows中,句柄是和对象一一对应的32位无符号整数值。对象可以映射到唯一的句柄,句柄也可以映射到唯...

  • 2017 09 25

    Windows编程基础 基础知识了解 句柄: 资源的标识 操作系统通过句柄l来管理和操作资源 图标句柄(HICON...

  • 9、表继承、临时表、表分区和表存储属性

    这一章节里继续讨论表的内容,毕竟后面再高深的内容都是建立在处理表数据的基础之上的。 表继承 表继承其实是属于表创建...

  • Discuz!X/数据库 DB:: 函数操作方法

    DB::table($tablename)获取正确带前缀的表名,转换数据库句柄, DB::delete($tabl...

网友评论

    本文标题:句柄表和继承

    本文链接:https://www.haomeiwen.com/subject/mgyrrftx.html