在你要理解Zw和Nt 系列API时,你首先要知道一点,那就是系统调用。什么是系统调用呢?

系统调用:操作系统为应用程序提供的可被调用的一组函数,也叫“System Call”。

从软件角度来看,这些系统调用都是操作系统为软件提供的服务,所以也称“系统服务”,也可以说两个名词是同名词。

系统调用所提供的服务都是在内核中实现的,而软件是在用户空间运行的,其实两者就是CPU的运行模式不同而已,所以当你调用系统所提供的函数时,CPU就要从Ring3层转为Ring0层。从Ring3 进入Ring0 有三种方式:

① 中断 ②异常 ③自陷

这里说的系统调用就是通过自陷的方式,从Ring3进入Ring0的。(如果想知道自陷具体细节,可以去看毛德操的windows内核情景分析)

简单的说完系统调用后,就可以开始API的理解了。

API分装在应用层的某个DLL库中(例如kernel.dll和user32.dll)文件中。而DLL动态库中的更低层函数包含在ntdll.dll文件中,也就是调用ntdll.dll中的NativeAPI函数。
  ntdll.dll中的Native API函数是成对出现的,分别以"Nt" "Zw"开头,在ntdll.dll中,它们的本质是一样的,只是名字不同而已。
  当kernel32.dll中的API通过ntdll.dll执行时,会完成参数检查工作,再调用一个中断(int 2E 或者 SysEnter指令),从Ring3进入Ring0。
  在内核ntoskrnl.exe中有一个SSDT,里面存放了与ntdll.dll中对应的SSDT系统服务处理函数,即内核态的Nt*系列函数,它们与ntdll.dll中的函数一一对应。

从用户模式调用Nt*和Zw*API连接ntdll.dll
     二者没有区别,都是通过设置系统服务表中的索引和在栈中设置参数,经由SYSENTER(或者int 2E指令中断),并最终由KiSystemService跳转到KiServiceTable对应的系统服务历程中的。由于是从用户模式进入内核模式的,代码会严格检查用户空间传入的参数。

从内核模式调用Nt*和Zw*连接ntoskrnl.lib
     Nt*系列API将直接调用对应的函数代码,而Zw*系列API则通过KiSystemService最终跳转到对应的函数代码处。重要的是两种调用对内核中的PreviousMode的改变:
     如果从用户模式调用Native API,则Previous Mode是用户态。
     如果从内核模式调用Native APi,则Previous Mode是内核态。
     当PreviousMode为用户态时,Native API将对传递的参数进行严格的检测,当PreviousMode为内核态时则不会。
     调用Nt* API时不会改变Previous Mode的状态,调用Zw* API时会将Previous Mode改为内核态,因此在进行Kernel Mode Driver开发时可以使用Zw系列API可以避免额外的参数列表检查,提高效率。(Zw*会设置KernelMode已避免检查,Nt*不会自动设置,如果是KernelMode当然没问题,如果就UserMode就挂了)

Windows API 理解----Nt* Zw*相关推荐

  1. 通过Windows API 创建窗口的过程理解windows消息机制

    一个基于windows API 的基于窗体.消息循环.事件驱动的 Windows C语言风格的Windows 程序. 创建一个Win32应用程序的步骤: 1.定义 WinMain 函数: 2.设计窗口 ...

  2. windows API 串口编程参考

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

  3. Windows API程序设计入门(新手的第一个Windows程序)

    Windows API程序设计入门 一.实验目的 二.实验工具 三.参考资料 四.步骤 五.代码分析 六.运行效果 七.补充 一.实验目的 了解 windows操作系统应用程序开发的基本概念,win3 ...

  4. Windows API函数速查

    http://blog.csdn.net/ghevinn/article/details/8213614 Windows API函数速查 1. API之网络函数 WNetAddConnection 创 ...

  5. Windows API参考大全

    第一章 Win32 API概论 1.1为什么使用 Wu32 API 在Windows程序设计领域处于发展初期时,Windows程序员可使用的编程工具唯有API 函数.这些函数在程序员手中犹如" ...

  6. 什么是API//DLL//NT架构//MessageBoxA函数//WOW64

    目录 API DLL Windows NT MessageBox函数 WOW64 API API = Application Programming Interface API的英文即Applicat ...

  7. C#调用windows api的要点

    在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...

  8. C#中调用Windows API的要点

    在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...

  9. windows api打开文件对话框

    用windows api 写打开文件对话框主要使用OPENFILENAME ,GetOpenFileName, GetSaveFileName; 1.OPENFILENAME 结构体介绍:要使用Get ...

最新文章

  1. 睡醒了,有精神了,简单讲讲这几天的故事了
  2. mysql page_一文理解MySQL中的page页
  3. iOS开发常用的RGB色值和宏
  4. ASP.NET Core 2.2 : 扒一扒新的Endpoint路由方案
  5. 1 操作系统第一章 操作系统概念、功能、四大特征、操作系统发展与分类
  6. 测试人多少岁的软件,抖音你的三观多少岁免费测试app
  7. 鸣人的影分身(信息学奥赛一本通-T1303)
  8. 随想录(学习使用virtualbox软件)
  9. html5 圆形加载进度条,纯css3超酷圆形Loading加载进度条特效
  10. 有趣的EditView为空时的抖动效果(用户名和密码)--第三方开源--ClearEditText
  11. python输出斐波那契数列_如何用Python输出一个斐波那契Fibonacci数列
  12. Only fullscreen activities can request orientation终极解决方法
  13. 获取windows用户密码——Jhon
  14. NAT 穿透是如何工作的
  15. 连接可用AP,提示“已连接,但无法访问互联网”,过一会变成“网络连接受限”,实际可以上网
  16. android电视查看百度网盘,智能电视也能看百度网盘内的视频,通过当贝市场,方法超简单!...
  17. eWebEditor 编辑器功能不能使用
  18. linux协议栈 IPv4之发送过程中的分段处理ip_fragment()
  19. 69节入门python_小渣渣学习笔记 python day69 【Django】
  20. 小程序如何租用云服务器,开发小程序怎样租用云服务器

热门文章

  1. smtp协议匿名发送邮件 无需密码、授权码
  2. Meta AI西雅图研究负责人Luke Zettlemoyer|万亿参数后,大模型会持续增长吗?
  3. 图腾42u服务器机柜型号,图腾42u机柜一般多少斤
  4. flash绘制荷花多个图层_实例讲解Flash中如何绘制荷花图案 你值得一看的技巧
  5. 磁盘加锁专家V2.63官方版
  6. java 读取 doc_java使用poi读取doc和docx文件的实现示例
  7. 修改elementUI轮播图鼠标划入轮播暂停的原生效果
  8. 函数的求导法则——“高等数学”
  9. ThinkPadE425拆机图
  10. 【报告分享】 2021中国跨境电商发展报告-德勤(附下载)