我正在尝试学习有关Windows驱动程序的基础知识。 为什么我不能在典型的c ++应用程序中使用标头ntddk.h中的函数?
答案 0 :(得分:4)
编辑:内核是操作系统的核心组件,用于管理正在运行的进程,内存分配等。您可以将其视为特权流程 - 尽管它不是流程,因为它是管理流程的流程。
内核模式驱动程序或 ring-0驱动程序将加载到内核中。他们的代码与任何其他内核代码的处理方式相同。内核可以完全控制系统 - 这意味着如果出现问题,它可能会搞砸整个系统并需要重新启动。 (这就是蓝屏死机。)
用户模式驱动程序或 ring-3驱动程序,在正常进程中运行。与任何其他进程一样,它们无需询问内核即可访问系统的其余部分,并且它们拥有自己的地址空间。与任何其他程序一样,如果用户模式驱动程序崩溃,它只会影响该进程 - 特别是,它不太可能导致BSOD。
用户模式驱动程序也可以在更高的抽象级别上运行。 IRQL,分页/非分页内存和线程上下文等概念不存在于内核之外,因此用户模式驱动程序并不需要关注它们。
因为它们在正常进程中运行,所以也可以使用普通调试器调试用户模式驱动程序 - 不需要内核调试器。
内核模式驱动程序的主要优点是性能和内核开发人员的简单性 - 这就是所有驱动程序最初都是内核模式的原因。用户模式驱动程序的主要优点是驱动程序编写者的隔离,安全性,容错性和简单性。
此外,并非所有功能都可在用户模式驱动程序框架中使用。 Here is a list on MSDN - 最值得注意的是,UMDF不支持直接内存访问,或multiple functional power states。
(从MSDN获取的一些信息)