seny11
驱动牛犊
驱动牛犊
  • 注册日期2007-02-12
  • 最后登录2012-12-21
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望91点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1964回复:1

【求助】关于键盘过滤驱动中回调函数的问题

楼主#
更多 发布于:2011-04-12 18:19
在修改例程的基础上,
NTSTATUS Ctrl2capDispatchRead(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp )
{
.......
IoSetCompletionRoutine( Irp, Ctrl2capReadComplete,
                            DeviceObject, TRUE, TRUE, TRUE );
}
//-------------------------------------
回调函数:
NTSTATUS Ctrl2capReadComplete(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    )
{
..........
 writeFileTest(); //自定义例程
}

void writeFileTest()
{
 ....
 ZwCreateFile();  
 ZwWriteFile();
}
问题:
程序功能:
在这个回调函数中完成键盘的过滤得到键盘的扫描码,并转化为ascii码。再写入文件.文件是在驱动程序一开始就被创建或打开的.

1。为什么在完成的回调函数任意一个位置调用自定义的例程,都会蓝屏?
   是不是在回调函数中不能再调用其他的例程了?
2。我把这个自定义例程去掉,代码放到回调函数中,还是蓝屏,
3。但如果把代码放到其他函数如Ctrl2capDispatchRead()之内,
   也就是跟调用回调函数的IoSetCompletionRoutine()的前面或之后,
   就可以通过,不会蓝屏?
4。结论:IRP完成时的回调函数中不能操作文件吗?创建或写入?
5。键盘扫描码是不是非要在IRP完成时的回调函数才能获得?
   为什么在之前的函数Ctrl2capDispatchRead()中不能获得?
   我把获取键盘扫描码的代码放到这里就不能获取扫描码了,
先谢谢各位大侠!帮一下驱动新手!
zzw315
驱动牛犊
驱动牛犊
  • 注册日期2007-03-20
  • 最后登录2013-03-06
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望251点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2011-04-13 09:21
IRQL  的问题。ZwCreateFile() 在PASSIVE_LEVEL 上,完成例程在<=DISPATCH_LEVEL,请在函数调用时打出中断级别,你就会发现问题了。你试试
游客

返回顶部