违反ZwOpenKey的潜在影响只能在IRQL = PASSIVE_LEVEL时调用

时间:2017-06-30 12:14:25

标签: driver windbg wdk

启用驱动程序验证程序时,第三方数据丢失防护驱动程序会导致基于IrqlZwPassive规则的驱动程序验证程序错误检查

崩溃包括以下信息:

ZwOpenKey只能在IRQL = PASSIVE_LEVEL时调用。

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

这是一个严重的问题,我们应该向供应商提出,或仅在某些情况下。

1 个答案:

答案 0 :(得分:1)

内核中的所有Zw api必须仅在PASSIVE_LEVEL上调用。这是设计的。如果在APC_LEVEL上调用它已经 UB ,有时可能会有效,有时会产生挂起或崩溃。比如ZwOpenKey - 注册表管理器可以从磁盘读取密钥数据,如果它仍然不在内存中。所以将IRP传递给文件系统并等待它完成。但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,那该怎么办?真的是UB。在大多数情况下可能一无所获。但在某些情况下可能是非常讨厌的错误,非常难以捕捉和研究。