第三方数据丢失预防驱动程序在其上启用驱动程序验证程序时,会根据IrqlZwPassive规则导致驱动程序验证程序错误检查
崩溃包括以下信息:
只能在IRQL = PASSIVE_LEVEL时调用ZwOpenKey。
如果在IRQL=PASSIVE_LEVEL之外使用ZwOpenKey,对Windows系统有什么潜在的影响?
这总是一个严重的问题,我们应该向供应商提出,还是只有在某些情况下才会提出。
发布于 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,很难捕捉和研究。
https://stackoverflow.com/questions/44846291
复制相似问题