《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 字符串操作的更多相关文章

  1. Windows内核安全与驱动开发

    这篇是计算机中Windows Mobile/Symbian类的优质预售推荐<Windows内核安全与驱动开发>. 编辑推荐 本书适合计算机安全软件从业人员.计算机相关专业院校学生以及有一定 ...

  2. 《windows内核安全与驱动开发》ctrl2cap中的ObReferenceObjectByName疑问

    国内有关于windows内核驱动这块的书籍实在是甚少,不过好在<windows内核安全与驱动开发>这本书还算不错(内容方面),但是不得不说这本书在许多地方存在着一些细节上的问题.比如我今天 ...

  3. 《Windows内核安全与驱动开发》 7.1&7.2&7.3 串口的过滤

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 7.1&7.2&7.3 串口的过滤 一.设备绑定的内核API ...

  4. 《Windows内核安全与驱动开发》阅读笔记 -- 索引目录

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 一.内核上机指导 二.内核编程环境及其特殊性 2.1 内核编程的环境 2.2 数据类型 2.3 重要的数据结构 2.4 函数调 ...

  5. 《Windows内核安全与驱动开发》 2.3 重要的数据结构

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 2.3 重要的数据结构 一.驱动对象  Windows内核采用__的编程方式 ...

  6. 《Windows内核安全与驱动开发》 3.2 内存与链表

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 3.2 内存与链表 1. 尝试生成一个链表头并将其初始化. 2. 尝试向内存 ...

  7. 《Windows内核安全与驱动开发》4.1 文件操作

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发>4.1 文件操作 从 C:\a.txt 中读取一部分内容并利用 DbgPrin ...

  8. 《Windows内核安全与驱动开发》4.3 时间与定时器

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发>4.3  时间与定时器 一.获取自系统启动以来的毫秒数 /* 函数作用:求自操 ...

  9. 《Windows内核安全与驱动开发》 4.4 线程与事件

    <Windows内核安全与驱动开发>阅读笔记 -- 索引目录 <Windows内核安全与驱动开发> 4.4 线程与事件 一.开辟一个线程,参数为(打印内容+打印次数),利用线程 ...

随机推荐

  1. CSPS模拟 85

    WWB大佬的bitset映射真是太强了! %%% T1 观察样例,猜规律. T2 对题目的翻译工作用了很长时间 翻译错了好几次.. 观察到奇环没法染色,选的边必须把奇环弄断 如果在偶环上,偶环就变得没 ...

  2. NOIP模拟 6

    考试时看了看T1,觉得是结论题,推了推没有成果,跑去看第二题, 题意很明确,求过定点的最小环,还没思考解题策略,然后觉得是水题 打了个tarjan找边双(据说会炸但是平均表现良好),在边双里暴力拆边找 ...

  3. 命运Ⅰ&命运Ⅱ

    upd:为啥下面的相关博文都是各种退役记(这TM怎么就相关了) 竟然被卡线了,16名,我这几次考试也是炸到了一定境界了... 前三次模拟总榜rk1,第一次分机房rk4,第二次分机房rk11,第三次分机 ...

  4. 使用Typescript重构axios(七)——实现基础功能:处理响应header

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  5. Android Drawable 简析

    Drawable 是开发中经常用到的一个概念,我们经常用它去设置 View 的背景,背景可以一个颜色值,也可以是一张资源图片,还可以是一个自定义的 Drawable等等.这篇文章就简单说下 Drawa ...

  6. python使用openpyxl操作excel总结

    安装openpyxl pip install openpyxl 简单示例 from openpyxl import Workbook #创建一个工作薄对象,也就是创建一个excel文档 wb = Wo ...

  7. Zabbix日志监控插件

    #!/usr/bin/env python # coding:utf-8 import re import os import sys import logging logging.basicConf ...

  8. 红帽7.4(RHCE7.4)磁盘扩容详细步骤

    参照博文VMware虚拟机CentOS 7 磁盘扩容:https://www.linuxidc.com/Linux/2019-04/158346.htm 01.虚拟机扩容磁盘.如下图 02.使用roo ...

  9. .net 上传文件:超过了最大请求长度

    修改 web.config: 该方法是.net框架限制 添加: <system.web> ... ... <httpRuntime   ... maxRequestLength=&q ...

  10. 使用Android Studio进行ndk开发的准备

    1. gradle-ex2. ndk开发包3. 项目目录结构4. lldb调试器 1. 一般来说gradle不是必需的,gradle也是可以进行ndk编译的,然而你需要在编译时使用更多(多于一个)c+ ...