使用简单的c ++进行内核模式编程?

时间:2011-12-05 20:06:44

标签: c++ windows kernel wdk

我即将钻研核心土地。我的问题与编程语言有关。我已经看到大多数教程都是用C语言编写的。我目前用C ++和汇编编程。我在C ++之前也学过C,但是我没有经常使用它。是否可以使用简单的C ++在内核模式下编程而无需使用任何高级构造?基本上我试图避免两种语言之间存在的微小差异(比如C中没有bool,没有main自动返回0,真正的微小差异)。我不会使用模板,类等。那么可以使用简单的C ++在内核模式下编程而不会有任何重大烦恼吗?

4 个答案:

答案 0 :(得分:18)

即使没有得到官方支持,您也可以使用C ++作为Windows内核开发的开发语言。 您应该了解以下事项:

  • 您必须定义new和delete运算符以映射到ExAllocatePoolWithTag和ExFreePool。

  • 尽量避免使用虚函数。似乎无法控制对象的vtable的位置,如果它位于可分页部分并且使用IRQL> = DISPATCH_LEVEL调用代码,则可能会产生意外结果。

  • 如果在使用IRQL> = DISPATCH_LEVEL之前仍需要使用虚拟方法表而不是锁定.rdata段。

除了这些限制外,您还可以使用C ++进行驱动程序开发。

答案 1 :(得分:4)

如果要在WDK中执行C ++,请添加两个链接。这是一次性的设置工作。

The NT Insider:Guest Article: C++ in an NT Driver

The NT Insider:Global Relief Effort - C++ Runtime Support for the NT DDK

看过内核代码使用了很多自动锁/智能指针;虽然它们使代码整洁,我觉得它有一个学习曲线让初学者完全理解,如果被滥用,许多构造/破坏代码会减慢速度。

答案 2 :(得分:3)

如果你仔细编写代码,知道每个定义,运算符,调用等背后的确切位置,那么在C ++中编写内核代码应该没有问题。上面评论中提到的Microsoft文档是一个很好的阅读,正是因为它描述了C ++不像C那样透明或者没有提供类似重要保证的情况,以及你知道要避免的内容。

答案 3 :(得分:3)

Microsoft编写了guide。基本上他们告诉我们除了使用C ++轻松的变量声明规则之外,还要避开任何事情......叹息。还有其他任何东西,你自己。无论如何它不是那么糟糕,但这里有一些你需要记住的例子:

  • 分页池中分配的内存可以被分页。如果您在IRQL高于PASSIVE_LEVEL时尝试访问它,那么您就会被搞砸(或者至少当您的客户抱怨您的驱动程序BSOD他们的系统时,您会偶尔出现这种情况)!在负载低的内存系统上测试你的驱动程序!
  • 非分页池是有限的,您很可能无法从中分配所有需求。
  • 堆栈比用户模式小得多~12-24K。
  • 您在内核中涉及浮点路径的任何操作都必须受KeSaveFloatingPointStateKeRestoreFloatingPointState
  • 保护
  • C ++例外:

阅读指南了解更多信息。现在,如果您可以确保生成的代码遵循规则,请继续使用C ++。