[windows驱动]内核态驱动架构

时间:2024-01-06 15:54:20

1、windows驱动简介:

1.1 windows组件简介:

1.2 windows驱动类型:

windows驱动分为两种基本类型:

  • 用户态驱动在用户态下执行。它们一般提供一套win32应用程序和内核态驱动或者其他操作系统组件之间的接口。譬如,从windows vista开始,所有打印机驱动都执行在用户态下。
  • 内 核态驱动在内核态下执行。包括那些管理I/O,即插即用存储,进程、线程,安全等内核态操作系统组件。内核态驱动一般是分层的。高层驱动从应用程序接受数 据,过滤数据然后把数据传递给底层功能驱动使用。一些内核驱动同时也是WDM驱动,它们遵从windows driver model。所有的WDM驱动都支持即插即用和功耗管理。对从windows 98/me、windows 2000及以后的所有操作系统版本,WDM驱动都是源码兼容的,但不是二进制代码兼容的。就跟操作系统自身一样,内核态驱动也被实现为分立的,模块化的组 件。所以内核驱动都需实现一个标准驱动例程子集。

下图又把内核态驱动分为若干类型:

[windows驱动]内核态驱动架构

正如上图所示:在驱动堆栈中有三种基本类型的内核态驱动:高层的、中间层的和底层的。这三种驱动结构上差别并不大,但功能上区别很大。

1.2.1、高层驱动。高层驱动包括各种文件系统驱动(FSDs),譬如:

  • NTFS
  • File allocation table (FAT)
  • CD-ROM file system (CDFS)

高层驱动要依赖于中间层驱动和底层驱动。

1.2.2、中间层驱动。譬如虚拟磁盘、镜像或者设备类型特定的类驱动。中间类型驱动依赖于底层驱动提供的支持。中间层驱动进一步划分为以下几种:

功能驱动(Functon drivers):控制某一个I/O总线上的特定外设。

过滤器驱动(Filter drivers):把他们插入在功能驱动上面或下面。

    • Function drivers control specific peripheral devices on an I/O bus.

    • Filter drivers insert themselves above or below function drivers.

    • Software bus drivers present a set of child devices to which still higher-level class, function, or filter drivers can attach themselves.

      For example, a driver that controls a multifunction adapter with an on-board set of heterogeneous devices is a software bus driver.

    • Any system-supplied class driver that exports a system-defined class/miniclass interface is, in effect, an intermediate driver with one or more linked miniclass drivers (sometimes called minidrivers). Each linked class/minidriver pair provides functionality that is equivalent to that of a function driver or a software bus driver.

  1. Lowest-level drivers control an I/O bus to which peripheral devices are connected. Lowest-level drivers do not depend on lower-level drivers.

    • Hardware bus drivers are system-supplied and usually control dynamically configurable I/O buses.

      Hardware bus drivers work with the Plug and Play manager to configure and reconfigure system hardware resources, for all child devices that are connected to the I/O buses that the driver controls. These hardware resources include mappings for device memory and interrupt requests (IRQs). (Hardware bus drivers subsume some of the functionality that the HAL component provided in releases of the Windows NT-based operating system earlier than Windows 2000.)

    • Legacy drivers that directly control a physical device are lowest-level drivers.

1.3 内核态驱动设计目标:

2、内核态管理器、库和它们提供的驱动支持例程

2.1、 Windows Kernel-Mode Object Manager

作为windows软件开发人员,我们经常要创建、打开和处理内核对象,内核对象是由内核对象管理器负责创建和维护的。windows系统有超过25种内核对象,每个内核对象实例都只有一个内存块,这个内存块是一个数据结构,其成员维护着与对象相关的信息。少数成员(安全描述符和使用计数等)是所有对象都有的,但其他大部分成员都是不同类型的对象特有的。内核对象管理器提供了API供应用程序访问或修改这些成员。

windows的对象管理器主要完成以下主要工作:

  • 管理对象的创建和销毁;
  • 维护对象命名空间数据库以便跟踪对象信息;
  • 负责记录资源是由哪一个进程创建的;
  • 管理对象访问权限以保证对象安全;
  • 管理对象生存期,决定何时应该自动销毁对象以收回资源空间。

对象管理器并不直接创建对象。因为前面我们已经说到,不同种类内核对象的数据机构中只有少数成员是相同的,其它成员是不同内核对象所特有的。所以,内核对象由不同的windows内核组件创建,但对象管理器负责管理它们的公有数据成员属性,主要是生存期(引用计数)、对象安全和对象属性。

[例]几个对象创建函数及它们所属组件:

2.2、 Windows Kernel-Mode Memory Manager

2.3、 Windows Kernel-Mode Process and Thread Manager
2.4、 Windows Kernel-Mode I/O Manager
2.5、 Windows Kernel-Mode Plug and Play Manager
2.6、 Windows Kernel-Mode Power Manager
2.7、 Windows Kernel-Mode Configuration Manager
2.8、 Windows Kernel-Mode Kernel Transaction Manager
2.9、 Windows Kernel-Mode Security Reference Monitor
2.10、Windows Kernel-Mode Kernel Library(windows内核态内核库,绕口令呢)

一个操作系统的内核实现了它的核心功能,操作系统的其它部分的运行都要依赖于操作系统内核。windows操作系统内核提供了譬如线程调度、硬件中断路由等底层操作。内核是操作系统的心脏,所以它所执行的所有任务都必须快速而简单。windows内核接口例程一般带有前缀“Ke”,要查看内核的接口清单,可以参考MSDN主题Kernel Library Support Routines

2.11、Windows Kernel-Mode Executive Support Library
2.12、Windows Kernel-Mode Run-Time Library
2.13、Windows Kernel-Mode Safe String Library
2.14、Windows Kernel-Mode DMA Library
2.15、Windows Kernel-Mode HAL Library
2.16、Windows Kernel-Mode CLFS Library
2.17、Windows Kernel-Mode WMI Library

3、内核数据类型

windows内核定义了许多数据类型,枚举和常量,内核态驱动可以使用这些系统定义去实现标准驱动例程,调用驱动支持函数。另外,windows内核还为I/O请求包定义了功能码。详细说明如下:

3.1、系统定义的整数数据类型:

3.2、系统定义的枚举和常量:

3.3、系统定义的数据结构类型:

3.3.1、DEVICE_OBJECT结构体:

windows操作系统通过DEVICE_OBJECT描述设备,一个设备对象可以代表一个逻辑、虚拟或者物理设备。驱动通过IoCreateDevice或IoCreateDeviceSecure例程创建设备对象。设备对象是部分透明的,所以,除非有文档说明,驱动不能直接设置设备对象的成员。不透明的成员必须被认为是不可存取的,如果驱动依赖不透明的成员,那么这个驱动将不能被保证是可移植的、也不能保证可以与其他驱动交互。

3.4、系统定义的驱动接口:

3.5、IRP功能码:

微软使用I/O请求包向驱动发送消息。IRP是一个

Microsoft Windows use I/O Request Packets (IRPs) to send messages to device drivers. An IRP is a data structure that contains specific information used to convey the status of an event. For more information about the IRP data structure, see IRP.

Your driver can use System-Supplied Driver Interfaces to send IRPs to other drivers.

In addition to the Standard IRP Codes, there are three additional types of IRPs for specific technologies:

  • Plug and Play IRPs

  • Power Management IRPs

  • Windows Management Instrumentation (WMI) IRPs

4、驱动编程技术