6

什么是使用 WDK 编写的 Windows 内核驱动程序?

与普通应用程序或服务有什么不同?

4

4 回答 4

16

内核驱动程序是针对 Windows NT 的本机 API(而不是 Win32 子系统的 API)编写的程序,它们在底层硬件上以内核模式执行。这意味着驱动程序需要能够处理在进程之间切换虚拟内存上下文,并且需要编写得非常稳定——因为内核驱动程序在内核模式下运行,如果一个崩溃,它会导致整个系统崩溃。内核驱动程序不适合硬件设备以外的任何设备,因为它们需要管理权限才能安装或启动,并且因为它们消除了内核通常为崩溃程序提供的安全性——即它们自身崩溃而不是整个系统崩溃。

长话短说:

  • 驱动程序使用本机 API 而不是 Win32 API
    • 这意味着驱动程序通常无法显示任何 UI。
  • 驱动程序需要管理内存以及内存是如何显式分页的——使用分页池和非分页池之类的东西。
  • 驱动程序需要处理进程上下文切换,而不是依赖于哪个进程在运行时碰巧拥有页表。
  • 受限用户无法将驱动程序安装到内核中。
  • 驱动程序以处理器级别的特权运行。
  • 用户级程序中的故障会导致该程序的进程终止。驱动程序中的故障会导致系统出现蓝屏死机。
  • 驱动程序需要处理低级硬件位,例如中断和中断请求级别 (IRQL)。
于 2011-05-15T07:57:36.557 回答
2

它是在内核模式而不是用户模式下运行的代码。内核模式代码可以直接访问操作系统、硬件等的内部。

您总是编写内核模式模块来实现设备驱动程序

于 2011-05-15T07:55:57.690 回答
0

内核驱动程序是“应用程序”的低级实现。
因为它在内核上下文中运行,所以它具有直接访问内核 API 和内存的能力。

例如,内核驱动程序应该用于:

  • 控制对文件的访问(密码保护、隐藏)
  • 允许访问非标准文件系统(如 ext、reiserfs、zfs 等)和设备
  • 真正的 API 挂钩
  • ...以及许多其他原因

如果您想了解更多,可以使用您喜欢的搜索引擎搜索关键字“ring0”。

于 2011-05-15T07:58:21.410 回答
0

其他人则将差异解释为系统级别的角度。如果您使用 C++ 进行开发,则用户模式开发和内核模式开发存在以下差异。

  1. 未处理的异常会在用户模式下使进程崩溃,但在内核模式下,它会使整个系统崩溃(面对 BSOD)。
  2. 当用户模式进程在没有释放私有内存的情况下终止时,系统会隐式释放进程内存。但在内核模式下,系统启动后剩余内存可用。
  3. 用户模式代码在 PASSIVE_LEVEL 中编写和执行。在内核模式下,有更多的 IRQL 级别。
  4. 使用单独的机器完成内核代码调试。但是您可以在同一台机器上调试用户模式。
  5. 您不能在内核模式下使用所有 C++ 功能,例如异常处理和 STL。
  6. 入口点不同,在用户模式下,您使用 main 作为入口点。但是在内核模式下,我们需要使用DriverEntry。
  7. 您不能在内核模式下使用 new 运算符,您需要显式地重载它。
于 2020-06-09T15:44:06.867 回答