什么是Windows内核驱动程序?

7

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

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


请阅读Wikipedia上关于内核的条目。这应该能很明显地说明区别。 - DarkDust
4个回答

20

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

简而言之:

  • 驱动程序使用本机API而不是Win32 API。
    • 这意味着驱动程序通常无法显示任何UI界面。
  • 驱动程序需要明确地管理内存和分页方式 - 使用诸如分页池和非分页池之类的东西。
  • 驱动程序需要处理进程上下文切换,不能依赖于哪个进程在运行时具有页面表。
  • 普通用户无法将驱动程序安装到内核中。
  • 驱动程序在处理器级别具有特权权限。
  • 用户级别程序的故障导致其进程终止。驱动程序的故障会导致系统崩溃并出现蓝屏。
  • 驱动程序需要处理低级硬件位,例如中断和中断请求级别(IRQL)。

我可以从本地驱动程序中使用Win32 API进行编程吗?在 WDK 中有一个示例,用于获取进程名称。我可以在 WinAPI 中完成同样的操作。 - userbb
1
@userbb:不行。驱动程序不能调用Windows子系统——它运行在比该子系统更低的级别上。(实际上,通常是在启动Windows子系统之前加载)你可以在Windows程序和本地程序中获取进程的名称。在本地程序中,你只能使用本地API,而在Windows程序中,你可以使用本地API或Windows API。 - Billy ONeal
1
@userbb:也就是说,驱动程序必须调用ZwQueryInformationProcess才能获取进程名称。应用程序可以调用ZwQueryInformationProcessNtQueryInformationProcessEnumProcessModules - Billy ONeal

2

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

通常情况下,编写内核模式模块来实现设备驱动程序


1

内核驱动程序是一个“应用程序”的低级实现。

因为它在内核上下文中运行,所以它具有直接访问内核API和内存的能力。

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

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

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


0

其他人已经解释了系统级别的差异。

如果你正在使用C++进行开发,用户模式开发和内核模式开发有以下区别:

  1. 在用户模式下,未处理的异常会导致进程崩溃,但在内核模式下,它会崩溃整个系统(面对蓝屏)。
  2. 当用户模式进程终止时,系统会自动释放进程内存。但在内核模式下,在系统启动后剩余的内存会被释放。
  3. 用户模式代码编写并执行在PASSIVE_LEVEL。在内核模式下,有更多的IRQL级别。
  4. 内核代码调试使用单独的机器完成。但你可以在同一台机器上调试用户模式。
  5. 不能在内核模式中使用所有C++功能,如异常处理和STL。
  6. 入口点不同,在用户模式中,使用main作为入口点。但在内核模式下,我们需要使用DriverEntry。
  7. 不能在内核模式中使用new运算符,需要显式重载它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接