Visual Studio 如何在内核模式驱动程序项目中使用C++标准库?

iou*_*vxz 4 c++ driver visual-studio kmdf c++11

我使用的是vs2015和wdk10,我可以在空项目中使用随机。

#include <random>
std::default_random_engine eng;//works fine .
Run Code Online (Sandbox Code Playgroud)

但是当我创建一个空的内核模式驱动程序项目时,我无法在其中使用随机。

#include <random>
std::default_random_engine eng;//namespace "std" has no member "default_random_engine"
Run Code Online (Sandbox Code Playgroud)

其他标准库,如向量元组也不起作用,所有这些都提醒我命名空间“std”没有成员 XXX(向量、元组等)

我该如何解决这个问题?

mks*_*eve 5

std 库的实现需要工作异常处理才能使代码正常工作。这已经阻止了标准库的一个端口在内核中执行。

在内核中不起作用的代码的其他示例是

  • 魔法静态(局部变量的线程安全初始化 - 需要线程本地存储,这不在内核中)。
  • 对象的静态初始化。在 DLL 或 EXE 中,程序的全局数据在调用 main 之前由运行时初始化。该代码不存在于内核中
  • 堆栈大小。一个内核线程只有12kb的内存,这使得一些算法卡住,导致异常。
  • 内核中的内存处理有所不同,内存是通过标签分配的。如果您使用标签实现分配器,那么这将会丢失,或者产生接口问题。

正如评论中提到的

RtlRandomEx
Run Code Online (Sandbox Code Playgroud)

产生伪随机数,并且在内核中可用。

对于加密安全随机性,此页面具有一定的价值。

MS 加密原语