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驱动都是源码兼容的,但不是二进制代码兼容的。就跟操作系统自身一样,内核态驱动也被实现为分立的,模块化的组 件。所以内核驱动都需实现一个标准驱动例程子集。

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

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

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、驱动编程技术

[windows驱动]内核态驱动架构的更多相关文章

  1. Linux I2C驱动--用户态驱动简单示例

    1. Linux内核支持I2C通用设备驱动(用户态驱动:由应用层实现对硬件的控制可以称之为用户态驱动),实现文件位于drivers/i2c/i2c-dev.c,设备文件为/dev/i2c-0 2. I ...

  2. 聊聊Linux用户态驱动设计

    序言 设备驱动可以运行在内核态,也可以运行在用户态,用户态驱动的利弊网上有很多的讨论,而且有些还上升到政治性上,这里不再多做讨论.不管用户态驱动还是内核态驱动,他们都有各自的缺点.内核态驱动的问题是: ...

  3. Linux用户态驱动设计

    聊聊Linux用户态驱动设计   序言 设备驱动可以运行在内核态,也可以运行在用户态,用户态驱动的利弊网上有很多的讨论,而且有些还上升到政治性上,这里不再多做讨论.不管用户态驱动还是内核态驱动,他们都 ...

  4. Windows网络驱动、NDIS驱动(微端口驱动、中间层驱动、协议驱动)、TDI驱动(网络传输层过滤)、WFP(Windows Filtering Platform)

    catalog . 引言 . Windows 2000网络结构和OSI模型 . NDIS驱动 . NDIS微端口驱动编程实例 . NDIS中间层驱动编程实例 . NDIS协议层驱动编程实例 . TDI ...

  5. [windows驱动]windows8.1驱动调试前戏

    人们都说在干正事之前,得先做足前戏才会爽,我一直很认同这个观点,下面我来总结下进行windows8.1的WDK调试所要做的准备工作. 软件安装: 1.VS2013. 2.WDK8.1 3.Window ...

  6. [国嵌攻略][155][I2C用户态驱动设计]

    用户态驱动模型 用户态驱动模型首先是一个应用程序,其次是在这个用户程序中通过内核调用来驱动设备. IIC通用驱动代码 IIC通用驱动程序的代码在/drivers/i2c/i2c-dev.c中.一次读操 ...

  7. [中英对照]Device Drivers in User Space: A Case for Network Device Driver | 用户态设备驱动: 以网卡驱动为例

    前文初步介绍了Linux用户态设备驱动,本文将介绍一个典型的案例.Again, 如对Linux用户态设备驱动程序开发感兴趣,请阅读本文,否则请飘过. Device Drivers in User Sp ...

  8. Linux ALSA声卡驱动之一:ALSA架构简介

    声明:本博内容均由http://blog.csdn.net/droidphone原创,转载请注明出处,谢谢! 一.  概述 ALSA是Advanced Linux Sound Architecture ...

  9. Linux ALSA声卡驱动之一:ALSA架构简介【转】

    本文转载自:http://blog.csdn.net/droidphone/article/details/6271122 声明:本博内容均由http://blog.csdn.net/droidpho ...

随机推荐

  1. mac10.12的Cocopods安装使用

    Cocopods的安装 CocoaPods应该是iOS最常用最有名的类库管理当我们开发iOS应用时,会经常使用到很多第三方开源类库,比如AFNetWorking等等,可能某个类库又用到其他的库,手动一 ...

  2. eclipse+adt+sdk开发环境搭配

    1.开发环境配置 http://www.mamicode.com/info-detail-516839.html

  3. 有关Flash Player的内存管理及泄露检测

    1.Flash Player分配内存的策略是少量请求大内存块, 也就是不会频繁向系统请求内存. 2.Flash Player内存的回收是根据引用计数和标记清除(比较耗cpu)这两种方法. 3.从理论上 ...

  4. IOS下移除按钮原生样式 -webkit-appearance

    IOS环境下的按钮都是经过美化的,但通常我们在设计web app的时候不需要这些看上去老土的样式,所以,去除这些显得很有必要. 下面这句代码就是重置这些样式的: -webkit-appearance: ...

  5. js数据类型和关系运算语法

    var box=; alert(typeof box); //box是Undefined类型,值是undefined,类型返回的字符串是undefined var box=true; alert(ty ...

  6. [maven] 常用仓库地址

    共有的仓库 http://mvnrepository.com/ http://repo1.maven.org/maven2/ http://repository.jboss.com/maven2/ h ...

  7. poi 读取 excel (.xls) 97-2003

    1.sh.getLastRowNum() 比行数少1 private List<Map> getData(File file) throws Exception{ List<Map& ...

  8. cookie与sessionID之间的关系实验

    上一篇介绍了cookie,这里来看看cookie与sessionID之间有什么关系. 一.编写测试用例代码 新建一个servlet如下: public class SessionServlet ext ...

  9. input 中的enabled与disabled属性

    <style type="text/css"> *{ padding:; margin:; list-style-type: none; box-sizing:bord ...

  10. Eclipse如何设置代码提示功能

    Windows→Preference→XML→XML Files→Editor→Content Assist→Auto Activation→Prompt when these characters ...