Windows驱动程序开发:ntoskrnl代码可以被分页吗?

时间:2016-11-12 15:25:47

标签: driver windows-kernel

我在Windows 7 x64中启用了Driver Verifier,并尝试了IRQL_NOT_LESS_OR_EQUAL(0A)错误检查。从analyze -v info,似乎RtlAnsiCharToUnicodeChar函数的内存页面被调出,因此调用该函数会导致错误检查0A。 RtlAnsiCharToUnicodeChar是一个ntoskrnl.exe导出函数。可以真的被分页吗?如果是这样,我该如何预防?

现场调试信息屏幕截图如下:

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:3)

是肯定的。当然 - 在PAGE *部分中有很多ntoskrnl例程。 RtlAnsiCharToUnicodeChar也是分页的 - 请参阅文档:

  

IRQL< = APC_LEVEL

还阅读了DbgPrintEx routine

  

可以在IRQL< = DIRQL上调用DbgPrint和DbgPrintEx。但是,Unicode   格式代码(%wc和%ws)只能在IRQL = PASSIVE_LEVEL时使用。

  

但是,Unicode格式代码(%C,%S,%lc,%ls,%wc,%ws和   %wZ)只能与IRQL = PASSIVE_LEVEL一起使用。

所以,如果您不使用Unicode格式,您可以在任何IRQL上使用DbgPrintKdPrint(这是宏),但如果您使用Unicode格式 - 仅在PASSIVE_LEVEL或APC_LEVEL(关于APC_LEVEL,我说是自)

答案 1 :(得分:1)

您可以尝试在该特定例程上使用MmLockPagableCodeSection来阻止它被分页,但是它可能不可取(如果它们位于可分区中,您不知道它具有哪些依赖项以及)。无论如何,请务必仔细阅读文档。

更好的方法是在调用打印功能之前首先在被动/ APC级别运行 - 例如,通过调度工作项(您也可以强制降低具有KeLowerIrql功能的IRQL,但不建议通过MSFT)。