1

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

起初,两者都使用build似乎最简单,因为我看到您可以修改./sources用户模式组件的文件,如下所示:

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

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

错误 C1083:无法打开包含文件:“字符串”:没有这样的文件或目录

尽管如此,它仍在用 C++ 语言语义编译用户模式部分。但是我如何让标准包含工作?

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

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

4

2 回答 2

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;
}

玩得开心!

于 2013-06-10T05:46:38.147 回答
2

快速回答

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

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

模糊的想法

在我的脑海中,这真的是从有限的经验中说出来的......如果你尝试将两者混合在一起,可能会出现很多细微的差异。

使用您自己的 __cdecl 与 __stdcall 示例;您有两种不同的调用约定。_ cdecl 都是内核的东西,所有的 C++ 方法都包含在 WINAPI ( _stdcall) 传递约定中,并且 __stdcall 将进行自动堆栈清理,并期望在整个位置插入帧指针。如果你不小心使用编译器选项来触发 __fastcall,调试起来会很痛苦。

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

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

于 2013-06-07T05:36:22.297 回答