chnzhj
驱动牛犊
驱动牛犊
  • 注册日期2007-08-08
  • 最后登录2008-03-21
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1061回复:3

这是个有趣的问题:驱动的行为是如何影响到GetLastError的?

楼主#
更多 发布于:2007-09-20 21:37
先说一下场景:自己实现了一个简单的虚拟设备驱动,有个用户态app使用它。做了如下操作:
1)CreateFile,使用OVERLAPPED方式打开,成功,句柄记录为DevHdl。
2)启动两个现成,使用DeviceIoControl读写数据,也是使用OVERLAPPED的方式读写,由于不明原因,我的读线程在DeviceIoControl返回失败后,调用GetLastError的返回值是0x02,这个错误表示handle是无效的,但是问题也来了,这时候,我的驱动是可以工作的,而且收发数据正常。不明白为什么这样?这样一来我的APP就无法正确了解IO请求的执行状态。
3)更大的问题在这里: 我使用CloseHandle(DevHdl),关闭设备失败,getLastError得到0x02,不明白为什么,但是这个时候我的处理IRP_MJ_CLSOE的Close例程的确没有被执行。这就奇怪了:为什么同样的handle,在第二步可以完成IO请求,但是第三步就不会执行Close例程了呢?
各位谁对这个有兴趣呢,或者你们也遇到过同样的问题?
zjan521
驱动牛犊
驱动牛犊
  • 注册日期2002-10-02
  • 最后登录2010-07-20
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望91点
  • 贡献值0点
  • 好评度74点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-09-20 22:30
驱动行为对 GetLastError 的影响很简单,只不过是一个 DWORD到另一个DWORD, 并且每个线程有自己单独的 LastError.
chnzhj
驱动牛犊
驱动牛犊
  • 注册日期2007-08-08
  • 最后登录2008-03-21
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-09-21 09:27
谢谢您的答复,但是我的疑惑还没有完全消除。为什么第二步里面,使用handle可以进行DeviceIoControl的操作,但是第三步就不能关闭设备了呢?关键是我驱动的Close例程,都没有被系统调用?? 这个是主要的疑惑
xinruzhishui
驱动牛犊
驱动牛犊
  • 注册日期2006-04-06
  • 最后登录2010-08-25
  • 粉丝0
  • 关注0
  • 积分450分
  • 威望47点
  • 贡献值0点
  • 好评度46点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-09-21 13:01
看一下Close例程被调用的条件就知道了
只有当handle真正要销毁时才调用它
Close例程没被调用估计是handle还被引用着
游客

返回顶部