Windows API 理解----Nt* Zw*
在你要理解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*相关推荐
- 通过Windows API 创建窗口的过程理解windows消息机制
一个基于windows API 的基于窗体.消息循环.事件驱动的 Windows C语言风格的Windows 程序. 创建一个Win32应用程序的步骤: 1.定义 WinMain 函数: 2.设计窗口 ...
- windows API 串口编程参考
*************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...
- Windows API程序设计入门(新手的第一个Windows程序)
Windows API程序设计入门 一.实验目的 二.实验工具 三.参考资料 四.步骤 五.代码分析 六.运行效果 七.补充 一.实验目的 了解 windows操作系统应用程序开发的基本概念,win3 ...
- Windows API函数速查
http://blog.csdn.net/ghevinn/article/details/8213614 Windows API函数速查 1. API之网络函数 WNetAddConnection 创 ...
- Windows API参考大全
第一章 Win32 API概论 1.1为什么使用 Wu32 API 在Windows程序设计领域处于发展初期时,Windows程序员可使用的编程工具唯有API 函数.这些函数在程序员手中犹如" ...
- 什么是API//DLL//NT架构//MessageBoxA函数//WOW64
目录 API DLL Windows NT MessageBox函数 WOW64 API API = Application Programming Interface API的英文即Applicat ...
- C#调用windows api的要点
在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...
- C#中调用Windows API的要点
在.Net Framework SDK文档中,关于调用Windows API的指示比较零散,并且其中稍全面一点的是针对Visual Basic .net讲述的.本文将C#中调用API的要点汇集如下,希 ...
- windows api打开文件对话框
用windows api 写打开文件对话框主要使用OPENFILENAME ,GetOpenFileName, GetSaveFileName; 1.OPENFILENAME 结构体介绍:要使用Get ...
最新文章
- 睡醒了,有精神了,简单讲讲这几天的故事了
- mysql page_一文理解MySQL中的page页
- iOS开发常用的RGB色值和宏
- ASP.NET Core 2.2 : 扒一扒新的Endpoint路由方案
- 1 操作系统第一章 操作系统概念、功能、四大特征、操作系统发展与分类
- 测试人多少岁的软件,抖音你的三观多少岁免费测试app
- 鸣人的影分身(信息学奥赛一本通-T1303)
- 随想录(学习使用virtualbox软件)
- html5 圆形加载进度条,纯css3超酷圆形Loading加载进度条特效
- 有趣的EditView为空时的抖动效果(用户名和密码)--第三方开源--ClearEditText
- python输出斐波那契数列_如何用Python输出一个斐波那契Fibonacci数列
- Only fullscreen activities can request orientation终极解决方法
- 获取windows用户密码——Jhon
- NAT 穿透是如何工作的
- 连接可用AP,提示“已连接,但无法访问互联网”,过一会变成“网络连接受限”,实际可以上网
- android电视查看百度网盘,智能电视也能看百度网盘内的视频,通过当贝市场,方法超简单!...
- eWebEditor 编辑器功能不能使用
- linux协议栈 IPv4之发送过程中的分段处理ip_fragment()
- 69节入门python_小渣渣学习笔记 python day69 【Django】
- 小程序如何租用云服务器,开发小程序怎样租用云服务器
热门文章
- smtp协议匿名发送邮件 无需密码、授权码
- Meta AI西雅图研究负责人Luke Zettlemoyer|万亿参数后,大模型会持续增长吗?
- 图腾42u服务器机柜型号,图腾42u机柜一般多少斤
- flash绘制荷花多个图层_实例讲解Flash中如何绘制荷花图案 你值得一看的技巧
- 磁盘加锁专家V2.63官方版
- java 读取 doc_java使用poi读取doc和docx文件的实现示例
- 修改elementUI轮播图鼠标划入轮播暂停的原生效果
- 函数的求导法则——“高等数学”
- ThinkPadE425拆机图
- 【报告分享】 2021中国跨境电商发展报告-德勤(附下载)