1

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

4

3 回答 3

3

记录在 MSDN 中

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

基本上它与如何验证参数有关。

于 2010-06-01T06:02:12.360 回答
3

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

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

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

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

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

据我所知,微软只记录了NtXxx()在用户模式下使用的文件(它表明它们是相当于相应ZwXxx()功能的用户模式)。

于 2010-06-01T06:22:30.347 回答
0

举例说明已经说过的内容,以确保 OP 或其他任何人都能全面了解。

  1. 来自用户模式的 NtXxx 调用导致将不太受信任的数据(来自用户模式)传递到更高特权层(内核模式)。所以它期望缓冲区有有效的用户模式地址,传递的句柄是有效的用户模式句柄,等等。

  2. 如果驱动程序调用 NtXxx api 而不是其等效的 ZwXxx,它必须确保正在传递有效的用户模式参数,即它不能传递内核模式地址(即使它是有效的)和内核模式句柄(参见 OBJ_KERNEL_HANDLE)。

  3. 正如已经说过的,API 的 ZwXxx 等效项明确指示(通过请求者级别)需要跳过此类参数验证,因为被调用者与调用者处于相同的特权级别。

对于任何想要超越显而易见的人来说,这里是一个很好的起点链接, https://www.osronline.com/article.cfm?id=257

于 2015-04-27T12:47:19.293 回答