阅读:1457回复:3
如何从同步方式改成异步方式调用?
我是个驱动程序新手。刚编写了一个pci的驱动程序。碰到了一些迷惑的地方,望各位大侠赐教!
目前我的应用程序与驱动程序的通信,使用的是WriteFile和ReadFile函数。这是通过IO管理器产生一个IRP,DRIVER在处理完这个IRP后,IoCompleteRequest例程完成IRP,送回到IO管理器,然后返回到应用程序中。 目前我在应用程序中使用的是同步的方式来调用WriteFile和ReadFile函数,也就是在这两个函数中将最后一个参数中设置成NULL。这种方式是发送一个IRP后,应用程序等待驱动程序完成该IRP后,再继续发送后面的IRP。否则,应用程序等待。这种方式我感觉效率比较低,我想在应用程序中改为异步的方式调用。 现在我对这种异步的调用的流程不清楚,希望大侠能否给我一点帮助,如果要修改的话,应用程序的WriteFile和ReadFile函数该如何改变?驱动程序要做什么改变? |
|
最新喜欢:![]() |
沙发#
发布于:2002-06-15 17:43
这位大侠,从上面的回复看,只要在应用程序中修改ReadFile的参数,而驱动程序不需要做任何修改,是这样吗? 也要该一些。。。。。。 “驱动中用IoMarkIrpPending(Irp);挂起该IRP并在适当的时候调用IoCompleteRequest(Irp, IO_NO_INCREMENT);” 再为最好自己在驱动中增加,相关的“排队的操作”。 如你的驱动中本身,就已有相关的操作,那就。。。。。。。。 :) |
|
|
板凳#
发布于:2002-06-15 17:20
这位大侠,从上面的回复看,只要在应用程序中修改ReadFile的参数,而驱动程序不需要做任何修改,是这样吗?
|
|
地板#
发布于:2002-06-15 12:11
应用层:
HANDLE FileIOWaiter = CreateEvent( NULL, TRUE, FALSE, NULL); OVERLAPPED ol; ol.Offset = 0; ol.OffsetHigh = 0; ol.hEvent = FileIOWaiter; if(!ReadFile(hDEV, Buffer, Length, &nReadBytes, &ol)) { if(GetLastError()==ERROR_IO_PENDING) { while(WaitForSingleObject(FileIOWaiter, 100)==WAIT_TIMEOUT) { } GetOverlappedResult(hDEV, &ol, &nReadBytes, FALSE); } } 驱动中用IoMarkIrpPending(Irp);挂起该IRP并在适当的时候调用IoCompleteRequest(Irp, IO_NO_INCREMENT); |
|
|