使用Nt或者Zw版本的本地服务例程

原文地址:

Using Nt and Zw Versions of the Native System Services Routines


Windows本地的操作系统服务API,是运行在内核模式的一系列例程。这些例程的名字都带有前缀Nt或者Zw。内核模式的驱动能直接调用这些例程,而用户模式的程序需要使用系统调用才能间接的调用它们。

不同的是,每个本地系统服务例程都有两种不同的版本,而不同版本的名字除了前缀外几乎完全一致。例如,NtCreateFile ZwCreateFile都服务于同一的内核模式的系统例程,而且执行的是几乎一样的操作。而对于用户模式的系统调用,Nt或者Zw版本的例程表现得也一样。对于内核模式的驱动,例程的Nt和Zw版本的不同之处在于,它们如何处理调用者所传递过来的参数值。

一个内核模式驱动调用的Zw版本的本地系统服务例程表明,例程的参数来自一个被信任的内核模式源。这样,可以在不验证它们的情况下就直接使用这些参数,而且不用担心安全问题。然而,如果参数不确定是来自用户模式源还是内核模式源,驱动就会调用Nt版本的例程,根据调用线程的历史记录,决定传入的参数是来自用户模式源还是内核模式源。

当一个用户模式的程序调用Nt或者Zw版本的本地系统服务例程时,该例程往往将它得到的参数视为从用户模式源传过来的,并且是不信任的。然后,在使用这些参数之前,该例程就要进行完全的验证。



你可能感兴趣的:(使用Nt或者Zw版本的本地服务例程)