【问题标题】:I don't understand Windows IRQL我不明白 Windows IRQL
【发布时间】:2014-11-16 04:34:43
【问题描述】:

http://msdn.microsoft.com/en-us/library/windows/hardware/ff553079(v=vs.85).aspx

MSDN 说必须使用 newIrql 调用 KeRaiseIrql(newIrql, &oldIrql),即 >= currentIrql

"如果新的 IRQL 小于当前的 IRQL,则进行错误检查 发生。”

但在下面的代码中,KeRaiseIrql() 与 currentIrql 的newIrql 配合得很好。 (此外,加载和卸载此驱动程序都运行良好。)

有人解释一下吗?

测试环境:WinXp(32bit, Vmware Player), Win7(32bit, Vmware Player)

#include <ntddk.h>

VOID DriverUnload
(
    IN PDRIVER_OBJECT DriverObject
)
{
    DbgPrint("BYE!\n");
}

NTSTATUS DriverEntry
(
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
)
{
    KIRQL oldIrql;

    DriverObject->DriverUnload = DriverUnload;

    DbgPrint("Hello!\n");

    KeRaiseIrql(3, &oldIrql);

    DbgPrint("%d\n", KeGetCurrentIrql()); // 3

    KeRaiseIrqlToDpcLevel();

    DbgPrint("%d\n", KeGetCurrentIrql()); // 2

    KeRaiseIrql(1, &oldIrql);

    DbgPrint("%d\n", KeGetCurrentIrql()); // 1

    KeRaiseIrql(0, &oldIrql);

    DbgPrint("%d\n", KeGetCurrentIrql()); // 0

    DbgPrint("Yo!\n");

    return STATUS_SUCCESS;
}

【问题讨论】:

  • 您是在调试模式还是在发布模式下构建驱动程序?
  • @pepper_chico 处于调试模式。
  • wdm.h 标头中,有一个用于x64 平台的KeRaiseIrql 版本,它有一个定义。它只是使用NT_ASSERT 来检查newIrql &gt; oldIrqlNT_ASSERT docs 暗示它应该只在调试模式下进行错误检查。不确定 32 位版本是否包含此断言。
  • 我只是想知道为什么 KeRaiseIrql 的工作方式与预期的不同。仍然不知道为什么。这种好奇心是不必要的吗?
  • 无论如何,了解这一点不会影响您应该开发驱动程序的方式。

标签: windows kernel driver


【解决方案1】:

正如上面有人建议的那样,这取决于给定的操作系统实现。 如果你有这样的问题,最好使用调试器。

例如在 win xp sp2 release i386 我有:

    hal!KfRaiseIrql:
    806e43b8 0fb6d1          movzx   edx,cl
    806e43bb 0fb68a98436e80  movzx   ecx,byte ptr hal!HalpIRQLtoTPR (806e4398)[edx]
    806e43c2 a18000feff      mov     eax,dword ptr ds:[FFFE0080h]
    806e43c7 890d8000feff    mov     dword ptr ds:[0FFFE0080h],ecx
    806e43cd c1e804          shr     eax,4
    806e43d0 0fb68018f26e80  movzx   eax,byte ptr hal!HalpVectorToIRQL (806ef218)[eax]
    806e43d7 c3              ret

如您所见,没有以前的 irql 检查。如果您查看 wrk 来源,您会发现 KfRaiseIrql 的版本已被检查,还请记住,有已检查和免费的 windows 版本。很可能在检查版本中你会有错误检查。

如果您想在您的代码中查看 bsod,请使用 Driver Verifier :) 它正在检查是否正确使用了提高/降低 irql。

【讨论】:

  • 感谢回复,我会尝试使用验证器并进行更多测试。
  • 使用驱动程序验证程序发生错误检查。虽然 IRQL 规则有时似乎并不严格,但我认为遵守这条规则对于避免潜在的错误很重要。
猜你喜欢
  • 2021-05-13
  • 2011-02-17
  • 1970-01-01
  • 2018-04-08
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 2010-09-07
相关资源
最近更新 更多