2011-05-15 444 views
3

与WDK一起编写的Windows内核驱动程序是什么?什么是Windows内核驱动程序?

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

+0

请阅读[内核维基百科条目](http://en.wikipedia.org/wiki/Kernel_(computing))。这应该使差异非常明显。 – DarkDust 2011-05-15 07:53:45

回答

10

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

长话短说:

  • 驱动程序使用本机API,而不是在Win32 API
    • 这意味着,司机一般都不会显示任何UI。
  • 驱动程序需要管理内存以及显式分页内存 - 使用分页池和非分页池等内容。
  • 驱动程序需要处理进程上下文切换,而不依赖于哪个进程在运行时碰巧拥有页表。
  • 驱动程序无法由受限用户安装到内核中。
  • 驱动程序以处理器级别的特权运行。
  • 用户级程序出错会导致程序进程终止。驾驶员出现故障会导致系统显示蓝屏死机。
  • 驱动程序需要处理低级硬件位,如中断和中断请求级别(IRQL)。
+0

我可以从本地驱动程序使用Win32 API吗? WDK中有一个用于获取进程名称的示例。我在WinAPI中也是这样做的。 – userbb 2011-05-15 08:06:49

+1

@userbb:否。驱动程序无法调用Windows子系统 - 它的运行级别低于子系统。 (实际上,通常在Windows子系统启动之前加载)您可以在Windows程序和Native程序中获得进程的名称。在Native程序中,只能使用Native API,而在Windows程序中,您可以使用Native API或Windows API。 – 2011-05-15 08:08:39

+1

@userbb:即,驱动程序必须调用'ZwQueryInformationProcess'才能获取进程名称。应用程序可以调用'ZwQueryInformationProcess','NtQueryInformationProcess'或'EnumProcessModules'。 – 2011-05-15 08:11:52

2

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

总是要编写内核模式模块来实现device drivers

0

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

例如,内核驱动程序应使用:将文件

  • 控制访问(密码保护,隐藏)
  • 允许访问非标准的文件系统(如电话分机,reiserfs的,ZFS等)和设备
  • 真正的API钩子
  • ...还有许多其他原因

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

相关问题