我不知道';我不理解Windows IRQL

我不知道';我不理解Windows IRQL,windows,kernel,driver,Windows,Kernel,Driver,MSDN说必须使用newIrql调用KeRaiseIrql(newIrql和oldIrql),即>=currentIrql “如果新IRQL小于当前IRQL,则进行错误检查 发生。” 但是在下面的代码中,KeRaiseIrql()可以很好地与newIrql配合使用,即currentIrql。(此外,装载和卸载该驱动程序都很有效。) 有人解释这件事吗 测试环境:WinXp(32位,Vmware Player)、Win7(32位,Vmware Player) #包括 空传动负载 ( 在PDU对象驱动

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

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

但是在下面的代码中,
KeRaiseIrql()
可以很好地与
newIrql
配合使用,即
currentIrql
。(此外,装载和卸载该驱动程序都很有效。)

有人解释这件事吗

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

#包括
空传动负载
(
在PDU对象驱动对象中
)
{
DbgPrint(“再见!\n”);
}
新界北
(
在PDU对象驱动对象中,
在PUNICODE_字符串注册表路径中
)
{
KIRQL-oldIrql;
DriverObject->DriverRunLoad=DriverRunLoad;
DbgPrint(“你好!\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”);
返回状态\成功;
}

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

例如,在win xp sp2版本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,请使用驱动程序验证器:)afair正在检查是否正确使用了提高/降低irql。

您是在调试模式还是在发布模式下构建驱动程序?@pepper_chico在调试模式下。在
wdm.h
标题中,有一个针对x64平台的
KeRaiseIrql
版本,其中有一个定义。它只使用
NT\u ASSERT
检查
newIrql>oldIrql
。意味着它应该只在调试模式下进行错误检查。不确定32位版本是否包含此断言。我只想知道为什么KeRaiseIrql的工作方式与预期的不同。但仍然不知道为什么。这种好奇是没有必要的吗?无论如何,了解这一点不会对您开发驱动程序的方式产生影响。感谢您的回复,我将尝试使用验证程序并进行更多测试。使用驱动程序验证程序进行错误检查。尽管IRQL规则有时似乎并不严格,但我认为遵守这一规则对于避免潜在的bug很重要。
    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