求教wdm中的一句话

chenchangxiong 2011-05-26 04:25:48
在wdm中,有一个例子
PIRP Irp = IoBuildSynchronousFsdRequest(...);
ExAcquireFastMutex(...);
NTSTATUS status = IoCallDriver(...);
if (status == STATUS_PENDING)
KeWaitForSingleObject(...); // <== don't do this
ExReleaseFastMutex(...);

对为什么不能这么干有如下说明
The problem with this code is that the KeWaitForSingleObject call will deadlock: when the IRP completes, IoCompleteRequest will schedule an APC in this thread. The APC routine, if it could run, would set the event. But because you’re already at APC_LEVEL, the APC cannot run in order to set the event.

为什么apc不能调度运行从而signal等待的event呢?当前的线程处于apc_level怎么会影响到对应的事件的signal呢?
...全文
118 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenchangxiong 2011-05-29
  • 打赏
  • 举报
回复
这样啊,受教了
chenchangxiong 2011-05-27
  • 打赏
  • 举报
回复
KeWaitForSingleObject不是进入等待了吗,难道这个不会被cpu调度使当前线程进入等待状态?从而使得cpu中其他等待队列中的任务执行吗?
cnzdgs 2011-05-27
  • 打赏
  • 举报
回复
当前线程进入等待状态,但由于当前线程是APC级,只有高于APC级的线程才允许执行,小于和等于APC级的线程都要等待。
cnzdgs 2011-05-26
  • 打赏
  • 举报
回复
IRP的event是在完成例程中设置的,完成例程是运行在APC级别上的,在同一处理中,一个APC级线程不能被小于或等于APC级的线程中断。因为ExAcquireFastMutex会将当前线程提升至APC级,在执行ExReleaseFastMutex之前,对于单核系统,完成例程没有机会执行,因此,在这里执行KeWaitForSingleObject,如果是无限等待,则会死锁。

21,615

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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