Windows高级编程学习笔记(一)

写在前面的话

之前学的Windows编程都是界面啊、网络编程啊之类的纯应用层面的东西,总是感觉而自己没有达到自己期望中的水平。什么水平呢?如果让你编写监控系统资源的工具,或者DLL注入相关软件,或者底层安全软件,可以胜任吗?我的答案是,并不会。所以,离目标还很远,得继续学。

此阶段学习的是Windows高级编程,期间也了解了点内核驱动开发。后者是更深层次的研究,主要研究编写运行在ring0层的内核程序,难度更高,是达到我期望的技术水平的努力方向。现阶段还是先攻克Windows高级编程,步步为营,读书,练习,做笔记,打好基本功。

主要的参考书是:

  • 《Windows高级编程指南(第三版)》, [美] Jeffrey Richter.

好,开始今天的学习。

因为第一章说的是win32与操作系统版本之间的相关事项,所以这里略过。

第二章 内核对象

1、概念

不愧是高级编程,上来就谈内核。
这一章中主要说了,一些重要的系统资源,是通过内核对象来管理的。比如进程。进程也是通过内核对象来管理的,但是进程的数据、代码是放在用户态内存里面的。注意突出理解两个字:管理

根据我的理解,画出了下面的简单的关系示意图。主要需要明白句柄表的工作原理,系统是怎么通过句柄表来管理系统的内核对象的。这里只说学习方向,不详细解析了,书上都有。

这里写图片描述

2、使用

只能通过API来创建、释放内核对象。

内核对象通过内核句柄表来管理。应用程序中的句柄是内核对象在内核句柄表中的索引(书上说在NT中是字节数,这个没有被文档化,所以仅做理解,实际情况大差不差)。

每个内核对象有一个使用计数,也叫引用计数。多个进程使用同一个内核对象的话,每多一个使用者,使用计数+1。当进程结束时,操作系统为进程清理相关资源,挨个释放内核句柄表中的对象。很显然,这样的机制能够保证内核对象能被正确地创建、销毁,很好地对内核对象进行了管理。

如果需要进程间共享内核对象的话,有几种特定的方法。内核对象被设计成只能通过特定的方法访问,这样做是为了安全性考虑。第一章中介绍了进程间共享内核对象的几种方法:

  • 使用继承,需要向子进程传递句柄值(进程间通信),特点是句柄值是相同的。
  • 使用命名的对象。特点是句柄值是独立的。
  • 使用duplicateHandle,有特定的使用情景(需要多种已知条件),并不是更简单的方法。

先大致了解原理,用到的时候,知道找什么代码就行了。

另外需要提到的是安全描述符。刚开始看到这个东西,不知道它是用来干嘛的,看起来很烦(不知道你面对一串不知含义的参数还有没有看下去的欲望)。看了其他的书籍后,消化了一段时间,现在是明白了它的用处。前面提到,内核对象的访问是很注重安全性的。使用安全描述符就是内核对象的创建者用来告诉操作系统,我创建的这个东西谁能用,能怎么用(读写等)。原理就是这么简单。

本章末尾那个实例说明了,duplicateHandle可以用于进程自己给自己复制句柄,这两个不同的句柄指向同一个内核对象。使用情景是多线程中需要使用同一个内核对象,如何正确关闭句柄。

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

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

相关文章

【转】1.5异步编程:.NET4.X 数据并行

任务并行库 (TPL) 是 .NET Framework 4的 System.Threading 和 System.Threading.Tasks 命名空间中的一组公共类型和 API。TPL的目的在于简化向应用程序中添加并行性和并发性的过程,从而提高开发人员的工作效率。TPL会动态地按比例调节并发程度,以便最有…

idea全局搜索搜不全的BUG

搜不全真是坑坏我了,修改业务后,差点就卷铺盖走人了… 修改配置 打开help -> Find Action 输入registry后搜索(点击框内任意一行后,直接输入就是搜索) page.size 将100的值改大,一步到位100000

【转】1.6异步编程:IAsyncResult异步编程模型 (APM)

传送门:异步编程系列目录…… 大部分开发人员,在开发多线程应用程序时,都是使用ThreadPool的QueueUserWorkItem方法来发起一次简单的异步操作。然而,这个技术存在许多限制。最大的问题是没有一个内建的机制让你知道操作在什么时候…

Spark worker内存不足导致任务失败,报错Likely due to containers exceeding thresholds, or network issues

报错: Lost executor 33 on xx.xx.xx.152: Remote RPC client disassociated. Likely due to containers exceeding thresholds, or network issues. Check driver logs for WARN messages. 原因: 由于spark某节点可用内存不足导致整个任务失败,在执行…

【转】1.7异步编程:基于事件的异步编程模式(EAP)

传送门:异步编程系列目录…… 上一篇,我给大家介绍了“.NET1.0 IAsyncResult异步编程模型(APM)”,通过Begin*** 开启操作并返回IAsyncResult对象,使用 End*** 方法来结束操作,通过回调方法来做异步操作后其它事项。然…

【转】1.8异步编程:.NET 4.5 基于任务的异步编程模型(TAP)

传送门:异步编程系列目录…… 最近我为大家陆续介绍了“IAsyncResult异步编程模型 (APM)”和“基于事件的异步编程模式(EAP)”两种异步编程模型。在.NET4.0 中Microsoft又为我们引入了新的异步编程模型“基于任务的异步编程模型(TAP)”,并且推荐我们在开…

Qt: 找不到Qt5Widgets.lib

在静态编译的时候,提示错误: error: dependent ‘D:\IDE\Qt\5.4.2-mingw32-rel-static\5.4.2-mingw32-rel-static\lib\Qt5Widgets.lib 去目录下看了下,全部是libxxxxx.a文件,是linux的库文件。但是之前编译是正常的,这…

python3读写excel文件_python3 循环读取excel文件并写入json操作

文件内容:excel内容:代码: import xlrd import json import operator def read_xlsx(filename): # 打开excel文件 data1 xlrd.open_workbook(filename) # 读取第一个工作表 table data1.sheets()[0] # 统计行数 n_rows table.nrows data …

Qt:error LNK2038: 检测到“_MSC_VER”的不匹配项: 值“1600”不匹配值“1800

Visual Studio 2013生成Qt项目时报错。网上搜说是更改平台工具集,试了没用。退一步说我就是需要使用vs2013,改成其他的会不符合项目需求。于是打开了项目文件.sln,如下: 才发现目标工程的Qt版本是5.7.0,vs2013里面设置…

JAVA程序绑定到指定的CPU核上

由于服务器上某几个核被C程序绑定了&#xff0c;我们的java程序有的线程会使用到&#xff0c;导致C程序丢包异常&#xff0c;所以需要将JAVA程序绑定到指定的CPU核上 1.命令介绍 1.taskset命令 taskset -c <cpu核编号> <pid> #可以指定进程绑定到哪个cpu核上2.t…

【转】URN_URI_URL详解

URI&#xff0c;Uniform Resource Identifier&#xff0c;统一资源标识符。 URN&#xff0c;Uniform Resource Name&#xff0c;统一资源命名 URL&#xff0c;Uniform Resource Location&#xff0c;统一资源定位符。 URI 简单来理解就是标识/定义了一个资源&#xff0c;而 URL…

彻底弄懂Qt的编码(汉字乱码问题及相关函数作用)

测试1 新建test工程用于测试&#xff0c;main.c文件内容如下&#xff1a; #include <QCoreApplication> #include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QString str_hanzi("百度"); // 汉字QString str_ascii(&…

【转】1.9 Asp.Net Core 轻松学-多线程之取消令牌(

目录 前言1. 多线程请求合并数据源2. 对长时间阻塞调用的异步取消令牌应用3. CancellationToken 的链式反应4. CancellationToken 令牌取消的三种方式结束语示例代码下载前言 取消令牌(CancellationToken) 是 .Net Core 中的一项重要功能&#xff0c;正确并合理的使用 Cancell…

python怎么改背景_python IDE背景怎么改

首先&#xff0c;在已经下载好的python文件目录下&#xff0c;找到config-highlight.def文件&#xff0c;我的是在H:\python\python3**\Lib\idlelib**文件夹下。 打开文件后&#xff0c;你会看到一些默认的颜色配置&#xff0c;比如经典的颜色配置就是白色背景&#xff0c;一般…

QML程序发布时无法正常运行的解决办法

1、运行依赖 以我的一个项目为例&#xff0c;此程序使用QQuickWidget将QWidget和QML结合。程序debug版发布时依赖的库如下&#xff1a; 大部分dll可以在Visual Studio中调试时的控制台中看出已加载的dll&#xff0c;只需到Qt安装目录下找到对应的dll即可。但是某些dll并没有提…

【转】UML基础: 第1部分 - 类图 (Class Diagram)

类图 类图是一个静态图。它代表了应用程序的静态视图。类图不仅用于可视化&#xff0c;描述和记录系统的不同方面&#xff0c;还用于构建软件应用程序的可执行代码。 类图描述了一个类的属性和操作&#xff0c;以及对系统施加的约束。类图被广泛用于面向对象系统的建模&#…

int转换为cstring_PostgreSQL 隐式类型转换探秘

个人简介何小栋&#xff0c; 从事产品研发和架构设计工作&#xff0c;对Oracle、PostgreSQL有深入研究&#xff0c;ITPUB数据库版块资深版主。现就职于广州云图数据技术有限公司&#xff0c;系统架构师&#xff0c;博客&#xff1a;http://blog.itpub.net/6906/摘要本文通过与O…

【转】UML基础: 第 2 部分 - 对象图 (Object Diagram)

对象图是从类图派生的&#xff0c;因此对象图依赖于类图。 对象图表示类图的一个实例。类图和对象图的基本概念是相似的。对象图也表示系统的静态视图&#xff0c;但这个静态视图是系统在特定时刻的快照。 对象图用于呈现一组对象及其关系作为实例。 对象图的目的 图表的目…

外部依赖项很多未定义标识符_从日本编程书籍《我的第一本编程书》中译版看中文例程如何扬长避短——标识符(一)

日本作者平山尚在前言归结了本书的三点独特之处&#xff1a;从始至终只编写一个程序&#xff08;俄罗斯方块游戏&#xff09;使用专门的工具绝对面向首次接触程序的人群第一点&#xff0c;优势是一个项目主体贯穿全书&#xff0c;但同时很考验编排顺序&#xff0c;以及技术覆盖…

Qt: QTableView如何获取(行)选中、行切换信息

**情景&#xff1a;**做一个信息表格&#xff0c;需要多个Model切换&#xff0c;必须用QTableView&#xff0c;而不能用QTableWidget&#xff0c;因为后者不可以进行setModel()。 方案&#xff1a; QTableView和选择有关的的信号有&#xff1a; void activated(const QModelI…