阅读:2024回复:1
【求助】关于键盘过滤驱动中回调函数的问题
在修改例程的基础上,
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()中不能获得? 我把获取键盘扫描码的代码放到这里就不能获取扫描码了, 先谢谢各位大侠!帮一下驱动新手! |
|
沙发#
发布于:2011-04-13 09:21
IRQL 的问题。ZwCreateFile() 在PASSIVE_LEVEL 上,完成例程在<=DISPATCH_LEVEL,请在函数调用时打出中断级别,你就会发现问题了。你试试
|
|