zh_zh_y
驱动牛犊
驱动牛犊
  • 注册日期2001-10-19
  • 最后登录2005-03-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1456回复:3

如何从同步方式改成异步方式调用?

楼主#
更多 发布于:2002-06-14 22:21
我是个驱动程序新手。刚编写了一个pci的驱动程序。碰到了一些迷惑的地方,望各位大侠赐教!
目前我的应用程序与驱动程序的通信,使用的是WriteFile和ReadFile函数。这是通过IO管理器产生一个IRP,DRIVER在处理完这个IRP后,IoCompleteRequest例程完成IRP,送回到IO管理器,然后返回到应用程序中。
目前我在应用程序中使用的是同步的方式来调用WriteFile和ReadFile函数,也就是在这两个函数中将最后一个参数中设置成NULL。这种方式是发送一个IRP后,应用程序等待驱动程序完成该IRP后,再继续发送后面的IRP。否则,应用程序等待。这种方式我感觉效率比较低,我想在应用程序中改为异步的方式调用。
现在我对这种异步的调用的流程不清楚,希望大侠能否给我一点帮助,如果要修改的话,应用程序的WriteFile和ReadFile函数该如何改变?驱动程序要做什么改变?



 

最新喜欢:

bearsammibearsa...
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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);
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
zh_zh_y
驱动牛犊
驱动牛犊
  • 注册日期2001-10-19
  • 最后登录2005-03-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-15 17:20
这位大侠,从上面的回复看,只要在应用程序中修改ReadFile的参数,而驱动程序不需要做任何修改,是这样吗?
magicx
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2014-08-18
  • 粉丝1
  • 关注0
  • 积分-14分
  • 威望13点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-06-15 17:43
这位大侠,从上面的回复看,只要在应用程序中修改ReadFile的参数,而驱动程序不需要做任何修改,是这样吗?


也要该一些。。。。。。

“驱动中用IoMarkIrpPending(Irp);挂起该IRP并在适当的时候调用IoCompleteRequest(Irp, IO_NO_INCREMENT);”

再为最好自己在驱动中增加,相关的“排队的操作”。

如你的驱动中本身,就已有相关的操作,那就。。。。。。。。








 :)
[color=red]大头鬼! :P[/color]
游客

返回顶部