问题标签 [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.

0 投票
1 回答
1136 浏览

windows - 确定 IRQL 级别

如何确定一段驱动程序代码的 IRQL 级别。PAGED_CODE() 宏指定这段代码可以在低于 DISPATCH_LEVEL 的 IRQL 级别中运行。但是如何确定确切的 IRQL 级别。

0 投票
1 回答
322 浏览

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

我知道NdisAcquireSpinLockcall 会将 IRQL 提高到Dispatch_LEVEL. 而 WinDbg 似乎说这g_arrOpen是在一个不允许访问的可分页内存中Dispatch_LEVEL。然而,事实是,g_arrOpen是一个指向OPEN_INSTANCE结构体的全局变量。OPEN_INSTANCE实例分配在非分页池中。全局变量与驱动程序映像共存,因此也无法分页。

所以我不知道这里有什么问题?有什么帮助吗?谢谢!

0 投票
1 回答
263 浏览

c - 看似不可能的错误检查

我正在编写我的第一个内核驱动程序,它在以下行中崩溃DriverEntry

!analyze vWinDbg输出以下:

我试图理解这个问题,有两件事我不明白 - 首先为什么涉及任何可分页内存,因为我只是传递给函数全局变量和局部变量,这两者都是非-分页。(见这里这里。)

其次,为什么 IRQL 高于 0,因为我在 DriverEntry。(参见此处,DriverEntry 在PASSIVE_LEVEL.

我的代码如下。它在发布的最后一行崩溃 - 其他任何内容都不相关,因为它永远不会到达那里。

0 投票
0 回答
66 浏览

c - 为什么 IoGetInitialStack 函数仅限于 IRQL<=APC_LEVEL?

我试图在 Windows 内核中使用的回调函数中找到堆栈的顶部(或底部)。我想为此使用IoGetInitialStack函数,但不幸的是它的文档指出:

IRQL "<=APC_LEVEL"

我用反汇编程序查看了它,它似乎在我的副本中所做的ntoskrnl就是:

在此处输入图像描述

他们为什么将其限制为IRQL<=APC_LEVEL?

0 投票
0 回答
145 浏览

c - KeAcquireSpinLock 执行时间长

我目前正在开发一个实现自己的网络堆栈的 Windows 内核驱动程序。在测试已实现堆栈的一些基本功能时,我注意到对 ping 的回复有时会比平时花费明显更长的时间。进一步调查这个问题,我发现KeAcquireSpinLock偶尔有高达 20 毫秒(而不是几微秒)的执行时间,即使锁没有被其他内核持有(我通过在调用 KeAcquireSpinLock 之前打印锁值来确认这一点)。

因为我不知道为什么KeAcquireSpinLock要花这么长时间,所以我用 实现了一种不同的方法KeAcquireSpinLockAtDpcLevel,如果需要,手动提升 IRQL:

我希望上面的代码在功能上等同于KeAcquireSpinLock. 但是,事实证明,我遇到的运行时问题已经KeAcquireSpinLock消失,并且这种方法的性能很好。

我在互联网上搜索过类似的问题KeAcquireSpinLock,但似乎只有我一个人遇到这个问题。也许我在驱动程序的其他部分有错误?有人可以解释这种行为吗?

请注意,我不是在谈论死锁,因为它KeAcquireSpinLock总是会在某个时候返回,并且KeAcquireSpinLockAtDpcLevel使用相同的架构/锁定对象的实现。