《Windows内核安全与驱动开发》 3.1 字符串操作
《Windows内核安全与驱动开发》阅读笔记 -- 索引目录
《Windows内核安全与驱动开发》 3.1 字符串操作
一、字符串的初始化
1. 判断下列代码为什么会蓝屏?
UNICODE_STRING str = { };
wcscpy(str.Buffer, L"hello world!");
str.Length = str.MaximumLength = wcslen(L"hello world!") * sizeof(WCHAR);
2. 编写代码,将一个 UNICODE_STRING 字符串给初始化为 L"hello world"
二、字符串的拷贝
1. 将字符串src的内容拷贝到字符串dst中。
UNICODE_STRING dst;
WCHAR dst_buf[];
UNICODE_STRING src = RTL_CONSTANT_STRING(L"hello world); //
// 自己需要补充的代码
//
2. RtlCopyUnicodeString 这种静态拷贝存在什么缺点?
三、字符串连接
1. 反思下列这行代码为什么会连接失败?
UNICODE_STRING str1;
RtlInitUnicodeString(&str1, L"hello");
UNICODE_STRING str2;
RtlInitUnicodeString(&str2, L" world!!");
RtlAppendUnicodeStringToString(&str1, &str2)
2. 下列初始化操作可行么?
UNICODE_STRING str1;
RtlInitUnicodeString(&str1, L"hello");
str1.MaximumLength = * sizeof(WCHAR);
UNICODE_STRING str2;
RtlInitUnicodeString(&str2, L" world!!");
NTSTATUS res = RtlAppendUnicodeStringToString(&str1, &str2);
if (res != STATUS_BUFFER_TOO_SMALL) {
DbgPrint("%wZ\n", &str1);
}
else {
DbgPrint("超出缓冲区!\n");
}
3. 尝试将 L"hello" 与 L" world!!" 两个字符串连接在一起,并判断是否超过缓冲区(STATUS_BUFFER_TOO_SAMLL)
4. 超出缓冲区的例子:
四、字符串打印
1. 已经初始化好了一个UNICODE_STRING str1,编写代码将其输出出来。
答案
一、字符串的初始化
1. 因为 UNICODE_STRING 的成员被初始化为0,此时 str.buffer 为空指针,在内核中会引发空指针异常,引发蓝屏。
2. 编写代码,将一个 UNICODE_STRING 字符串给初始化为 L"hello world"
UNICODE_STRING str = { };
RtlInitUnicodeString(&str, L"Hello world!");
二、字符串的拷贝
1. 将字符串src的内容拷贝到字符串dst中。
RtlInitEmptyUnicodeString(&dst, dst_buf, * sizeof(WCHAR));
RtlCopyUnicodeString(&dst, &src); // 字符串拷贝
2. RtlCopyUnicodeString 这种静态拷贝存在什么缺点?
答:最大范围不能超过dst的范围,如果超过,则拷贝不会成功,并且不会给出任何提示(之后会介绍动态拷贝字符串)。
三、字符串连接
1. str1的大小只允许其容纳 "hello",而之后的即使添加进来也不会出错,但返回值会给出 NTATUS_BUFFER_TOO_SMALL 的提示。
2. 不可行,str1.MaximumLength 在初始化时确定的,其对应的内存空间的大小,这样直接修改是无效的,内存写入时引发蓝屏。
3. 尝试将 L"hello" 与 L" world!!" 两个字符串连接在一起,并判断是否超过缓冲区(STATUS_BUFFER_TOO_SAMLL)
// 将str1初始化为 "hello",并且大小为256*sizeof(WCHAR)
UNICODE_STRING str = RTL_CONSTANT_STRING(L"hello");
UNICODE_STRING str1 = { };
WCHAR str1_buf[];
RtlInitEmptyUnicodeString(&str1, str1_buf, * sizeof(WCHAR));
RtlCopyUnicodeString(&str1, &str);
// 初始化str2 = " world!!"
UNICODE_STRING str2;
RtlInitUnicodeString(&str2, L" world!!");
NTSTATUS res = RtlAppendUnicodeStringToString(&str1, &str2);
// 判断执行结果
if (res != STATUS_BUFFER_TOO_SMALL) {
DbgPrint("%wZ\n", &str1);
}
else {
DbgPrint("超出缓冲区!\n");
}
四、字符串打印
1. 已经初始化好了一个 UNICODE_STRING str1,编写代码将其输出出来
DbgPrint("%wZ\n", &str1);
《Windows内核安全与驱动开发》 3.1 字符串操作的更多相关文章
- Windows内核安全与驱动开发
这篇是计算机中Windows Mobile/Symbian类的优质预售推荐<Windows内核安全与驱动开发>. 编辑推荐 本书适合计算机安全软件从业人员.计算机相关专业院校学生以及有一定 ...
- 《windows内核安全与驱动开发》ctrl2cap中的ObReferenceObjectByName疑问
国内有关于windows内核驱动这块的书籍实在是甚少,不过好在<windows内核安全与驱动开发>这本书还算不错(内容方面),但是不得不说这本书在许多地方存在着一些细节上的问题.比如我今天 ...
- 《Windows内核安全与驱动开发》 7.1&7.2&7.3 串口的过滤
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 7.1&7.2&7.3 串口的过滤 一.设备绑定的内核API ...
- 《Windows内核安全与驱动开发》阅读笔记 -- 索引目录
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 一.内核上机指导 二.内核编程环境及其特殊性 2.1 内核编程的环境 2.2 数据类型 2.3 重要的数据结构 2.4 函数调 ...
- 《Windows内核安全与驱动开发》 2.3 重要的数据结构
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 2.3 重要的数据结构 一.驱动对象 Windows内核采用__的编程方式 ...
- 《Windows内核安全与驱动开发》 3.2 内存与链表
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 3.2 内存与链表 1. 尝试生成一个链表头并将其初始化. 2. 尝试向内存 ...
- 《Windows内核安全与驱动开发》4.1 文件操作
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发>4.1 文件操作 从 C:\a.txt 中读取一部分内容并利用 DbgPrin ...
- 《Windows内核安全与驱动开发》4.3 时间与定时器
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发>4.3 时间与定时器 一.获取自系统启动以来的毫秒数 /* 函数作用:求自操 ...
- 《Windows内核安全与驱动开发》 4.4 线程与事件
<Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 4.4 线程与事件 一.开辟一个线程,参数为(打印内容+打印次数),利用线程 ...
随机推荐
- Django学习day1——Django的简单介绍
1.了解Web基本的开发 使用Python开发Web,最简单,原始和直接的办法是使用CGI标准现在从应用角度解释它是如何工作: 首先做一个Python脚本,输出HTML代码,然后保存成.cgi扩展名的 ...
- 对pwntools生成的exp模版做了一些修改
安装pwntools后,有一些命令行的工具可以用 ~ pwn template -h usage: pwn template [-h] [--host HOST] [--port PORT] [--u ...
- CSPS模拟测试59
这场考得我心态爆炸......... 开场T1只会$n^{2}$,然后发现bfs时每个点只需要被更新一次,其他的更新都是没用的. 也就是说,我们可以只更新还没被更新的点? 于是我先YY了一个链表,发现 ...
- CSPS模拟 71
全程傻眼 T1 毛衣衬 meet_in_middle.. 不再使用二分查找,而是直接枚举对面状态,虽然底数爆炸但是指数减半,复杂度是对的. T2 猫儿嗔 逆序关系有支配关系? $DAG$树.. 把逆序 ...
- 通俗易懂了解Vue组件的通信方式
1.前言 Vue框架倡导组件化开发,力求将一个大的项目拆分成若干个小的组件,就如同我们小时玩堆积木一样,一个大房子是由若干个小积木组成.组件化开发最大问题就是组件之间数据能够流通,即组件之间能够通信. ...
- 003.Kubernetes二进制部署准备
一 前置准备 1.1 前置条件 相应的充足资源的Linux服务器: 设置相应的主机名,参考命令: hostnamectl set-hostname k8smaster Mac及UUID唯一: 若未关闭 ...
- 2019年10月13日 spss习题 wangqingchao
1.spss发行版本的说法,正确的是:B a.两年发行一个新版本 b.一年发行一个新版本 c.没有任何规律 d.三年发行一个新版本 2.哪些是spss统计分析软件的基本窗口:A a.结果查看 ...
- day5-基本数据类型总结
一.数字int(..)二.字符串replace/find/join/strip/startswith/split/upper/lower/format tempalte = "i am {n ...
- ADO.NET学习心得《一》
大家好,我是代号六零一,很高兴又开始重启博客了,为了更好的加深自己的记忆和复习,今天开始坚持写写心得体会,刚开始学习ADO.NET的时候也是一脸懵逼的,代码只有动手敲打才会知道其实并不难,只要多敲几遍 ...
- Salesforce学习之路(十)Org的命名空间
1. 命名空间的适用场景 每个组件都是命名空间的一部分,如果Org中设置了命名空间前缀,那么需使用该命名空间访问组件.否则,使用默认命名空间访问组件,系统默认的命名空间为“c”. 如果Org没有创建命 ...