阅读:1791回复:3
请教一下关于DDK中BULKUSB的异步传输问题
正在研读DDK中BULKUSB,其ReadFile的同步或异步方式百思不得其解。
1.由于在驱动中BulkUsb_StagedReadWrite函数其数据读写为异步传输(回调函数BulkUsb_AsyncReadWrite_Complete)。 2。而用户程序中ReadFile是同步的,(没有用回调函数) 问题:他们之间是如何协调的?因为当ReadFile调用BulkUsb_StagedReadWrite后就直接返回了,好像没有等待数据完成,这时应该ReadFile也就会没有数据就返回了。数据接收是在BulkUsb_AsyncReadWrite_Complete中。ReadFile是在内部结构中会等待吗?等待那个消息呢? 先谢谢大家了 |
|
沙发#
发布于:2008-09-25 14:35
俺的理解是:如果用户程序中ReadFile是同步调用的话,那么没有数据完成时它是不会返回到用户程序的,它会等待在ntoskrnl.exe中。
更具体的,ReadFile会调到ntdll.dll中的NTReadFile,然后产生系统调用中断进入kernel,在kernel中NTReadFile会根据ReadFile的Overlapped标志决定在设备驱动程序返回后等待还是不等待。至于等待的方法,kernel中实现等待一个event应该很容易,当然也可以调用类似于用户态的GetOverlappedResult函数。 |
|
板凳#
发布于:2008-09-26 16:14
嗯,谢谢smilebear,有点明白了,在BulkUsb_AsyncReadWrite_Complete 函数中当收数据完成后有调用IoCompleteRequest( Irp, IO_NO_INCREMENT);估计就是说的返回消息函数。这消息叫做“IO_NO_INCREMENT”。怪怪的
|
|
地板#
发布于:2010-01-02 01:07
like it ,I can learn something from the text thx
|
|