Windows句柄与内核对象

内核对象

基本概念

例如,访问令牌,事件对象,文件对象,文件映射对象,I/O完成端口对象,作业对象,邮件槽对象,互斥量对象,管道,进程对象,信号量对象,线程对象,可等待计时器对象,线程池工厂

这些对象是通过不同名称的函数创建的

每个内核对象都是一个内存块,成员维护着与对象相关的信息

内核对象只能由操作系统内核访问

利用Windows提供的一组函数,这组函数会以最恰当的方式来操纵这些结构

句柄

调用一个会创建内核对象的函数后,函数会返回一个句柄(handle),它标识了所创建的对象

可以把这个句柄想象成一个不透明(opaque)的值,它可由进程中的任意线程使用

在32位Windows进程中,句柄是一个32位值,在64位Windows进程中,句柄是64位值

句柄是与进程相关的,将句柄传给另一个进程中的线程,那么另一个进程用我们的进程的句柄值来发出调用时,可能会失败

使用计数

指明多少个进程正在使用同一个内核对象

内核对象的安全性 

内核对象可以用一个安全描述符(security descriptor,SD)来保护,描述了谁拥有对象

进程内核对象句柄表

一个进程在初始化时,系统将为它分配一个句柄表,这个句柄表仅供内核对象使用,不适用于用户对象或GDI对象

每个结构都包含指向一个内核对象的指针,一个访问掩码和一些标志

索引指向内核对象内存块的指针访问掩码(包含标志位的一个DWORD)标志
10x???0x???0x???
20x???0x???0x???
............

创建一个内核对象

一个进程在初始化的时候,其句柄表为空。当进程内的一个线程调用一个会创建内核对象的函数时,内核将为这个对象分配并初始化一个内存块。然后,内核扫描进程的句柄表,查找一个空白的记录项,对其进行初始化。

用于创建内核对象的任何函数都会返回一个与进程相关的句柄,这个句柄可由同一个进程中运行的所有线程使用。创建内核对象的函数有CreateThread,CreateFile,CreateFileMapping,CreateSemaphore

调用一个函数时,如果它接受一个内核对象句柄作为参数,就必须把Create*函数的返回值传给它,该函数会查找该进程的句柄表,获得目标内核对象的地址,然后以一种恰当的方式来操纵对象的数据结构。

关闭内核对象

无论以什么方式创建内核对象,关闭内核对象的API为

BOOL CloseHandle(HANDLE hobject);

函数会验证传给函数的句柄值标识是进程有权访问的一个对象,如果句柄有效,系统就会获得内核对象的数据结构地址,并将结合中的“使用记数”减一

跨进程边界共享内核对象

使用对象句柄继承

只有在进程之间有一个父—子关系的时候,才可以使用对象句柄继承

父进程决定生成一个子进程,并允许子进程访问父进程的内核对象。

执行步骤:

1.父进程创建一个内核对象时,父进程必须向系统指出他希望这个对象句柄是可以继承的(父进程必须分配并初始化一个SECURITY_ATTRIBUTES,并将这个结构的地址传给具体的Create函数)

SECURITY_ATTRIBUTES sa;
sa.nLength=sizeof(sa);
sa.lpSecurityDescriptor=NULL;
sa.bInheritHandle=TRUE;HANDLE hMutex=CreateMutex(&sa,FALSE,NULL);

创建了一个SECURITY_ATTRIBUTES结构,表明对象要用默认安全性来创建,而且返回的句柄是可以继承的

此时句柄表中的是否可以继承的标志位被设置为1

2.创建子进程

使用CreateProcess函数来完成

将参数bInheritHandle设置为TRUE,就会继承父进程中可继承的句柄

改变句柄的标志

父进程创建了一个内核对象,得到了一个可继承的句柄,然后生成了两个子进程。但是,父进程只希望其中一个子进程继承内核对象的句柄。

使用SetHandleInformation函数来改变内核对象的继承标志。

BOOL SetHandleInformation(HANDLE hObject,DWORD dwMask,DWORD dwFlags);

dwMask告诉函数我们要更改哪个或者哪些标志

如果想把每个对象的标志一次性更改完毕,可以对这两个标志执行一次按位或运算。

我么可以用GetHandleInformation来检查一下一个句柄是否可以被继承

DWORD dwFlags;
GetHandleInformation(hObj,&dwFlags);
BOOL fHandleIsInheritable=(0!=(dwflags&HANDLE_FLAG_INHERIT);

为对象命名

许多内核对象都可以进行命名

HANDLE CreateMutex(PSECURITY_ATTRIBUTES psa,BOOL bInitialOwner,PCTSTR pszName);

很多函数最后一个参数都是pszName,向此参数传入NULL,相当于向系统表明我们要创建一个未命名的内核对象,微软没有提供任何专门的机制来保证内核对象的名称是唯一的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/221899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Disruptor详解,Java高性能内存队列最优解

文章目录 一、Disruptor介绍1、为什么要有Disruptor2、Disruptor介绍3、Disruptor的高性能设计4、RingBuffer数据结构5、等待策略6、Disruptor在日志框架中的应用7、术语 二、Disruptor实战1、引入依赖2、Disruptor构造器3、入门实例(1)Hello World&…

浮动的魅力与挑战:如何在前端设计中巧妙运用浮动(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

SpringBoot的Starter自动化配置,自己编写配置maven依赖且使用及短信发送案例

目录 一、Starter机制 1. 是什么 2. 有什么用 3. 应用场景 二、短信发送案例 1. 创建 2. 配置 3. 编写 4. 形成依赖 6. 其他项目的使用 每篇一获 一、Starter机制 1. 是什么 SpringBoot中的starter是一种非常重要的机制(自动化配置),能够抛弃以前繁杂…

SD-WAN解决外贸企业网络问题

为了获取全球客户,占领更多的市场,越来越多的外贸企业出现。外贸企业在发展业务的过程中会遇到很多困难,海外网络访问问题就是其中之一。目前该问题主要有三种解决方案:VPN、MPLS专线以及SD-WAN专线。 VPN通过在公网上面建立专用网…

什么是LAMP和LNMP?它们有何区别?

LAMP 和 LNMP 是两种常见的 Web 服务器架构,它们分别代表了 Linux、Apache/Nginx、MySQL、PHP/Python/Perl 或类似技术的首字母。它们是构建 Web 应用程序和托管动态网站的标准架构。以下是它们的定义和主要区别: LAMP 架构: Linux&#xff…

WPF-UI HandyControl 简单介绍

文章目录 前言我的网易云专栏和Gitee仓库HandyControlHandyControl示例相关资源地址 我的运行环境快速开始和Material Design功能对比手风琴右键菜单自动补充滚动条轮播图消息通知步骤条托盘按钮 结尾 前言 最近我在研究如何使用WPF做一个比较完整的项目,然后我就先…

python的time模块中几个关于时间的方法

1、time.time():time.time()的返回值是一个跨平台的、标准化的时间格式,可以直接用于时间戳的计算和比较。返回值是一个带有小数的浮点数,表示1970年1月1日以来的秒数。 import timeprint(time.time()) time.sleep(1) print(time.time())# 1702557555.…

javaweb搭配ajax和json

ajax一般用来前端界面与后端界面交互使用。数据格式一般使用json&#xff0c;优点是便于对象与字符串的转化。 1.不适用json对象封装。 jsp: <script>$.ajax({url: "/LoginServlet",data: {"name":name, "pwd":password},dataType: &qu…

SLAM学习——相机模型(针孔+鱼眼)

针孔相机模型 针孔相机模型是很常用&#xff0c;而且有效的模型&#xff0c;它描述了一束光线通过针孔之后&#xff0c;在针孔背面投影成像的关系&#xff0c;基于针孔的投影过程可以通过针孔和畸变两个模型来描述。 模型中有四个坐标系&#xff0c;分别为world&#xff0c;c…

MySQL和Minio数据备份

文章目录 一、MySQL数据备份1. MySQL客户端2. 数据增量备份3. 数据增量还原4. 数据全量备份5. 数据全量还原 二、Minio数据备份1. Minio客户端2. 数据备份3. 数据还原 三、其他参考1. 设置定时备份2. 数据拷贝到其他服务器3. MySQL其他语句 一、MySQL数据备份 Linux环境&#…

初识GroovyShell

文章目录 前言一、GroovyShell二、maven三、解决方案四、关键代码4.1 数据库配置表(pg)4.2 入参4.3 分页查询 总结 前言 项目背景&#xff1a;查询多个表的数据列表和详情&#xff0c;但不想创建过多的po、dao、resp等项目文件。 一、GroovyShell Apache Groovy是一种强大的…

Windows下使用CMake编译lua

Lua 是一个功能强大、高效、轻量级、可嵌入的脚本语言。它支持程序编程、面向对象程序设计、函数式编程、数据驱动编程和数据描述。 Lua的官方网站上只提供了源码&#xff0c;需要使用Make进行编译&#xff0c;具体的编译方法为 curl -R -O http://www.lua.org/ftp/lua-5.4.6.…

中兴 H108NS 路由器 tools_admin.asp权限绕过漏洞复现

0x01 产品简介 中兴H108NS路由器是一款集WiFi管理、路由分配、动态获取上网连接等功能于一体的路由器产品。 0x02 漏洞概述 中兴H108NS路由器tools_admin.asp接口处存在身份认证绕过漏洞,攻击者可利用该漏洞绕过身份认证允许访问路由器的管理面板修改管理员密码,获取用户的…

虾皮选品网:如何使用虾皮选品数据软件提升您的选品策略

在虾皮&#xff08;Shopee&#xff09;平台上进行选品时&#xff0c;了解市场趋势、竞争程度和产品潜力是非常重要的。为了帮助卖家更好地分析虾皮市场&#xff0c;并为选品和运营策略提供有力支持&#xff0c;有一些数据软件和工具可以派上用场。本文将介绍一些建议使用的虾皮…

HPM5300系列--第二篇 Visual Studio Code开发环境以及多种调试器调试模式

一、目的 在博文《HPM5300系列--第一篇 命令行开发调试环境搭建》、《HPM6750系列--第四篇 搭建Visual Studio Code开发调试环境》中我们介绍了命令行方式开发环境&#xff0c;也介绍了HPM6750evkmini开发板如何使用Visual Studio Code进行开发调试&#xff08;其中调试方式使用…

Power BI - 5分钟学习增加条件列

每天5分钟&#xff0c;今天介绍Power BI增加条件列。 什么是增加条件列&#xff1f; 简单理解&#xff0c;可以根据表中某列设置一个或者多个条件&#xff0c;判定的结果会生成一个新列。 举例&#xff1a; 首先&#xff0c;导入一张【Sales】样例表(Excel数据源导入请参考每…

Java构建线程的方式

1. 继承Thread类 通过创建一个继承自Thread类的子类&#xff0c;然后覆盖run()方法来定义线程的执行逻辑。 class MyThread extends Thread {public void run() {// 线程执行的代码System.out.println("Thread is running");} }public class Main {public static v…

【C++】POCO学习总结(十六):随机数、密码、时间戳、日期和时间(格式化与解析)、时区、本地时间

【C】郭老二博文之&#xff1a;C目录 1、Poco::Random 随机数 1.1 说明 POCO包括一个伪随机数生成器(PRNG)&#xff0c;使用非线性加性反馈算法&#xff0c;具有256位状态信息和长达269的周期。 PRNG可以生成31位的伪随机数。 它可以生成UInt32, char, bool, float和double…

深入理解C语言的函数参数

1、一个简单的函数 int Add(int x, int y) {return x y; }int main() {printf("%d", Add(2, 3, 4, 5, 6));return 0; } 这一段足够简单的代码&#xff0c;闭眼都能知道运行结果会在屏幕上打印 5 。那编译器是怎么处理后面的 4、5、6 &#xff1f; 我们再看看这个函…

前端已死?别低估前端,他是互联网世界的核心!【这是一篇治愈系文章】

文章目录 &#x1f4a5; AI回答&#x1f98b; 现状&#x1f989; 焦虑&#x1f409; 力量&#x1f985; 观点&#x1f423; 粗浅分析&#x1f9a5; 快乐的韭菜&#x1f3c6; 总结 &#x1f4a5; AI回答 前端已死&#xff1f; ai的答案是这样: 前端并没有死掉&#xff0c;它仍然…