Function ZwOpenFile和NtOpenFile之间有什么区别?
ZWOpenFile和NtOpenFile都是nt dll的函数。ZWOpenFile的实现方式与NtOpenFile相同。但我不明白为什么ZWOpenFile包含在nt dll函数中。有人能解释一下区别吗?这是: 内核模式驱动程序调用本机系统服务例程的Zw版本,通知例程参数来自可信的内核模式源。在这种情况下,例程假定它可以安全地使用参数,而无需首先验证它们。但是,如果参数可能来自用户模式源或内核模式源,则驱动程序将调用例程的Nt版本,该例程根据调用线程的历史确定参数是源自用户模式还是内核模式。有关例程如何区分用户模式参数和内核模式参数的更多信息,请参阅 基本上,它与参数的验证方式有关。这是: 内核模式驱动程序调用本机系统服务例程的Zw版本,通知例程参数来自可信的内核模式源。在这种情况下,例程假定它可以安全地使用参数,而无需首先验证它们。但是,如果参数可能来自用户模式源或内核模式源,则驱动程序将调用例程的Nt版本,该例程根据调用线程的历史确定参数是源自用户模式还是内核模式。有关例程如何区分用户模式参数和内核模式参数的更多信息,请参阅Function ZwOpenFile和NtOpenFile之间有什么区别?,function,kernel32,Function,Kernel32,ZWOpenFile和NtOpenFile都是nt dll的函数。ZWOpenFile的实现方式与NtOpenFile相同。但我不明白为什么ZWOpenFile包含在nt dll函数中。有人能解释一下区别吗?这是: 内核模式驱动程序调用本机系统服务例程的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或其他任何人得到完整的信息
. 举例说明已经说过的话,以确保OP或其他任何人了解完整情况