Windows 设备驱动程序可以有依赖项吗?



我用C编写了一个内核模式驱动程序。 当我使用依赖沃克检查它时,我发现它依赖于一些NT*.dll和HAL.dll。

我有几个问题:

  1. 操作系统何时加载这些 DLL? 我认为内核负责加载 DLL,在这种情况下,如果它已经处于内核模式,驱动程序如何加载 DLL
  2. 为什么标准的C依赖项没有像ucrtbase,concrt,vcruntime,msvcp等那样显示? 驱动程序是否有可能具有这些依赖项并且仍然起作用?
  3. (最后一个问题的延续(。 如果 Windows 即使在内核模式下仍然会加载 DLL,我不明白为什么不能用 (MS( C++ 编写驱动程序

谢谢

  1. 驱动程序中的大部分 API 都是从 ntoskrnl.exe 导出的。

    您的驱动程序实际上是一个"内核模块",它是进程的一部分,就像 Ring3 中的模块一样。

    驱动程序的"进程"是"系统",Pid 为 4,您可以在任务管理器中看到。

    ntoskrnl.exe 和 HAL.dll 是"系统"中的模块,它们将在系统启动时加载,而其他模块则在使用时加载(例如您的驱动程序(。

    您可以编写和加载"驱动程序 DLL",但我还没有这样做,所以我无法回答这个问题。

  2. Ring3
  3. 模块没有加载到内核中,因此您无法调用许多常见的 Ring3 API,但Microsoft主要为它们提供了替代 API。

    您不能将 Ring3 模块直接加载到内核中并调用其导出函数。可能有一些非常复杂的方法或技巧可以做到这一点,但这真的没有必要。

  4. 你可以用C++编写驱动程序,但目前Microsoft不正式推荐这样做,因为它会遇到很多问题,例如:

    • 不能自动调用全局变量的构造函数和析构函数。

    • 不能直接使用C++标准库。

    • 您不能直接使用 new 和 delete,它们需要被覆盖。

    • C++异常不能直接使用,如果手动支持它们,则会占用大量堆栈空间。Ring0驱动程序堆栈空间通常比Ring3应用程序堆栈空间小得多,表明可能是由BSOD引起的。

    幸运:

    • 一些伟大的人已经解决了大部分问题,例如构造函数和析构函数的自动调用以及标准库的使用。 GitHub 项目链接(但我仍然不建议在内核中使用标准库,除非有必要,因为它们太复杂和太大,可能会导致一些意想不到的问题(

    • 我的朋友告诉我,Microsoft似乎有一个小团队,目前正在努力让司机支持C++。但我没有时间确认这种说法的真实性。

最新更新