EdmundChen
驱动牛犊
驱动牛犊
  • 注册日期2004-05-08
  • 最后登录2009-07-16
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1323回复:5

驱动程序的常见问题

楼主#
更多 发布于:2004-06-24 10:23
应用程序通过调用ReadFile来读数据,而在驱动程序里不定马上就有数据,需要等待硬件产生,我想在DispatchRead中把当前的线程挂起,当中断来时再处发它,然后返回给应用程序。该怎么做?哪位大侠能够帮帮忙。
escape
驱动老牛
驱动老牛
  • 注册日期2002-02-01
  • 最后登录2004-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-06-24 11:04
我觉得可以让read历程和中断历程共一块数据。
这样就不需要触发机制了。read有数据就返回数据,
否则就返回空。效率也高一些。不会阻塞用户线程。
EdmundChen
驱动牛犊
驱动牛犊
  • 注册日期2004-05-08
  • 最后登录2009-07-16
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-06-24 14:05
这样做可能导致应用程序要一直在读数据,从而CPU占有率升高
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
地板#
发布于:2004-06-24 15:34
应用程序通过调用ReadFile来读数据,而在驱动程序里不定马上就有数据,需要等待硬件产生,我想在DispatchRead中把当前的线程挂起,当中断来时再处发它,然后返回给应用程序。该怎么做?哪位大侠能够帮帮忙。


可以使用队列来实现。
1. 收到IRP后,IoMarkIrpPending
2. 然后IoStartPacket
3. 返回STATUS_PENDING
4. 在StartIO例程里面处理IRP。
5. 处理完程IRP后,调用IoStartNextPacket,处理下一个IRP。

另外,你可以在自己定制队列。具体做法,找本书看看吧。
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
escape
驱动老牛
驱动老牛
  • 注册日期2002-02-01
  • 最后登录2004-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-24 16:00
StartIO例程只能起同步作用。
实际上,irp被startio例程处理时,还是有可能读不到数据。
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
5楼#
发布于:2004-06-24 16:42
StartIO例程只能起同步作用。
实际上,irp被startio例程处理时,还是有可能读不到数据。


他的驱动不是需要等待硬件产生中断吗?在DPC里面完成这个IRP就行。如果不需要启动硬件读数据(比如DMA),StartIo就没有什么用。
八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
游客

返回顶部