阅读:1153回复:4
ds for win98 wdm driver: ctimercallback 中使用 kevent , 为何出现 assert fail : irql < dispatch_level
app 创建 event object, 通过 deviceioctrl 传递给 driver, device 检测到特定事件后,通知 driver , driver 通过收到的 event object 通知 app ,从而完成 device --> driver --> app 的消息传递.
我使用了 ctimercallback 类,.在其 dpc callback 中定时查询 device .检测到特定事件后,使用 event->set 通知 app. 但奇怪的是,system debugger 总是输出 rtlassert : KeGetCurretIrql()<dispatch-level. 可是,只是一个 dpc 调用,dpc 调用不是在 irql < dispatch-level 情况下才发生吗? 很困惑,请大侠指点一二. 此外,关于从下到上的通信机制,tiger 同志写了一遍专栏文章,我试了一下,没能满足我的需求,不知道是不是哪些地方我没做对,也请大家帮忙看一下: app 中开了一个线程(slave thread) 专门等待 driver 的 overlapped 返回,等待同时,还需要通过 deviceioctrl 向 driver 发出其它命令. 结果,其它发出的 io code 就没有响应了. 我的情况就是这样: 在等待 driver 消息的同时还要向 driver 发出命令.不知道象这种 pending 的方式能够满足我的需求? |
|
|
沙发#
发布于:2002-12-03 17:11
你那个“特定事件“事什么事件?
|
|
|
板凳#
发布于:2002-12-04 10:29
指 device 发生的事件.
比方说,device 上有一个按键,按下去后, device 就将该按键事件通知 driver , driver 再通知 app. app 再根据当前状况去处理该事件. timercallback 本身就是一个 dpc 调用,但运行在该函数里是还是输出上述 irql < dispatch_level 信息,真实困惑. 此外,win98 不支持 KeGetCurIrql() 函数,但是, vdw.lib 自定义了该函数,在其 cpp 文件中调用该函数.如, kusb.cpp ,其 include 文件为 <vdw.h>,<kusb.h> .我的 driver 中也包括了这两个头文件,但是一编译就提示该函数不存在,不知道怎样设置? |
|
|
地板#
发布于:2002-12-04 17:50
你的这个按键是通过中断得到的?
|
|
|
地下室#
发布于:2002-12-05 10:02
是我没入行.
我在 dpc(dispatch_level) 中调用了 submiturb , 但是又没有使用 complete 例程,所以出现问题了. 帮助文档中指出,submiturb()未带 complete 例程时必须在 irql < dispatch_level 的情况下使用. 但是也很奇怪,我按照帮助文档中(Class Refercence :KPipe : submiturb) 的 form1 调用,然而在complete 例程返回 requre_more_processing . 结果也是死机.后来直接按form2 方式处理,返回 success 就好了.版主有时间看看? |
|
|