本地系统服务例程:Nt和Zw系列函数
Windows本地操作系统服务API由一系列以Nt或Zw为前缀的函数实现的,这些函数以内核模式运行,内核驱动可以直接调用这些函数,而用户层程序只能通过系统进行调用。通常情况下用户层应用程序不会直接调用Nt和Zw系函数,更多的是通过直接调用Win32函数,这些Win32函数内部会调用Nt和Zw系函数,但也仅限于通常情况下,当Win32函数不支持一些操作时,用户层也会直接调用这些本地系统服务函数。
Nt前缀是Windows NT的缩写,但Zw前缀并没有任何意义,使用Zw只是避免跟其他已存在和未来可能出现的API有命名冲突而已。很多Windows驱动支持函数都以两到三个特定的简称字母为前缀进行命名,以此来表示这些例程都是由哪些内核系统组件实现的,比如CmRegisterCallbackEx中的Cm就表示配置管理器(Configuration manager)
每个本地系统服务例程都有两个有着不同前缀的相似名称的函数版本,比如NtCreateFile和ZwCreateFile,两者执行相同的操作,并且事实上两者也都服务于相同的内核模式系统例程。对于用户层的系统调用,Nt和Zw系函数是没有什么区别的,但对于来自于内核驱动的调用,Nt和Zw系函数对传入参数的处理方式有些不一样。
如果传入参数是来自于可信任的内核层,那么内核模式驱动则调用Zw版本的本地系统服务例程来通知其他例程,在这种情况下,例程都是不经过验证就直接使用这些参数。反而,如果这些参数可能来自用户层或者内核层,那么驱动则调用Nt版本的例程,这取决于调用线程的历程——这些参数是从用户层还是内核层发起的,线程对象中有个PreviousMode的属性可用于判断参数是否从用户层过来的,关于例程如何判断参数是来自用户层还是内核层,详细内容请参见预先模式
当一个用户层应用程序调用Nt或Zw系函数,这些本地系统服务函数始终会认为它接收到的参数来自于不可信任的用户层,在使用前必先验证参数的有效性。特别是对于由调用者提供的缓存区,这些函数将会探测其内存地址是否有效并且是否正常对齐。
本地系统服务例程对于接收到参数值还会做额外的设定。如果一个例程接收到一个由指向由内核驱动分配的缓存区指针,它会认为这缓存区是从系统内存而不是从用户层内存分配的,如果例程接收到一个由用户层应用程序打开的句柄类型参数,那么例程就会从用户层句柄表中查找句柄而不是从内核层。
在一些情况下,从用户层调用还是从内核层调用对传入参数的意义和后续的使用影响重要。比如说ZwNotifyChangeKey(或说NtNotifyChangeKey)这个函数,其中有两个输入参数ApcRoutine和APCContext,从用户层和从内核层传过来分别代表不同的意义。如果其从用户层被调用,ApcRoutine指向一个APC例程,ApcContext则指向一个由操作系统在调用APC例程时分配的上下文;如果其从内核层被调用,ApcRoutine指向一个WORK_QUEUE_ITEM结构,而ApcContext则表示WORK_QUEUE_ITEM队列项的类型。
用户层不支持调用Zw系函数,而在内核层调用Zw系函数时,上面也稍微提到过,系统不检测调用者的访问权限,调用之前必须检测从用户模式下传来的参数的有效性
大多数Zw 系函数的声明在Wdm.h中可以找得到,少部分散落在其他头文件里如Ntddk.h和Ntifs.h
用户层可通过引用Ntdll.lib静态库(在WDK中可以找到)来调用这些本地系统服务例程,大多数文档化的Nt系函数声明在Windows SDK的Winternl.h头文件中,对于未文档化的Nt系函数,微软一直不建议开发者进行调用,因为在未来的Windows版本中这些函数接口可能会有所改动或者直接被废除,这对使用了这些未文档化函数的应用程序的稳定运行造成一定的影响,但往往是这些未文档化的函数和结构体能够获取更多的系统权限,这也是众多的Windows应用开发者不听劝告反而乐此不疲地去挖掘的原因。
内核驱动可通过调用Nt和Zw在Ntoskrnl.exe的动态链接库的入口点(entry points)来使用这些本地系统服务例程的,该DLL(动态链接库)包含这些服务例程的具体实现,要访问这些入口点,驱动程序需要静态链接到Ntoskrnl.lib(在WDK中也可以找到)
对于Nt*Xxx* and Zw*Xxx* 的具体函数列表可查看此处
本地系统服务例程:Nt和Zw系列函数的更多相关文章
- linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用
本节目标: exec替换进程映像 exec关联函数组(execl.execlp.execle.execv.execvp) 一,exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程 ...
- PHP进程通信基础——shmop 、sem系列函数使用
PHP进程通信基础--shmop .sem系列函数使用 进程通信的原理就是在系统中开辟出一个共享区域,不管是管道也好,还是共享内存,都是这个原理.如果心中有了这个概念,就会很方便去理解代码.由于官网上 ...
- 第8章 用户模式下的线程同步(1)_Interlocked系列函数
8.1 原子访问:Interlocked系列函数(Interlock英文为互锁的意思) (1)原子访问的原理 ①原子访问:指的是一线程在访问某个资源的同时,能够保证没有其他线程会在同一时刻访问该资源. ...
- linux tricks 之VA系列函数.
VA函数(variable argument function),参数个数可变函数,又称可变参数函数.C/C++编程中,系统提供给编程人员的va函数很少.*printf()/*scanf()系列函数, ...
- Winsock系列函数 及 Socket通信流程
Socket是一种网络通信机制 Winsock系列函数 1. Socket 创建socket 2. Connect 尝试连接远端Socket 3. Send 在某个Socket 向远端 ...
- 原子操作 Interlocked系列函数
上一篇<多线程第一次亲密接触 CreateThread与_beginthreadex本质区别>中讲到一个多线程报数功能.为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是 ...
- posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序
posix 线程(一):线程模型.pthread 系列函数 和 简单多线程服务器端程序 一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属 ...
- (转)原子操作 Interlocked系列函数
上一篇<多线程第一次亲密接触 CreateThread与_beginthreadex本质区别>中讲到一个多线程报数功能.为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是 ...
- 多线程笔记--原子操作Interlocked系列函数
前面写了一个多线程报数的功能,为了描述方便和代码简洁起见,只输出最后的报数结果来观察程序运行结果.这非常类似一个网站的客户访问统计,每个用户登录用一个线程模拟,线程运行时将一个表示计数的变量递增.程序 ...
随机推荐
- 面试中程序员常见的Redis"刁难"问题,值得一读!
导读 在程序员面试过程中Redis相关的知识是常被问到的话题.作为一名在互联网技术行业打击过成百上千名的资深技术面试官,总结了面试过程中经常问到的问题.十分值得一读. Redis有哪些数据结构? 字符 ...
- 面试挂了阿里却拿到网易offer,一个三年Java程序员的面试总结!
前言 15年毕业到现在有三年多了,最近去面试了阿里集团(菜鸟网络,蚂蚁金服),网易,滴滴,点我达,最终收到点我达,网易offer,蚂蚁金服二面挂掉,菜鸟网络一个月了还在流程中... 最终有幸去了网易. ...
- EF实现批量插入
Z.EntityFramework.BulkInsert EntityFramework 最被人诟病的地方就是它的性能,处理大量数据时的效率.此种条件下,通常会转回使用 ADO.NET 来完成任务.而 ...
- Markdown 文档生成工具
之前用了很多Markdown 文档生成工具,发现有几个挺好用的,现在整理出来,方便大家快速学习. loppo: 非常简单的静态站点生成器 idoc:简单的文档生成工具 gitbook:大名鼎鼎的文档协 ...
- Asp.Net SignalR - 简单聊天室实现
简单聊天室 使用持久链接类我们就可以做一些即时通讯的应用了,我使用Group做了一个简单的聊天室,先上图技术细节下面再讲 可以加入聊天室.创建聊天室.发送消息,下面就说说我是如何通过Group做出来的 ...
- ELK-安装logstash
注意:在下载tar包的时候需要注意下安装的es版本号,按照官网的说明版本是对应一致的. $ wget https://artifacts.elastic.co/downloads/logstash/l ...
- pwnable.tw unexploitable 分析
这题是和pwnable.kr差不多的一道题,主要区别在于没有给syscall.所以需要自己去找. 只有read和sleep两个函数. 思路一是首先劫持堆栈到bss段,然后调用read函数将sleep的 ...
- 手把手教您将 libreoffice 移植到函数计算平台
LibreOffice 是由文档基金会开发的自由及开放源代码的办公室套件.LibreOffice 套件包含文字处理器.电子表格.演示文稿程序.矢量图形编辑器和图表工具.数据库管理程序及创建和编辑数学公 ...
- 学习编写Dockerfile
前言 我们学习docker的话,其主要目的还是要用来改变我们部署应用程序的传统习惯,达到解放生产力,解放人力的目的.这篇则自己来熟悉一下dockerfile常用命令.并且尝试改变下生产环境手动部署应用 ...
- C#设计模式之二十一访问者模式(Visitor Pattern)【行为型】
一.引言 今天我们开始讲“行为型”设计模式的第九个模式,该模式是[访问者模式],英文名称是:Visitor Pattern.如果按老规矩,先从名称上来看看这个模式,我根本不能获得任何对理解该模式有用的 ...