WDM驱动程序设计之设计开发篇

windows驱动开发4:WDM、WDF等驱动基本概念 WDM、WDF等驱动基本概念 阅读详情
WDM驱动程序设计之设计开发篇
(作者:苏金国 2000年11月09日 13:26)

通过安装DDK和相应的开发软件,我们构造好了WDM驱动程序的开发环境。接着,我们就要深入进行设计与开发工作了。
  ■WDM 驱动程序的运作流程

  WDM本身的PNP管理器被抽象地提升到了ROOT的地位。PNP管理器负责所有的总线驱动程序的加载。总线驱动程序则负责遍历所有位于总线上的设备,并且为每个设备创建相应的设备对象。当PNP管理器发现一个设备对象,就查找该对象对应的Driver。并调用该Driver的ADD DEVICE例程。如果Driver不在内存中,就先加载,然后调用ADD DEVICE例程。

  当然,总线本身并没有发出任何信号告诉PNP管理器自己的存在,所以,总线Driver是在NT的安装时设定的。而ISA设备并没有规范,因为需要KMD自己检查硬件存在及状态,所以它是老式KMD存在的惟一理由。这也是微软极力在新规范里取消ISA总线的理由之一。WDM支持PNP协议和PM协议,而且实现时仅仅需要在MAJOR FUNCTION里加入一些对PNP和PM事件响应的例程即可。

  ■驱动程序设计

  设计一个设备驱动程序,应该支持和其他相同类型设备的NT驱动程序相同的IRP_MJ_XXX和IOCTL请求代码。如果设计一个中间层NT驱动程序,应该首先确认下层驱动程序所管理的设备,因为一个高层的驱动程序必须具有低层驱动程序绝大多数IRP_MJ_XXX例程入口。高层驱动程序在接到I/O请求时,在确定自身IRP当前堆栈单元参数有效的前提下 ,设置好IRP中下一个低层驱动程序的堆栈单元,然后再调用IoCallDriver将请求传递给下层驱动程序处理。一旦决定好了驱动程序应该处理哪些IRP_MJ_XXX,就可以开始确定驱动程序应该有多少个Dispatch例程。当然也可以考虑把某些RP_MJ_XXX处理的例程合并为同一例程处理。例如在ChangerDisk和VDisk里,对IRP_MJ_CREATE和IRP_MJ_CLOSE处理的例程就是同一函数。

  一个驱动程序必须为它所管理的每个可能成为I/O请求的目标的物理和逻辑设备创建一个Device对象。一些低层的驱动程序还可能要创建一些不确定数目的Device对象。例如一个硬盘驱动程序必须为每一个物理硬盘创建一个Device对象,同时还必须为每个物理磁盘上的每个逻辑分区创建一个Device对象。

  一个高层驱动程序必须为它所代表的虚拟设备创建一个Device对象,这样更高层的驱动程序才能连接它们的Device对象到这个驱动程序的Device对象。另外,一个高层驱动程序通常为它低层驱动程序所创建的Device对象创建一系列的虚拟或逻辑Device对象。

  尽管可以分阶段来设计驱动程序,从而使一个处在开发阶段的驱动程序不必一开始就创建出所有它将要处理的所有Device对象,但从一开始就确定好最终要创建的所有Device对象将有助于设计者所要解决的任何同步问题。另外,确定所要创建的Device对象还有助于定义Device对象的Device Extension的内容和数据结构。

  ■驱动程序开发

  驱动程序的开发是一个从粗到细逐步求精的过程。NT DDK的src/目录下有一个庞大的模板代码,几乎覆盖了所有类型的设备驱动程序、高层驱动程序和过滤器驱动程序。在开始开发驱动程序之前,应该先在这个样板库下面寻找是否有和所要开发的类似类型的例程。

  例如若要开发光盘塔驱动程序,虽然DDK对光盘塔没有任何描述,但光盘塔是符合SCSI-Ⅱ规范的SCSI设备,可以在src/storage/class目录中发现很多和SCSI设备有关的驱动程序,例如SCSI Tape、SCSI Disk、SCSI CDROM等驱动程序开发时,可以参考类似驱动程序,从而减化开发难度。

  下面笔者将进一步介绍开发驱动程序的基本步骤:

  l.编写驱动程序框架

  (1)首先编写一个DriverEntry例程,并在该例程里调用IoCreateDevice来创建一个Device对象。

  (2)写一个处理IRP_MJ_CREATE请求的Dispatch例程的基本框架。如果驱动程序创建了多于一个的Device对象,则必须为IRP_MJ_CLOSE请求写一个例程,该例程通常情况下可以和DispatchCreate共用一个例程。

  (3) 编译连接驱动程序。

  2.测试驱动程序

  (1)首先在系统中安装好驱动程序,具体编译安装驱动程序请见下版的《编译安装篇》。

  (2)为NT逻辑设备名称和目标Device对象名称之间建立起符号连接,在前面已经知道Device对象名称对Win32用户模式是不可见的,是不能直接通过API来访问的,Win32 API只能访问NT逻辑设备名称。可以通过修改注册表来建立这两种名称之间的符号连接。运行Regedt32.exe在/HKEY_LOCAL_MACHINE/ System/ CurrentControlSet/ Control/ Session Manager/ DOS Devices下建立起符号连接,这种符号连接也可以在驱动程序里调用函数IoCreateSymbolicLink来创建。

  (3)完成以上所有的设置并检查无误后,我们必须重新启动Windows系统。

  (4)编写一个简单的测试程序调用Win32 API中的CreateFile函数,并以刚才命名的NT逻辑设备名打开这个设备。如果打开成功,则成功地写出了一个最简单的驱动程序了。支持更多的设备I/O请求,例如驱动程序可能需要对IRP_MJ_READ请求做出响应(完成后可用ReadFile 函数进行测试)。如果驱动程序需要能够手工卸载,那么还必须对IRP_MJ_CLOSE做出响应。为所需要处理的IRP_MJ_XXX写好处理例程,并在DriverEntry里面初始化好这些例程入口。一个低层的驱动程序需要一个StartIo、ISR和DpcForIsr例程,可能还需要一个SynchCritSection例程,如果设备使用了DMA,那么可能还需要一个AdapterControl例程。

  对于高层驱动程序可能需要一个或多个IoCompletion例程,最起码完成检查I/O状态块然后调用IoCompleteRequest的工作。如果需要,还要对Device Extension数据结构和内容做些修改。有一点必须很清楚的,就是代码运行级别的问题,即IRQL,最常见的级别是PASSIVE_LEVEL、APC_LEVEL、DISPATCH_LEVEL和DIRQL。

  在看NT DDK HELP中的函数说明的时候,要注意函数的可运行级别,比如有的函数只能在PASSIVE_LEVEL下运行,有的函数则可以在DISPATCH_LEVEL以下级别运行,级别越高的时候,对代码的要求就越严格,比如在DISPATCH_LEVEL的时候,就不能使用分页内存。通常情况下应该尽可能让代码在低运行级别如PASSIVE_LEVEL下运行,在高级别下运行过长时间将导致系统效率降低、影响系统响应的实时性。但有时候自己无法控制运行的级别,例如在调用低层Driver时使用IoCallDriver,低层Driver响应完毕后会执行completion例程,该例程运行的级别就是由低层Driver来决定。因此在编写completion例程时,应尽量将这个函数设计成能在DISPATCH_LEVEL级别运行。

  依照以上开发步骤,我们可以设计出全新的WDM设备驱动程序。

Windows驱动开发WDM (2)- 一个简单的WDM驱动程序 这个例子是从《windows驱动开发技术详解》的光盘上copy的,我只是自己稍微改了一下。   入口函数DriverEntry #pragma INITCODE extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath) { KdPri 阅读详情

相关推荐

Windows驱动开发WDM (1) - 基本结构

陆陆续续做过一些驱动开发,但是一直以来都没有系统的学习过。这次重新阅读《windows驱动开发技术详解》(张帆,史彩成等编著),写博客记录一下,用以加深自己对驱动的理解。   驱动对象(DRIVER_OBJECT) 每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载的时候,被内核中的对象管理程序所创建的。 驱动对象用DRIVER_OBJECT来表示,内核对一个驱动只加载

zj510的专栏 1万+

PCI设备的WDM驱动程序设计-9054

PCI9054设备的WDM驱动程序设计-源代码与详细设计指导.rar

驱动开发函数详解之Wdm

整理常用函数

成功的方式只有一个,按自己的方式,度过人生。欢迎共赴知识与乐趣的探索之旅! 930

WDM驱动程序实例源码

WDM驱动程序实例源码很少,本源码呈现WDM驱动程序的结构。

WDM系统入门基础

WDM(Win32 Driver Model),即Win32驱动程序模型,是Microsoft力推的全新驱动程序模式,旨在通过提供一种灵活的方式来简化驱动程序的开发,在实现对新硬件支持的基础上减少并降低所必须开发驱动程序的数量和复杂性。   除了通用的平台服务和扩展外,WDM还实现了一个模块化的、分层次类型的微型驱动程序结构(见图1)。类型驱动程序实现了支持通用总线、协议或设备类所需的功能性接口

xuplus的专栏 3242

Windows驱动开发系列之二:WDM设备驱动开发入门

我将带领大家学习WDM驱动开发,包括重要的理论与实践。我们逐步深入,在系列一的基础上慢慢推进,开始学习WDM驱动模型,包括重要的IRP及派遣函数,具体章节包括:1)PNP即插即用管理2)电源管理3)IO端口管理4)PCI配置空间管理 Windows内核开发寄语:1、Windows内核非常复杂,相关图书和课程都很少,让很多初学者望而生畏;没关系,我带领大家别有兴致地来领略Windows内核的神秘,解开面纱,层层深入。2、本书以Windows10x64位基准,所有程序都编译、运行在Vmware的Win10x64位机器上。vs2019+wdk3、内核学习并不可怕,授人以鱼不如授人以渔,艺多不压身,学习能提升人的综合能力,尤其是核心技术。

Windows驱动开发系列之三:WDF驱动开发入门

我将带领大家学习WDM驱动开发,包括重要的理论与实践。我们逐步深入,在系列一和二的基础上慢慢推进,开始学习WDF驱动模型,包括面向对象和事件机制、重要的WDF对象,具体章节包括:1)WDF编程框架:面向对象和事件机制2)WDF重要对象:驱动对象、设备对象、IO队列、IO请求、等3)事件回调函数:从派遣函数到事件回调函数的原理流程解析4)WDF过滤驱动:掌握WDF对IRP的处理,以及过滤驱动的应用5)WDF驱动安装:掌握驱动安装原理和INF文件的重要概念 Windows内核开发寄语:1、Windows内核非常复杂,相关图书和课程都很少,让很多初学者望而生畏;没关系,我带领大家别有兴致地来领略Windows内核的神秘,解开面纱,层层深入。2、本书以Windows10x64位基准,所有程序都编译、运行在Vmware的Win10x64位机器上。vs2019+wdk3、内核学习并不可怕,授人以鱼不如授人以渔,艺多不压身,学习能提升人的综合能力,尤其是核心技术。

WDM驱动程序设计设计开发 (转)

WDM驱动程序设计设计开发 (转)[@more@](作者:苏金国 2000年11月09日 13:26)通过安装DDK和相应的开发软件,我们构造好了WDM驱动程序的开发环境。接着,我们就要深入进行设计开发工作了。   ■WD...

csd3176的博客 86

WDM驱动程序设计

WDM驱动程序设计  一.WDM简介  微软不断推出新的操作系统,现在Windows98和Windows2000已经成了主流,原先用来实现驱动程序的VxD技术随着Win95的淡出也慢慢地将退出历史舞台,在Windows98和Windows2000中设备驱动程序将根据Windows驱动程序模型(WDM)来设计WDM通过提供一种灵活的方式来简化驱动程序的开发,在实现对新硬件支持的基础上减少并降低

不论你在什么时候开始,重要的是开始之后就不要停止。 2062

WDM驱动编程配套源码.rar

wdm驱动开发的配套源码光盘,适合开发学习使用。

WDM驱动开发

WDM驱动开发之路 (一)了解 WDM模型(Windows Driver Model)是微软公司为当前主流操作系统Windows98和Windows 2000的驱动程序设计的一种构架。它和传统的win3.x和win95使用的vxd的驱动是完全不同的体系结构。不过对于最终用户来说,WDM驱动程序在Windows98和Windows2000下的表现很相似。作为驱动开发人员来说,它在两者中有...

@you的博客 1763

WDM驱动开发入门:HelloWorld教程

WDM(Windows Driver Model)是微软为Windows操作系统定义的一种驱动模型,它建立在Windows NT核心架构之上,为驱动开发者提供了一套规范和标准。WDM旨在实现硬件与操作系统的解耦,通过抽象层来简化硬件驱动开发和维护工作。物理设备对象(PDO)代表了硬件设备在系统中的真实存在。每个硬件设备至少有一个PDO,它是由总线驱动程序创建的。PDO是设备对象层次结构中的最底层,它直接与硬件通信。

weixin_32925455的博客 1286

Windows WDM驱动开发全面指南

Windows驱动程序模型(WDM)是一种架构,允许开发者编写可以在Windows操作系统上运行的硬件设备驱动程序。本章将介绍WDM驱动程序的基础知识和核心概念,为读者奠定坚实的理论基础。WDM驱动程序是分层的,可兼容32位和64位版本的Windows系统。驱动程序被设计为响应来自用户模式应用程序的请求,并通过一系列预定义的驱动程序接口(DDI)与系统内核通信。在本章节中,我们深入探讨了PnP和PM的核心原理及其在Windows环境中的实现。

weixin_32661831的博客 881

WDM驱动程序设计之基础知识

WDM驱动程序设计之基础知识(作者:苏金国 2000年11月09日 13:26)WDM(Win32 Driver Model),即Win32驱动程序模型,是Microsoft力推的全新驱动程序模式,旨在通过提供一种灵活的方式来简化驱动程序的开发,在实现对新硬件支持的基础上减少并降低所必须开发驱动程序的数量和复杂性。   除了通用的平台服务和扩展外,WDM还实现了一个模块化的、分层次类型的微型驱

tchaikov的专栏 1070

Windows驱动开发模式(WDM)编程基础

WDM(Windows Driver Model)是微软公司开发的一种驱动程序架构,用于实现硬件设备与Windows操作系统的通信。它支持多个设备和设备类别,包括键盘、鼠标、显示器、打印机等。WDM驱动不仅管理硬件资源,还负责将硬件的物理特性抽象化,提供给上层应用程序一个统一的接口。WDM驱动程序通常被分为功能驱动(Function Driver)和过滤驱动(Filter Driver)。功能驱动直接与设备进行交互,处理设备特定的任务;

weixin_42430341的博客 1348
上一篇: WDM驱动程序设计之环境构造篇
下一篇: WDM驱动程序设计之编译安装篇
tchaikov
博客等级 码龄26年 14粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值