搜索到如下回答。
Windows本机系统服务例程的名称以前缀Nt和Zw开头。Nt前缀是Windows Nt的缩写,但Zw前缀没有任何意义。
选择Zw部分是为了避免与其他api的潜在命名冲突,部分是为了避免使用将来可能需要的任何潜在有用的双字母前缀。
https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/previousmode?redirectedfrom=MSDN
Nt和Zw API调用之间的主要区别是,Zw调用通过系统调用分派器,但对于驱动程序,Nt调用直接调用API。
当驱动程序调用Zw API时,通过系统调用调度程序运行的唯一实际效果是它将KeGetPreviousMode()设置为KernelMode而不是UserMode(显然,对于用户模式代码,Zw和Nt表单是相同的)。
当各种系统调用看到ExGetPreviousMode为KernelMode时,它们会绕过访问检查(因为驱动程序可以做任何事情)。
如果驱动程序调用api的NT形式,则有可能因为访问检查而失败。
一个具体的例子:如果一个驱动调用NtCreateFile, NtCreateFile将调用SeAccessCheck()来查看被调用到驱动中的应用程序是否有创建文件的权限。
如果同一个驱动程序叫做ZwCreateFile, NtCreateFile API调用不会调用SeAccessCheck,因为ExGetPreviousMode返回了KernelMode,因此驱动程序被假定有访问文件的权限。
驱动程序作者理解两者之间的区别是很重要的,因为它可能对安全性有深远的影响……
Zw:没啥含义,就是为了避免重名冲突。 估计是程序员起名,zw两个字母离左手近,隔得不远,方便敲代码。 为啥不是qq、aa、zz、qw、qs、qa、qz呢,估计不好和领导交差,会被锤。为啥不是Wz呢,得了吧,开vs一看,w开头和宽字符相关的api一大堆,容易重。干脆用z开头,没啥能碰瓷了,一个z也不太行,得起两个,Zq呢,容易联想到query、quest。Zz呢,像睡觉,而且shift容易被按坏。w有windows缩写之意,有点那个意思。干脆Zw,看着还顺眼。Nt配Zw,就它了! (博主合理瞎猜,切勿当真)
Nt:NewTechnology WindowsNT系统
Ke:Kernel core / Ki:Kernel interfacce 内核接口
Cm:Configuration Manager 系统配置管理
Ex:Executive 执行相关
Hal:Hardware Abstraction Layer 硬件抽象层
Io:I/O Manager 输入/输出管理
Mm:Memory Manager 内存管理
Ob:Object Manager 对象管理
Po:Power Manager 电源管理
Tm:Transaction Manager 事务管理
Ps:Process Manager 进程管理
Se:Security 安全管理
Fs:File System 文件系统
PnP:Plug-and-Play 即插即用
Rtl:Runtime Library 运行时程序库
WDM:Windows Driver Model 驱动模式
DMA:Direct Memory Access 直接存储器访问
DPCs:Deferred Procedure Calls 延迟过程调用
ISRs:Interrupt Service Routines 中断服务例程
标签:调用,驱动程序,Ki,Manager,Zw,Nt,前缀 From: https://www.cnblogs.com/hwnd/p/16847798.html