Leonsoft
驱动小牛
驱动小牛
  • 注册日期2003-05-08
  • 最后登录2012-08-11
  • 粉丝1
  • 关注0
  • 积分21分
  • 威望281点
  • 贡献值1点
  • 好评度103点
  • 原创分0分
  • 专家分0分
20楼#
发布于:2005-03-22 13:13
1.PnP管理器为每个设备实例调用AddDevice routine,如果有设备的,首先要在inf文件里面指定加载的设备,如果一个设备也没有的话,嘿嘿,就像filter driver,你总要加到某个driver上去吧,所以AddDevice总会被调用的,才能生成设备栈,这样才符合WDM的构架。
2.何时load driver,由inf文件的start type来决定,如3,就是booting windows时候加载driver,如果为1,就是由自己的用户程序使用到driver的时候,来加载它,当然要有管理员的权限,通过CreateService,StartSerive来实现动态安装driver,其实就是交给system.exe来实现。
3.内核模式的例程运行在下面三种不同的上下文之一:
- 系统进程上下文
- 特定用户线程(和进程)上下文
- 任意用户线程(和进程)上下文
一个驱动程序的DriverEntry(…)函数总是运行在系统进程的上下文中,系统进程上下文和用户上下文无关(因此没有TEB)。DPCs(例如一个驱动程序为ISR服务的DPC或者定时器到期函数)运行在任意用户线程的上下文中。这意味者在一个DPC的执行过程中,任何用户线程都可以成为“当前”线程,因此任何用户进程都可以映射到内核虚拟地址空间的低2GB中。当一个设备直接被用户访问而不涉及其他驱动程序时,该设备的驱动程序的分派线程总是运行在发出请求的用户线程中。
4.DriverEntry只会被调用一次,AddDevice可以被多个设备调用,so,DeviceExterntion对应每一个设备。全局变量只有一个,so,必须作互斥访问。

以上只是个人理解,可能有不对的地方,还请高人指教。
I will do the best with what the God gave me.
stoneyr
驱动牛犊
驱动牛犊
  • 注册日期2002-01-13
  • 最后登录2007-10-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
21楼#
发布于:2005-03-22 18:46
1.PnP管理器为每个设备实例调用AddDevice routine,如果有设备的,首先要在inf文件里面指定加载的设备,如果一个设备也没有的话,嘿嘿,就像filter driver,你总要加到某个driver上去吧,所以AddDevice总会被调用的,才能生成设备栈,这样才符合WDM的构架。
2.何时load driver,由inf文件的start type来决定,如3,就是booting windows时候加载driver,如果为1,就是由自己的用户程序使用到driver的时候,来加载它,当然要有管理员的权限,通过CreateService,StartSerive来实现动态安装driver,其实就是交给system.exe来实现。
3.内核模式的例程运行在下面三种不同的上下文之一:
- 系统进程上下文
- 特定用户线程(和进程)上下文
- 任意用户线程(和进程)上下文
一个驱动程序的DriverEntry(…)函数总是运行在系统进程的上下文中,系统进程上下文和用户上下文无关(因此没有TEB)。DPCs(例如一个驱动程序为ISR服务的DPC或者定时器到期函数)运行在任意用户线程的上下文中。这意味者在一个DPC的执行过程中,任何用户线程都可以成为“当前”线程,因此任何用户进程都可以映射到内核虚拟地址空间的低2GB中。当一个设备直接被用户访问而不涉及其他驱动程序时,该设备的驱动程序的分派线程总是运行在发出请求的用户线程中。
4.DriverEntry只会被调用一次,AddDevice可以被多个设备调用,so,DeviceExterntion对应每一个设备。全局变量只有一个,so,必须作互斥访问。

以上只是个人理解,可能有不对的地方,还请高人指教。


好,要的就是你这样的回答。
但是对于第二个问题,可能是我没有表达清楚,还有一个重点的小问题在里面:由于是在AddDevice里调用IoRegisterDeviceInterface的,而AddDevice是在DriverEntry以后才会被调用,而这个DeviceInterface是提供给就用程序的,就用程序只有找到该DeviceInterface后才能启动驱动程序(我们暂时不说在系统启动时加载的那种类型),这样才能调用DriverEntry,再调用AddDevice,再调用IoRegisterDeviceInterface,那这个不就是一个鸡生蛋,蛋生鸡的问题了吗?
tigerL
驱动小牛
驱动小牛
  • 注册日期2003-12-24
  • 最后登录2008-10-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望23点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
22楼#
发布于:2005-03-22 22:32

好,要的就是你这样的回答。
但是对于第二个问题,可能是我没有表达清楚,还有一个重点的小问题在里面:由于是在AddDevice里调用IoRegisterDeviceInterface的,而AddDevice是在DriverEntry以后才会被调用,而这个DeviceInterface是提供给就用程序的,就用程序只有找到该DeviceInterface后才能启动驱动程序(我们暂时不说在系统启动时加载的那种类型),这样才能调用DriverEntry,再调用AddDevice,再调用IoRegisterDeviceInterface,那这个不就是一个鸡生蛋,蛋生鸡的问题了吗?


驱动程序不是由应用程序启动的。DeviceInterface只是用来获得访问驱动程序所创建设备对象的句柄而已,它与驱动程序的启动无关。
关于驱动程序的启动,可以参看ddk文档,里面有比较详尽的解说。
省元坊
Leonsoft
驱动小牛
驱动小牛
  • 注册日期2003-05-08
  • 最后登录2012-08-11
  • 粉丝1
  • 关注0
  • 积分21分
  • 威望281点
  • 贡献值1点
  • 好评度103点
  • 原创分0分
  • 专家分0分
23楼#
发布于:2005-03-23 11:57
[quote]1.PnP管理器为每个设备实例调用AddDevice routine,如果有设备的,首先要在inf文件里面指定加载的设备,如果一个设备也没有的话,嘿嘿,就像filter driver,你总要加到某个driver上去吧,所以AddDevice总会被调用的,才能生成设备栈,这样才符合WDM的构架。
2.何时load driver,由inf文件的start type来决定,如3,就是booting windows时候加载driver,如果为1,就是由自己的用户程序使用到driver的时候,来加载它,当然要有管理员的权限,通过CreateService,StartSerive来实现动态安装driver,其实就是交给system.exe来实现。
3.内核模式的例程运行在下面三种不同的上下文之一:
- 系统进程上下文
- 特定用户线程(和进程)上下文
- 任意用户线程(和进程)上下文
一个驱动程序的DriverEntry(…)函数总是运行在系统进程的上下文中,系统进程上下文和用户上下文无关(因此没有TEB)。DPCs(例如一个驱动程序为ISR服务的DPC或者定时器到期函数)运行在任意用户线程的上下文中。这意味者在一个DPC的执行过程中,任何用户线程都可以成为“当前”线程,因此任何用户进程都可以映射到内核虚拟地址空间的低2GB中。当一个设备直接被用户访问而不涉及其他驱动程序时,该设备的驱动程序的分派线程总是运行在发出请求的用户线程中。
4.DriverEntry只会被调用一次,AddDevice可以被多个设备调用,so,DeviceExterntion对应每一个设备。全局变量只有一个,so,必须作互斥访问。

以上只是个人理解,可能有不对的地方,还请高人指教。


好,要的就是你这样的回答。
但是对于第二个问题,可能是我没有表达清楚,还有一个重点的小问题在里面:由于是在AddDevice里调用IoRegisterDeviceInterface的,而AddDevice是在DriverEntry以后才会被调用,而这个DeviceInterface是提供给就用程序的,就用程序只有找到该DeviceInterface后才能启动驱动程序(我们暂时不说在系统启动时加载的那种类型),这样才能调用DriverEntry,再调用AddDevice,再调用IoRegisterDeviceInterface,那这个不就是一个鸡生蛋,蛋生鸡的问题了吗? [/quote]

DriverEntry 和AddDevice的调用由PnP management来掌控。

哥们,请给分阿,嘿嘿。
I will do the best with what the God gave me.
stoneyr
驱动牛犊
驱动牛犊
  • 注册日期2002-01-13
  • 最后登录2007-10-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
24楼#
发布于:2005-03-23 13:15
关键是一个先与后的问题呀,
应用程序总得要有接口才能通知PNP管理器调用DriverEntry,
但是在AddDevice里接口才被注册,
而在DriverEntry里才能通知到PNP管理器AddDevice的地址,

这样的话,刚开始的时候,应用程序怎么知道接口在哪呢?
coffeemay
驱动牛犊
驱动牛犊
  • 注册日期2005-10-13
  • 最后登录2009-04-22
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望23点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
25楼#
发布于:2007-06-13 14:30
跟帖做个记号,以后好找
oktsl
驱动牛犊
驱动牛犊
  • 注册日期2009-12-24
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望71点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
26楼#
发布于:2010-04-16 09:28
mark~
Pegram
论坛版主
论坛版主
  • 注册日期2005-12-03
  • 最后登录2013-08-23
  • 粉丝13
  • 关注5
  • 积分1333分
  • 威望4717点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分2分
27楼#
发布于:2010-04-26 21:15
要看书啊!!
《寒江独钓》与《竹林蹊径》的合作作者。精通USB开发,设计了CY001 USB驱动套件(http://bbs.driverdevelop.com/read.php?tid-119314.html)。
上一页 下一页
游客

返回顶部