我准备深入内核领域,我的问题与编程语言有关。我看过大部分教程都是用C语言编写的。我目前使用的是C++和汇编语言编程。我之前也学过C语言,但没有多少使用经验。我想知道是否可能仅使用简化的C++在内核模式下进行编程,而不使用任何高级构造?基本上,我试图避免两种语言之间存在的细微差异(例如C语言中没有bool
,main
函数没有自动返回0,真正微小的差异)。我不会使用模板、类等。那么,在没有任何主要麻烦的情况下,是否可以使用简单的C++在内核模式下进行编程?
我准备深入内核领域,我的问题与编程语言有关。我看过大部分教程都是用C语言编写的。我目前使用的是C++和汇编语言编程。我之前也学过C语言,但没有多少使用经验。我想知道是否可能仅使用简化的C++在内核模式下进行编程,而不使用任何高级构造?基本上,我试图避免两种语言之间存在的细微差异(例如C语言中没有bool
,main
函数没有自动返回0,真正微小的差异)。我不会使用模板、类等。那么,在没有任何主要麻烦的情况下,是否可以使用简单的C++在内核模式下进行编程?
必须定义新的和删除的操作符来映射到ExAllocatePoolWithTag和ExFreePool。
尽量避免虚拟函数。似乎无法控制对象vtable的位置,如果它在可分页部分中并且您的代码在IRQL >= DISPATCH_LEVEL下被调用,则可能会产生意外结果。
如果仍然需要使用虚拟方法表,请在IRQL>=DISPATCH_LEVEL之前锁定.rdata段后再使用。
微软编写了一份指南。基本上他们告诉我们要避免使用除了C++的松散变量声明规则以外的任何东西... 唉。不过也不可能那么糟糕,但是这里有一些需要记住的例子:
IRQL
高于PASSIVE_LEVEL时尝试访问它,则会出现问题(或者至少当客户抱怨您的驱动程序使系统蓝屏时,您会偶尔遇到这种情况)!在低内存系统下测试您的驱动程序并加以负载!KeSaveFloatingPointState
和KeRestoreFloatingPointState
的保护。阅读指南了解更多。现在,如果您可以确保生成的代码遵循这些规则,请继续使用C++。