Function ZwOpenFile和NtOpenFile之间有什么区别?

Function ZwOpenFile和NtOpenFile之间有什么区别?,function,kernel32,Function,Kernel32,ZWOpenFile和NtOpenFile都是nt dll的函数。ZWOpenFile的实现方式与NtOpenFile相同。但我不明白为什么ZWOpenFile包含在nt dll函数中。有人能解释一下区别吗?这是: 内核模式驱动程序调用本机系统服务例程的Zw版本,通知例程参数来自可信的内核模式源。在这种情况下,例程假定它可以安全地使用参数,而无需首先验证它们。但是,如果参数可能来自用户模式源或内核模式源,则驱动程序将调用例程的Nt版本,该例程根据调用线程的历史确定参数是源自用户模式还是内核模式。

ZWOpenFile和NtOpenFile都是nt dll的函数。ZWOpenFile的实现方式与NtOpenFile相同。但我不明白为什么ZWOpenFile包含在nt dll函数中。有人能解释一下区别吗?

这是:

内核模式驱动程序调用本机系统服务例程的Zw版本,通知例程参数来自可信的内核模式源。在这种情况下,例程假定它可以安全地使用参数,而无需首先验证它们。但是,如果参数可能来自用户模式源或内核模式源,则驱动程序将调用例程的Nt版本,该例程根据调用线程的历史确定参数是源自用户模式还是内核模式。有关例程如何区分用户模式参数和内核模式参数的更多信息,请参阅

基本上,它与参数的验证方式有关。

这是:

内核模式驱动程序调用本机系统服务例程的Zw版本,通知例程参数来自可信的内核模式源。在这种情况下,例程假定它可以安全地使用参数,而无需首先验证它们。但是,如果参数可能来自用户模式源或内核模式源,则驱动程序将调用例程的Nt版本,该例程根据调用线程的历史确定参数是源自用户模式还是内核模式。有关例程如何区分用户模式参数和内核模式参数的更多信息,请参阅


基本上,它与参数的验证方式有关。

通常,内核驱动程序应该只使用
ZwXxx()
函数

从用户模式调用时,
ZwXxx()
NtXxx()
函数完全相同-它们解析为ntdll.dll中相同的代码位

当从内核模式驱动程序调用时,
Zwxxx()
变量确保内核使用的标志被设置为指示请求者模式(应该指示调用方的模式)是内核模式。如果内核驱动程序调用
NtXxx()
变量,则不会显式设置请求者模式,因此它会被单独设置,并可能指示用户或内核模式,具体取决于调用堆栈中到目前为止发生的情况

如果请求者模式标志设置为用户模式,内核将验证参数,这可能不是正确的做法(特别是如果内核驱动程序正在传递内核模式缓冲区,因为在这种情况下验证将失败),如果设置为内核模式,内核将隐式信任参数

因此,使用这些API名称的规则通常归结为:如果您正在编写内核驱动程序,请调用
ZwXxx()
版本(除非您处理的是特殊情况,并且您知道自己在做什么以及为什么)。如果您正在编写用户模式组件,那么调用哪个集合并不重要


据我所知,Microsoft只记录了在用户模式下使用的
NtXxx()
(其中表明它们是与相应的
ZwXxx()
函数等效的用户模式)。

通常,内核驱动程序应该只使用
ZwXxx()
函数

从用户模式调用时,
ZwXxx()
NtXxx()
函数完全相同-它们解析为ntdll.dll中相同的代码位

当从内核模式驱动程序调用时,
Zwxxx()
变量确保内核使用的标志被设置为指示请求者模式(应该指示调用方的模式)是内核模式。如果内核驱动程序调用
NtXxx()
变量,则不会显式设置请求者模式,因此它会被单独设置,并可能指示用户或内核模式,具体取决于调用堆栈中到目前为止发生的情况

如果请求者模式标志设置为用户模式,内核将验证参数,这可能不是正确的做法(特别是如果内核驱动程序正在传递内核模式缓冲区,因为在这种情况下验证将失败),如果设置为内核模式,内核将隐式信任参数

因此,使用这些API名称的规则通常归结为:如果您正在编写内核驱动程序,请调用
ZwXxx()
版本(除非您处理的是特殊情况,并且您知道自己在做什么以及为什么)。如果您正在编写用户模式组件,那么调用哪个集合并不重要


据我所知,微软只记录了在用户模式下使用的
NtXxx()
(其中表明它们是与相应的
ZwXxx()
函数等效的用户模式)。

举例说明了已经说过的话,以确保OP或其他任何人得到完整的信息

  • 来自用户模式的NtXxx调用会导致将不太可信的数据(来自用户模式)传递到更具特权的层(内核模式)。因此,它期望缓冲区具有有效的用户模式地址,传递的句柄是有效的用户模式句柄,等等

  • 如果驱动程序调用NtXxx api而不是其等效的ZwXxx api,则必须确保传递的是有效的用户模式参数,即它不能传递内核模式地址(即使是有效的)和内核模式句柄(请参阅OBJ_kernel_handle)

  • 如前所述,API的ZwXxx等价物明确指出(通过请求者级别),需要跳过此类参数验证,因为被调用方与调用方处于相同的特权级别

  • 这是一个链接,对于任何想要超越显而易见的事物的人来说,这是一个很好的起点,
    .

    举例说明已经说过的话,以确保OP或其他任何人了解完整情况

  • 来自用户模式的NtXxx调用会导致将不太可信的数据(来自用户模式)传递给更高的权限