2

我现在正在研究 Windows Native API,Nt*/Zw*方法。我下载了 WDK,安装并成功编译了一个应用程序(x64,在 Win 8.1 x64 下,VS2013)。它唯一做的就是调用NtOpenFile().

为了成功编译/链接它,我必须对项目属性(驱动程序模板应用程序)进行以下更改:

  • 从 WDK 添加包含文件夹
  • 从 WDK 添加 Lib 文件夹
  • 告诉链接器使用 ntoskrnl.lib

出乎意料的是,在运行调试器时,我收到错误消息“程序无法启动,因为您的计算机中缺少 C:\Windows\SYSTEM32\werkernel.sys。请尝试重新安装程序以解决此问题。” werkernel.sys 显然存在于 system32\drivers 中。

编辑:需要明确的是,通过双击图标启动应用程序时也会发生上述错误。

这种加载发生在我的任何代码之前,我在互联网上的任何地方都找不到任何东西,也无法在相关文件的项目属性中找到任何东西。因此,总而言之,到目前为止,我有以下问题:

  1. 为什么要为我的应用程序加载 werkernel.sys?
  2. 为什么它是从 System32 加载的?

我知道这是可能的mklink werkernel.sys drivers\werkernel.sys,但感觉就像我在做一些非常错误的事情。

4

2 回答 2

2

当我遇到类似问题时,链接ntdll.lib而不是ntoskrnl.lib为我工作。

于 2015-03-20T21:18:41.520 回答
1

NtOpenFile是微软所说的“内部 API”,它不应该用于生产软件,也不应该用于实验或根本不被使用这些功能在每个 SP 版本或主要 Windows 版本之间会发生变化。

如果您想在用户模式下打开文件(WDK 和用户模式?不计算...除非您实际上是为 UMDF 编写),建议您使用 OpenFile
https ://msdn.microsoft.com/en-us/ library/windows/desktop/aa365430(v=vs.85).aspx
或在您的驱动程序中:
https://msdn.microsoft.com/en-us/library/windows/hardware/ff567011(v=vs.85)。 .aspx _

tl;dr:不要使用这些旧功能,它们不应该被使用。

微软关于“内部”API 的声明:https ://msdn.microsoft.com/en-us/library/bb432200(v=vs.85).aspx

于 2015-03-20T21:31:51.487 回答