lyangn
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2003-07-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1441回复:6

急问:如何使IRP等待?

楼主#
更多 发布于:2003-07-17 21:32
小弟在开发USB2.0驱动和应用程序,遇到一个问题:

采用Bulk传输模式由PC向设备传输数据,由于所传文件较大(几G),传输速率较高(30Mbyte/s),所以在内存中开辟两个buffer,由应用程序触发驱动,然后驱动在内核模式下传输数据。而应用程序每隔1ms检查buffer一次,如果在传第一个buffer的数据,那么应用程序就更新第二个buffer的数据。这样循环直到文件传完。驱动在内核模式下传输数据是利用两个IRP交替传输数据。问题是:由于数据传输速度太快,第一个buffer的数据传完了,要传第二个buffer的时候,第二个buffer的数据还未更新完,造成传输数据重复。我是想如果要传buffer的数据还未更新好时,让IRP等在那,但不知如何等。用过Kewaitsingleobject函数,但是softice老是报告使用不对,然后就死机了。还请那位高手执教一下。谢谢!!!
lifeship
驱动小牛
驱动小牛
  • 注册日期2002-10-18
  • 最后登录2005-07-19
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-17 21:40
不知道  驱动在内核模式下传输数据是利用两个IRP交替传输数据
是什么意思,但你的方法肯定有问题,对于共享数据的访问,没有保护方式,可以加一个简单的自选锁保护。
杯汝前来,  老子今朝,  放荡形骸!  甚长年抱渴,  咽如焦釜,  于今喜醉,  气似奔雷!  慢说刘伶,  古今达者,  醉后何妨死便埋! 
lyangn
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2003-07-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-17 22:19
我在驱动程序中建立了两个IRP,使用IoSetCompletionRoutine,如果数据没有传输完,在complete routine里继续更新IRP和URB的内容,传输数据。但是此时如果另一个buffer的数据没有更新好的话,我想让irp 在那里等待数据更新好。
gjltce
驱动小牛
驱动小牛
  • 注册日期2003-07-05
  • 最后登录2011-12-10
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望59点
  • 贡献值0点
  • 好评度25点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-18 08:54
在二个buffer中加上标记字符。以表示数据是否准备好。
不过这是个笨办法。
SupermiLG
驱动牛犊
驱动牛犊
  • 注册日期2003-01-28
  • 最后登录2006-02-03
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-21 01:02
通过 Event Objects ,来同步。看看DDK,再看看操作系统的教材
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝1
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-21 22:25
你的问题应该是程序流程的问题。不知道你在哪儿 调用Kewaitsingleobject函数的,不要在完成例程中调用。
你的认可是对我最大的鼓励!
lyangn
驱动牛犊
驱动牛犊
  • 注册日期2003-03-25
  • 最后登录2003-07-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-07-21 22:57
你的问题应该是程序流程的问题。不知道你在哪儿 调用Kewaitsingleobject函数的,不要在完成例程中调用。


我是在IoSetCompletionRoutine里用的Kewaitsingleobject。为什么不能在完成例程里调用呢?
游客

返回顶部