Windows 驱动程序开发人员:ntoskrnl 代码可以分页出来吗?

Windows driver dev: Can ntoskrnl code get paged out?

我正在 Windows 7 x64 中打开驱动程序验证程序来尝试我的驱动程序,并获得 IRQL_NOT_LESS_OR_EQUAL(0A) 错误检查。从 analyze -v 信息来看,似乎 RtlAnsiCharToUnicodeChar 函数的内存页被调出,因此调用该函数会导致错误检查 0A 。 RtlAnsiCharToUnicodeChar 是一个 ntoskrnl.exe 导出函数。真的可以分页吗?如果是这样,我该如何预防?

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

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

IRQL <= APC_LEVEL

还阅读了 DbgPrintEx routine

DbgPrint and DbgPrintEx can be called at IRQL<=DIRQL. However, Unicode format codes (%wc and %ws) can be used only at IRQL = PASSIVE_LEVEL.

However, the Unicode format codes (%C, %S, %lc, %ls, %wc, %ws, and %wZ) can only be used with IRQL = PASSIVE_LEVEL.

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

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

更好的方法是在调用打印功能之前首先在 Passive/APC 级别 运行 - 例如,通过调度工作项(您也可以使用 [=11 强制降低 IRQL =] 功能,但 MSFT 不建议这样做。