【发布时间】: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 > oldIrql。NT_ASSERTdocs 暗示它应该只在调试模式下进行错误检查。不确定 32 位版本是否包含此断言。 -
我只是想知道为什么 KeRaiseIrql 的工作方式与预期的不同。仍然不知道为什么。这种好奇心是不必要的吗?
-
无论如何,了解这一点不会影响您应该开发驱动程序的方式。