打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
WDM类型USB设备驱动程序中 驱动程序栈、设备栈、驱动程序对象、设备对象、IRP堆栈之间是什么关系
驱动对象是操作系统首次装载一个驱动程序时创建的记录这个驱动程序的数据结构(实际上就是一个windows定义的结构体)。
设备对象是操作系统针对硬件设备建立的描述记录其相关信息的数据结构。
正因为如此,一个驱动对象可以对应多个设备对象(同一个驱动对象的设备对象挂接在一个链表中)。
irp即i/o请求包,用于驱动程序与操作系统之间的通信,用于完成实体的操作,也是一个数据结构。
驱动程序,设备,i/o请求包在操作系统中都是以栈的形式组织的。几者之间的关系大致是这样的: 驱动对象由操作系统创建,作为driverentry的第一个参数传给你的驱动程序。你的驱动程序需要对该对象的一些字段进行初始化,包括driverstartio(指向Startio入口函数的指针),driverunload(指向driverunload入口函数的指针),majorfunction(一个数组,数组中每个元素又是一个指向不同入口函数的指针。接受不同的irp时,操作系统会自动调用不同的入口函数),deviceobject(指向链表的指针,链表即之前提到的驱动程序上挂接的设备对象),driverextension(指向另一个结构体,该结构体中唯一有用的字段为adddevice,该字段指向一个入口函数,当操作系统发现一个新的设备实例时自动调用adddevice函数,该函数中应该写一些与设备实例初始化工作的代码)。 设备对象可以利用内核API函数iocreatedevice创建。操作系统负责部分字段初始化和分配内存空间,驱动程序中接收到irp-mn-remove-device消息将删除设备对象,亦可以调用内核api函数iodeletedevice删除设备对象。设备对象中的字段较多,恕我既不清了,可以找本书参考一下。 irp对象中也有很多字段,也记不清了。操作系统创建完irp后,调用iogetnextirpstacklocation函数获得该irp下一个栈单元的指针。然后初始化这个栈单元。初始化完成后可以调用iocalldriver函数把irp发送到设备驱动程序的派遣例程。驱动程序的派遣例程接收到irp后一般有三种处理方式:立即完成该irp,传递到同一个堆栈的下层驱动程序,排队该irp以便由该驱动程序中的其他例程处理。irp请求的操作做完后,程序员要做:用恰当的状态码填充irp受不得iostatus结构的status成员,以通知发送发完成的状态;填充irp首部的iostatus结构的information成员,传递其他完成信息;以该irp为参数调用iocompleterequest例程。iocompleterequest主要完成工作如下:依次调用挂接在irp上的完成例程;将mdladdress域对应的物理内存解锁;触发一个同步事件,激活发送方,发送方将做最后的清除工作(咱们可以简单的理解为通知的作用) 驱动程序确实概念繁杂,内容很多,不过学习过程中还是很有成就感的,建议你买一本好的书看一下
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
WDM驱动程序的组成
关于用户态和内核态的初步理解
【心经】 浅谈 windows 驱动开发
内核模式和用户模式
Windows 驱动开发笔记(一)
用 VB 做 USB 通信程序及USB基础知识
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服