【发布时间】:2015-05-21 22:39:16
【问题描述】:
我现在正在研究 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 中。
编辑:需要明确的是,通过双击图标启动应用程序时也会出现上述错误。
此加载发生在我的任何代码之前,我无法在互联网上的任何地方找到任何内容,也无法在相关文件的项目属性中找到任何内容。所以,总而言之,到目前为止,我有以下问题:
- 为什么要为我的应用程序加载 werkernel.sys?
- 为什么要从 System32 加载?
我知道mklink werkernel.sys drivers\werkernel.sys 是可能的,但感觉我做错了什么。
【问题讨论】:
-
我正在使用 Visual Studio。我有另一个使用 NtQueryDirectoryInformationFile() 的应用程序(在 C# 中)——一切正常,所以我没想到 C++ 代码会出现任何问题。实际上我想在那个 C# 应用程序中使用 NtOpenFile,但我坚持使用来自 NtCreateFile 的 0xc000000d 响应,所以我决定使用 WDK 来玩弄它,只是为了看看我在托管方面做错了什么。
-
/SUBSYSTEM 选项设置为什么? (项目属性,在链接器、系统、子系统下。)另外,您是否尝试过使用ntdll.lib as documented 而不是 ntoskrnl.lib?
-
是的,这行得通。谢谢!正如我在下面所写的,我对 NtCreateFile 重定向到 ZwCreateFile 的一般“代理”页面感到困惑。似乎 Zw* 文档说必须链接 ntoskrnl.lib,实际上对于 NT* 函数,必须链接 ntdll.lib。
-
我相信您会链接到 ntoskrnl.lib 以获得设备驱动程序,并且可能还会链接到本机可执行文件,但它不适合 Win32 应用程序使用。
标签: c++ windows nt-native-api