我在Windows 7 x64中启用了Driver Verifier,并尝试了IRQL_NOT_LESS_OR_EQUAL(0A)错误检查。从analyze -v
info,似乎RtlAnsiCharToUnicodeChar
函数的内存页面被调出,因此调用该函数会导致错误检查0A。 RtlAnsiCharToUnicodeChar
是一个ntoskrnl.exe导出函数。可以真的被分页吗?如果是这样,我该如何预防?
现场调试信息屏幕截图如下:
答案 0 :(得分:3)
是肯定的。当然 - 在PAGE *部分中有很多ntoskrnl例程。 RtlAnsiCharToUnicodeChar也是分页的 - 请参阅文档:
IRQL< = APC_LEVEL
可以在IRQL< = DIRQL上调用DbgPrint和DbgPrintEx。但是,Unicode 格式代码(%wc和%ws)只能在IRQL = PASSIVE_LEVEL时使用。
和
但是,Unicode格式代码(%C,%S,%lc,%ls,%wc,%ws和 %wZ)只能与IRQL = PASSIVE_LEVEL一起使用。
所以,如果您不使用Unicode格式,您可以在任何IRQL上使用DbgPrint
或KdPrint
(这是宏),但如果您使用Unicode格式 - 仅在PASSIVE_LEVEL或APC_LEVEL(关于APC_LEVEL,我说是自)
答案 1 :(得分:1)
您可以尝试在该特定例程上使用MmLockPagableCodeSection来阻止它被分页,但是它可能不可取(如果它们位于可分区中,您不知道它具有哪些依赖项以及)。无论如何,请务必仔细阅读文档。
更好的方法是在调用打印功能之前首先在被动/ APC级别运行 - 例如,通过调度工作项(您也可以强制降低具有KeLowerIrql功能的IRQL,但不建议通过MSFT)。