问题标签 [irql]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
windows - 确定 IRQL 级别
如何确定一段驱动程序代码的 IRQL 级别。PAGED_CODE() 宏指定这段代码可以在低于 DISPATCH_LEVEL 的 IRQL 级别中运行。但是如何确定确切的 IRQL 级别。
c - 调用 NdisAcquireSpinLock 后访问全局变量导致 IRQL_NOT_LESS_OR_EQUAL BSoD
我有一个NDIS Filter driver
(WinPcap 的更新)并在 Windows 10 10586 x64 VM 上对其进行了测试。我启用了验证程序,它IRQL_NOT_LESS_OR_EQUAL
在启动 Wireshark 时会导致 BSoD(也就是使用我的驱动程序的功能)。
这是转储:
错误的源代码在这里:https ://github.com/nmap/npcap/blob/master/packetWin7/npf/npf/Openclos.c
我知道NdisAcquireSpinLock
call 会将 IRQL 提高到Dispatch_LEVEL
. 而 WinDbg 似乎说这g_arrOpen
是在一个不允许访问的可分页内存中Dispatch_LEVEL
。然而,事实是,g_arrOpen
是一个指向OPEN_INSTANCE
结构体的全局变量。OPEN_INSTANCE
实例分配在非分页池中。全局变量与驱动程序映像共存,因此也无法分页。
所以我不知道这里有什么问题?有什么帮助吗?谢谢!
c - 为什么 IoGetInitialStack 函数仅限于 IRQL<=APC_LEVEL?
我试图在 Windows 内核中使用的回调函数中找到堆栈的顶部(或底部)。我想为此使用IoGetInitialStack
函数,但不幸的是它的文档指出:
IRQL "<=APC_LEVEL"
我用反汇编程序查看了它,它似乎在我的副本中所做的ntoskrnl
就是:
他们为什么将其限制为IRQL<=APC_LEVEL
?
c - KeAcquireSpinLock 执行时间长
我目前正在开发一个实现自己的网络堆栈的 Windows 内核驱动程序。在测试已实现堆栈的一些基本功能时,我注意到对 ping 的回复有时会比平时花费明显更长的时间。进一步调查这个问题,我发现KeAcquireSpinLock
偶尔有高达 20 毫秒(而不是几微秒)的执行时间,即使锁没有被其他内核持有(我通过在调用 KeAcquireSpinLock 之前打印锁值来确认这一点)。
因为我不知道为什么KeAcquireSpinLock
要花这么长时间,所以我用 实现了一种不同的方法KeAcquireSpinLockAtDpcLevel
,如果需要,手动提升 IRQL:
我希望上面的代码在功能上等同于KeAcquireSpinLock
. 但是,事实证明,我遇到的运行时问题已经KeAcquireSpinLock
消失,并且这种方法的性能很好。
我在互联网上搜索过类似的问题KeAcquireSpinLock
,但似乎只有我一个人遇到这个问题。也许我在驱动程序的其他部分有错误?有人可以解释这种行为吗?
请注意,我不是在谈论死锁,因为它KeAcquireSpinLock
总是会在某个时候返回,并且KeAcquireSpinLockAtDpcLevel
使用相同的架构/锁定对象的实现。