阅读:1061回复:3
这是个有趣的问题:驱动的行为是如何影响到GetLastError的?
先说一下场景:自己实现了一个简单的虚拟设备驱动,有个用户态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例程了呢? 各位谁对这个有兴趣呢,或者你们也遇到过同样的问题? |
|
沙发#
发布于:2007-09-20 22:30
驱动行为对 GetLastError 的影响很简单,只不过是一个 DWORD到另一个DWORD, 并且每个线程有自己单独的 LastError.
|
|
板凳#
发布于:2007-09-21 09:27
谢谢您的答复,但是我的疑惑还没有完全消除。为什么第二步里面,使用handle可以进行DeviceIoControl的操作,但是第三步就不能关闭设备了呢?关键是我驱动的Close例程,都没有被系统调用?? 这个是主要的疑惑
|
|
地板#
发布于:2007-09-21 13:01
看一下Close例程被调用的条件就知道了
只有当handle真正要销毁时才调用它 Close例程没被调用估计是handle还被引用着 |
|