当前位置: 代码迷 >> 驱动开发 >> 大侠们看看小弟我理解的关于驱动程序的一系列顺序步骤对不对
  详细解决方案

大侠们看看小弟我理解的关于驱动程序的一系列顺序步骤对不对

热度:18   发布时间:2016-04-28 10:42:08.0
大侠们看看我理解的关于驱动程序的一系列顺序步骤对不对?
刚自学驱动开发,看的是张帆的 windows驱动开发技术详解,自学中,才看了前几章,很多地方觉得有些迷糊,今天梳理了一下,写出来,请大侠们看看我理解的对不对?主要驱动对象和设备对象的一些通俗的理解,和操作系统的实现步骤。

举例来说一下吧。比如:
1、我要访问磁盘
2、调用了win32的API
3、这个API通知操作系统我要访问磁盘
4、通过Native API传递给内核里的系统服务函数
5、操作系统在系统服务描述表SSDT里找啊找,找到了相关的服务后
6、操作系统的对象管理器创建驱动对象(起个名字叫AAA)
7、操作系统的配置管理器搜索注册表中的服务键(起个名字叫BBB)
8、然后,进入驱动程序,入口是DriverEntry(),参数是AAA和BBB
9、函数内部设置好IRP的派遣函数
10、用IoCreateDevice创建设备对象,并通过第一个参数pDriverObject使设备对象和驱动对象建立联系
11、执行各种想要的操作,不提
12、执行完毕后,通过DriverUnload卸载驱动对象
13、函数中写入删除设备对象的代码
14、一个完整的过程就此完毕。

我的理解就是这样的,请问大侠们,有什么不对的地方吗?或者理解有偏差的地方?请指正!
------最佳解决方案--------------------

驱动加载: 系统在枚举到设备之后,如果系统里面安装过该设备的驱动,系统就会调用该设备驱动的DriverEntry完成加载。

设备对象创建: 应用程序需要使用某个设备,会调用类似CreateFile的Windows API,驱动程序会收到IRP_MJ_CREATE,驱动需要为这个IRP创建Object,并把句柄传回给应用程序的CreateFile.后续的IOCTL就有句柄可以使用了。
------其他解决方案--------------------
引用:
8、然后,进入驱动程序,入口是DriverEntry(),参数是AAA和BBB
12、执行完毕后,通过DriverUnload卸载驱动对象


DriverEntry是在驱动加载过程中调用的。驱动加载完成之后就不会再调用了。
DriverUnload是在驱动卸载的时候调用的。
------其他解决方案--------------------
新设备驱动的查找需要即插即用管理器的支持,通过查询设备的厂商ID和设备ID,系统
会寻找与其对应的驱动程序文件,如果找不到会转会user模式,希望用户提供驱动文件。
------其他解决方案--------------------
TO Huntercao :
创建驱动对象和加载驱动是一个概念吗?
------其他解决方案--------------------
引用:
TO Huntercao :
创建驱动对象和加载驱动是一个概念吗?

不是一个概念。
------其他解决方案--------------------
TO Huntercao :

。。。。。。。。。。。。。您给通俗讲解一下吧。

------其他解决方案--------------------
TO Huntercao:
解释的太棒了,明白了!

但对于
(1)驱动加载:  插入设备(比如买了块新显卡)后,如果系统没有安装过该设备的驱动,又是怎么个情况呢,是不是就要把买显卡带的显卡驱动盘插入光驱安装 这个步骤? 您看是这样吗:
1、系统创建PDO
2、要求安装驱动程序:我把显卡驱动盘插入光驱安装
3、驱动程序创建FDO
4、显卡正常工作

(2)对于设备对象的创建:是不是可以这样理解(仍然拿显卡举例),就是说这个显卡已经安装到我的电脑并且有驱动支持了。创建设备对象,其实就是一个我准备玩个游戏要读取显卡,调用ReadFile等Windows API,也就是说设备对象的概念,是我在使用该设备的时候才创建的。每次使用都要每次创建,是吗??
------其他解决方案--------------------
差不多是这样的。
------其他解决方案--------------------
差不多是差多少呢