Windows 本机开发:调试对象尝试从 system32 加载 werkernel.sys

Windows native development: debuggee tries to load werkernel.sys from system32

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

为了成功 compile/link 它,我必须对项目属性(驱动程序申请模板)进行以下更改:

出乎意料的是,在 运行 调试器上,我收到了错误消息 "The program can't start because C:\Windows\SYSTEM32\werkernel.sys is missing from your computer. Try reinstalling the program to fix this problem." werkernel.sys 显然存在于 system32\drivers.

编辑:需要说明的是,双击图标启动应用程序时也会出现上述错误。

此加载发生在我的任何代码之前,我无法在互联网上的任何地方或相关文件的项目属性中找到任何内容。所以,总而言之,到目前为止我有以下问题:

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

我明白 mklink werkernel.sys drivers\werkernel.sys 是可能的,但感觉我做错了什么。

当我遇到类似问题时,链接 ntdll.lib 而不是 ntoskrnl.lib 对我有用。

NtOpenFile 是 Microsoft 所说的 "internal 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 : 不要使用这些旧功能,它们不应该被使用。

Microsoft 关于 "internal" API 的声明:https://msdn.microsoft.com/en-us/library/bb432200(v=vs.85).aspx