首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只应在IRQL = PASSIVE_LEVEL处调用违反ZwOpenKey的潜在影响

只应在IRQL = PASSIVE_LEVEL处调用违反ZwOpenKey的潜在影响
EN

Stack Overflow用户
提问于 2017-06-30 20:14:25
回答 1查看 135关注 0票数 0

第三方数据丢失预防驱动程序在其上启用驱动程序验证程序时,会根据IrqlZwPassive规则导致驱动程序验证程序错误检查

崩溃包括以下信息:

只能在IRQL = PASSIVE_LEVEL时调用ZwOpenKey

如果在IRQL=PASSIVE_LEVEL之外使用ZwOpenKey,对Windows系统有什么潜在的影响?

这总是一个严重的问题,我们应该向供应商提出,还是只有在某些情况下才会提出。

EN

回答 1

Stack Overflow用户

发布于 2017-07-01 02:13:59

内核中的所有Zw必须仅在PASSIVE_LEVEL上调用。这是设计好的。如果在APC_LEVEL上调用它,这将是UB,有时这可以工作,有时会产生挂起或崩溃。假设ZwOpenKey注册表管理器可以从磁盘读取密钥数据,如果它仍然不在内存中。因此,将IRP传递给filesystem并等待它完成。而完成的Irp可以在调用线程中插入特殊的APC (IopCompleteRequest)。如果线程处于APC级别- APC将不会执行,直到线程的IRQL不降低为被动。但它从来没有完成-他等待IRP完成..

另一个点-从Zw服务退出,系统检查-是线程中的UserApcPending,如果是,将IRQL提升到APC_LEVEL,启动用户apc,并将其降低到PASSIVE_LEVEL (系统假设Zw在PASSIVE_LEVEL上调用)-这样您就可以在APC_LEVEL上进入Zw api,在PASSIVE_LEVEL上退出。我可以问--为什么线程有时会有APC_LEVEL?很简单,因为IRQL引发了什么都没做?或者存在一些要求,为什么在某一点上必须是APC_LEVEL?如果是,如果情况需要停留在APC_LEVEL上,但线程提前将IRQL降低到PASSIVE_LEVEL,会是什么情况?真的。在大多数情况下,可能什么都不是。但在某些情况下,可能会出现非常糟糕的bug,很难捕捉和研究。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44846291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档