在使用NT DDK构建的用户模式程序中包含C ++标头

时间:2013-06-07 03:20:38

标签: c++ c windows kernel wdk

所以...我有一个内核模式组件和一个用户模式组件,我使用NT DDK 7.1.0的交钥匙构建环境放在一起。内核组件是所有.c / .h / .rc文件。用户模式组件是.cpp / .c / .h / .rc文件。

首先,对两者使用构建似乎最简单,因为我看到你可以修改用户模式组件的./sources文件,如下所示:

TARGETNAME = MyUserModeComponent
TARGETTYPE = PROGRAM
UMTYPE = windows
UMENTRY = winmain
USE_MSVCRT = 1

这似乎没有引起问题,所以我很高兴,直到我尝试#include <string>(或<memory>或其他什么)找不到那些东西:

  

错误C1083:无法打开包含文件:'string':没有这样的文件或目录

但是,它正在用C ++语言语义编译用户模式。但是,我如何让标准包括工作?

从技术上讲,我不需要为用户模式部分使用DDK 构建工具。我可以制作视觉工作室解决方案。我有点担心,因为我遇到了其他烦恼,比如DDK默认使用__stdcall而不是__cdecl ......并且没有任何编译指示或编译器开关来覆盖这个。你确实必须进入你关心的每个声明并改变它,假设你有源这样做。 : - /

我开始怀疑这只是一个分形下降到“只是因为你并不意味着你应该用DDK构建用户模式的应用程序。这里有龙。”所以我的问题不仅仅是关于这个特殊的技术障碍,而是我是否应该放弃使用DDK工具构建C ++用户模式组件的想法...只是因为内核组件是纯C。

2 个答案:

答案 0 :(得分:3)

要使用WINDDK构建用户模式程序,您需要在SOURCES文件中添加一些变量:

  • 386_STDCALL=0默认使用cdecl调用约定
  • USE_STL=1使用STL
  • USE_NATIVE_EH=1添加对异常处理的支持

你已经拥有的其他所有东西。

我将完整的SOURCES文件作为参考:

TARGETNAME = MyUserModeComponent
TARGETTYPE = PROGRAM
TARGETPATH = obj
UMTYPE = console
UMENTRY = main

USE_MSVCRT = 1
USE_NATIVE_EH=1
USE_STL=1
386_STDCALL=0

SOURCES= main.cpp

和main.cpp:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s = "bla bla bla!";
    cout << s;

    return 0;
}

玩得开心!

答案 1 :(得分:2)

快速回答

放弃使用DDK工具构建用户模式组件的想法(虽然我觉得这个概念很吸引人:-P)

作为一种良好实践,您的内核模式组件应与用户模式组件分开构建。

模糊的想法

脱离我的头脑,而这实际上来自于有限的经验......如果你试图将两者混合在一起,会有许多微妙的差异。

使用你自己的__cdecl与__stdcall的例子;您有两种不同的调用约定。 _ cdecl是所有内核的东西,所有的C ++方法都在WINAPI( _stdcall)中传递约定,而__stdcall将清理自动堆栈清理并期望在整个地方插入帧指针。如果您偶然使用编译器选项来触发__fastcall,那么调试将是一件痛苦的事。

你绝对可以一起破解某些东西,但是你真的想在你的用户空间代码和构建环境中跟踪它吗?我说的是。

除非你有非常具体的工程原因要混合这两种环境,(并且没有统一的构建体验不是一个正当的理由,因为你可以从名为buildall.bat的批处理文件中获得)我说使用单独的工具链。