关于应用程序与驱动传递通信的问题

见习学术士 2011-03-16 11:48:09
在 case IOCTL_...: 中使用 ObReferenceObjectByHandle 没有问题。
KeSetEvent也成功,一切正常。代码如下:

case IOCTL_QQKEYBOARD_EVENT:
{
KdPrint(("[QQKeyBoard] IOCTL_QQKEYBOARD_EVENT"));
hUserEvent = *(HANDLE*)pIrp->AssociatedIrp.SystemBuffer;
pKeyboardDeviceExtension->hUserEvent = hUserEvent;
status = ObReferenceObjectByHandle(pKeyboardDeviceExtension->hUserEvent, EVENT_MODIFY_STATE, *ExEventObjectType,
KernelMode, (PVOID*)&pEvent, NULL);
if( NT_SUCCESS(status) )
{
KeSetEvent(pEvent, IO_NO_INCREMENT, FALSE);
pKeyboardDeviceExtension->hUserEvent = NULL;
ObDereferenceObject(pEvent);
KdPrint(("[QQKeyBoard] KeSetEvent FINISHED!"));
}
else
{
KdPrint(("[QQKeyBoard] stop log keyboard ObReferenceObjectByHandle failed! error code %u", status));
}
break;
}


但是我把这段代码移动到 完成函数 OnReadCompletion 中时,ObReferenceObjectByHandle 就失败,返回句柄无效。。
我把句柄保存再 pKeyboardDeviceExtension->hUserEvent 中了,求解。
...全文
110 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
fishion 2011-03-16
  • 打赏
  • 举报
回复
或者改个思路,用个命名事件,给驱动传这个事件名字,再打开这个事件

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧