启用驱动程序验证程序时,第三方数据丢失防护驱动程序会导致基于IrqlZwPassive规则的驱动程序验证程序错误检查
崩溃包括以下信息:
ZwOpenKey只能在IRQL = PASSIVE_LEVEL时调用。
如果在IRQL = PASSIVE_LEVEL之外使用ZwOpenKey,对Windows系统有哪些潜在影响?
这是一个严重的问题,我们应该向供应商提出,或仅在某些情况下。
答案 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。在大多数情况下可能一无所获。但在某些情况下可能是非常讨厌的错误,非常难以捕捉和研究。