【问题标题】:Windows driver dev: Can ntoskrnl code get paged out?Windows 驱动程序开发人员:ntoskrnl 代码可以分页吗?
【发布时间】:2016-11-12 15:25:47
【问题描述】:

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

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

【问题讨论】:

  • 如果您粘贴 WinDbg 窗口的内容而不是屏幕截图,搜索引擎会更容易搜索。

标签: driver windows-kernel


【解决方案1】:

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

IRQL

还阅读了DbgPrintEx routine

可以在 IRQL

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

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

【讨论】:

  • IIRC 并非总是如此,但我可能错了。 IIRC 早期的 Windows 版本在 NonPagedPool 中有整个内核。此外,需要特定 IRQL 的例程与函数在内核映像中的位置无关。除其他外,IRQL 要求基于对数据结构的访问。例如,Unicode 大写表位于分页池中,因此您引用的要求是有原因的。
  • @0xC0000022L - xp 的最小值(几乎可以肯定,在 win200 中也可以,但无法检查) - PAGE* 部分中 ntoskrnl.exe 中的大量代码。如果函数位于 PAGE* 部分 - 它已经只能被调用 IRQL
  • @RbMm ntoskrnl.exe 也使用大页面,所以它使用整个页面目录来引用一个页面
  • 具体来说,在我的Windows 7上现在有4个大页面包含ntoskrnl.exe和hal.dll,从FFFFF80003600000FFFFF80003C00000
  • @LewisKelsey - 不仅在驱动程序验证程序处于活动状态时。我没有在堆栈跟踪中查看它,并认为它在具体情况下不活跃。我认为大页面并不总是使用。现在不能说什么时候用过,什么时候不用。无论如何-您尝试证明什么?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-12-28
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    相关资源
    最近更新 更多