本文将从最简单的rtl例程函数讲解不同IRQL的真正原因,其他IRQL类似。

RtlCopyUnicodeString和RtlEqualUnicodeString看起来同属于rtl支持字符串例程,实际上它们可运行的IRQL还是不同的。这也许很不可思议,通过源代码解开其中的秘密。

二者IRQL不同

RtlCopyUnicodeString

RtlEqualUnicodeString

官方注解

NTSYSAPI VOID RtlCopyUnicodeString([in, out]      PUNICODE_STRING  DestinationString,[in, optional] PCUNICODE_STRING SourceString
);

>   1. Src是optional, 如果为NULL, 那么只需要把Dest的Length设置为0即可。

2. 不管Src有多长,Dest的MaximumLength和Buffer都不会被改变。

3. 和普通String或Memory copy类似,拷贝长度不会超过Src和Dest的MaximumLength.

4. 最重要的一点,它指出,如果是DPC Level, Src和Dest都必须是非分页内存。当然,也 暗示了如果是DPC Level以下,Src和Dest可以是分页内存。

NTSYSAPI BOOLEAN RtlEqualUnicodeString([in] PCUNICODE_STRING String1,[in] PCUNICODE_STRING String2,[in] BOOLEAN          CaseInSensitive
);

源代码解析

  • Src如果为空,直接设置Dest长度为0.

  • ASSERT_WELL_FORMED_UNICODE_STRING_IN检测字符长度是2的倍数。

  • 判断Src的长度如果大于Dest的最大长度,选择较小的那个。

  • RtlCopyMemory执行真正的拷贝动作。

    • RtlCopyMemory是宏,不是函数。

      • 此处memcpy是内核的,和C语言libc的实现类似,一般为汇编优化。

        • 源代码赏析请参见:Windows内核--内核汇编代码赏析: Rtl memory系列函数(3.3.1)

  • 如果Dest的Length加上末尾的UNICODE_NULL不超过MaximumLength, 加上UNICODE_NULL.

  • 最后ASSERT_WELL_FORMED_UNICODE_STRING_OUT再次判断Dest的MaximumLength是2的倍数且Length不超过MaximumLength.

总结一下,源代码的实现和如上官方文档完全对上。因为函数会直接操作Src和Dest内存,和官方解释第四条对上: 把责任推给了调用者。

RtlEqualUnicodeString 调用RTL_PAGED_CODE(PAGED_CODE)

此约束保证只能在PASSIVE_LEVEL执行。

看起来功能就是普通比较字符串或内存是否相等,并不复杂的样子,为什么内核要约束它只能在PASSIVE_LEVEL执行呢?

如果是大小写敏感,调用NLS_UPCASE.

Nls844UnicodeUpcaseTable变量被定义成分页内存的数据!! 这才是导致

RtlEqualUnicodeString为什么必须在PASSIVE_LEVEL的根本原因。

内核为什么要用不同IRQL?

对于ASCII码表,很小,几百字节,UNICODE表会大很多。内核不希望UNICODE表一直占用常驻内存,会降低可用内存,设计成可分页内存可节省内存开支。

当然,对于String操作例程,还有很多,都可以通过源代码了解官网对应内核API的解释。

Windows内核--Rtl字符串API “不同IRQL“(3.2)相关推荐

  1. Windows内核实验004 API调用

    文章目录 完善代码 内核API调用 修复一个潜在问题 复现问题 完整代码 前面几次实验我们已经完成了一个三环的程序调用零环API的必要条件. 提升到零环权限 使fs指向KPCR 完善代码 这次我们去掉 ...

  2. Windows内核API HOOK 之 Inline Hook

    来源:CSDN   作者:daiwen 名字起得好,Inline hook,乍一听,似乎很高深.此处的Inline,我以为,意指将汇编代码直接写入内核API的内存区域.Inline Hook不像用户态 ...

  3. Windows驱动开发-_驱动对象学习和内核处理字符串初步

    新建一个c文件:myhellostr.c: #include <ntddk.h>VOID DriverUnload(PDRIVER_OBJECT driver) {DbgPrint(&qu ...

  4. windows 内核函数前缀解析

    <Windows内核情景分析–采用开源代码ReactOS(上.下册)>本书通过分析ReactOS的源代码介绍了Windows内核各个方面的结构.功能.算法与具体实现.本小节为大家介绍Win ...

  5. 2、从汇编语言到Windows内核编程笔记(2)

    内核线程 在驱动中生成的线程一般是系统线程.系统线程所在的进程名为"System". NTSTATUS PsCreateSystemThread( OUT PHANDLE Thre ...

  6. Windows 内核数据结构学习总结

    <Windows内核编程>---基本数据结构 驱动对象: 每个驱动程序都会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载时被内核中的对象管理程序所创建的.驱动对象用 DRIVER_ ...

  7. 详述欺骗性断言如何引发严重的 Windows 内核漏洞 (CVE-2020-0792)

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 2019年11月,微软发布软件更新,其中对 Windows 内核驱动 win32kfull.sys 的一个小的代码修改引发了一个严重漏 ...

  8. 寒江独钓:Windows内核安全编程(china-pub到货首发)

    寒江独钓:Windows内核安全编程(china-pub到货首发) [作 者]谭文;杨潇;邵坚磊等 [丛 书 名] 驱网核心技术丛书  [出 版 社] 电子工业出版社     [书 号] 978712 ...

  9. windows内核开发学习笔记十五:IRP结构

    windows内核开发学习笔记十五:IRP结构   IRP(I/O Request Package)在windows内核中,有一种系统组件--IRP,即输入输出请求包.当上层应用程序需要访问底层输入输 ...

最新文章

  1. 【做题】SRM701 Div1 Hard - FibonacciStringSum——数学和式&矩阵快速幂
  2. ip addr 命令:LOWER_UP字段意义
  3. uniapp中实现每次点击左侧菜单右边区域都从顶部开始
  4. yarn 安装 sass
  5. maven tomcat1.7环境下构建javaweb 项目
  6. codeforces 869C The Intriguing Obsession 组合数学,逆元
  7. 移动端页面滚动穿透问题解决方案
  8. iso硬盘安装 凤凰os_凤凰os系统下载_凤凰系统phoenix os官方下载-188软件园
  9. HTML——添加网页背景音乐
  10. 在ArcGIS中ArcCatalog(Arcmap)快速选中多个要素
  11. OpenCv4在Win10 VS2019上环境搭建
  12. win10 如何启用虚拟化 Hyper-V
  13. 软件人员kpi制定模板_绩效考核软件有哪些,员工绩效考核制度模板
  14. js设为首页和加入收藏
  15. Xprivacy - 必须拥有黑客应用程序
  16. 细说pc端微信扫码登录
  17. 台式计算机怎么加一个硬盘,台式机加装一个机械硬盘图解 但建议直接在windows下...
  18. nginx.exe启动失败?
  19. 操作系统bootloader是什么
  20. Waymo自动驾驶解读

热门文章

  1. js使用input上传文件夹、拖拽上传文件夹并将文件夹结构展示为树形结构
  2. 首先dns服务器自动改变 萤石云,设备的DNS在哪里改 ?
  3. python送程序员收入_程序员学Python后惊叹,这么丰厚的收入是Java给不了的!
  4. vue.js实现单选框、复选框和下拉框
  5. 敏捷开发与Scrum区别(敏捷开发(Agile)教程)
  6. Layui写后台登录页面 蓝奏云 下载
  7. 使用Python生成数据
  8. 南昌大学航天杯第二届程序设计竞赛校赛网络同步赛 部分题解
  9. JavaScript - 语言基础
  10. 难以置信,已经有人用 ChatGPT 做 Excel 报表了?