virmin
驱动牛犊
驱动牛犊
  • 注册日期2004-02-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5424回复:3

DeviceIoControl的异步问题

楼主#
更多 发布于:2004-05-09 15:00
MSDN上讲DeviceIoControl时, 如果目标设备是用FILE_FLAG_OVERLAPPED标记打开, DeviceIoControl时必须指定一个有效的OVERLAPPED,
搞笑的是我指定一个OVERLAPPED时老返回false, GetLastError是ERROR_IO_PENDDING, 然后我Wait这个OVERLAPPED里的event对象时一直不返回, 如果直接给一个NULL而不指定OVERLAPPED反而能正确返回, 见鬼, MSDN不是说不指定就会fail吗?
原话如下, 请指点一下
If hDevice was opened with the FILE_FLAG_OVERLAPPED flag, this parameter must point to a valid OVERLAPPED structure. In this case, DeviceIoControl is performed as an overlapped (asynchronous) operation. If the device was opened with FILE_FLAG_OVERLAPPED and lpOverlapped is NULL, the function fails in unpredictable ways.

最新喜欢:

acidfishacidfi...
sigh~
acidfish
驱动小牛
驱动小牛
  • 注册日期2002-05-20
  • 最后登录2009-11-11
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-14 17:23
你把你的ol首先全部置零
memset( &ol, 0, sizeof( OVERLAPPED )
然后在ol.hEvent = myEvent;

呵呵,给分吧。
virmin
驱动牛犊
驱动牛犊
  • 注册日期2004-02-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-10 08:50
OVERLAPPED结构里的event,
OVERLAPPED ol;
...
ol.hEvent = myEvent; //myEvent是手动event, 全局变量
//专门用于这个DeviceIoControl, 别的地方不会用到
ResetEvent(myEvent);
BOOL bRet = DeviceIoControl(...., &ol);
....
WaitForSingleObject(myEvent, INFINITE); //永远死在这里
..

上面的代码有问题??
sigh~
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-09 16:50
返回PENDING说明驱动没有处理完请求,你等待event是对的,但你的event是否正确呢?
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
游客

返回顶部