hgxywhu
驱动牛犊
驱动牛犊
  • 注册日期2008-05-25
  • 最后登录2008-09-26
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1791回复:3

请教一下关于DDK中BULKUSB的异步传输问题

楼主#
更多 发布于:2008-09-25 11:17
正在研读DDK中BULKUSB,其ReadFile的同步或异步方式百思不得其解。
1.由于在驱动中BulkUsb_StagedReadWrite函数其数据读写为异步传输(回调函数BulkUsb_AsyncReadWrite_Complete)。
2。而用户程序中ReadFile是同步的,(没有用回调函数)
问题:他们之间是如何协调的?因为当ReadFile调用BulkUsb_StagedReadWrite后就直接返回了,好像没有等待数据完成,这时应该ReadFile也就会没有数据就返回了。数据接收是在BulkUsb_AsyncReadWrite_Complete中。ReadFile是在内部结构中会等待吗?等待那个消息呢?
先谢谢大家了
smilebear
驱动牛犊
驱动牛犊
  • 注册日期2002-06-14
  • 最后登录2010-06-24
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望38点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-09-25 14:35
俺的理解是:如果用户程序中ReadFile是同步调用的话,那么没有数据完成时它是不会返回到用户程序的,它会等待在ntoskrnl.exe中。
更具体的,ReadFile会调到ntdll.dll中的NTReadFile,然后产生系统调用中断进入kernel,在kernel中NTReadFile会根据ReadFile的Overlapped标志决定在设备驱动程序返回后等待还是不等待。至于等待的方法,kernel中实现等待一个event应该很容易,当然也可以调用类似于用户态的GetOverlappedResult函数。
hgxywhu
驱动牛犊
驱动牛犊
  • 注册日期2008-05-25
  • 最后登录2008-09-26
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望3点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-09-26 16:14
嗯,谢谢smilebear,有点明白了,在BulkUsb_AsyncReadWrite_Complete 函数中当收数据完成后有调用IoCompleteRequest( Irp, IO_NO_INCREMENT);估计就是说的返回消息函数。这消息叫做“IO_NO_INCREMENT”。怪怪的
yuquan3210
驱动牛犊
驱动牛犊
  • 注册日期2007-10-06
  • 最后登录2012-03-19
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望147点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-01-02 01:07
    like it ,I can learn something from the text thx
游客

返回顶部