gpt4 book ai didi

c++ - Windows 驱动程序、自旋锁获取和条件测试

转载 作者:行者123 更新时间:2023-11-28 04:55:41 32 4
gpt4 key购买 nike

在一个调度例程中,我们有以下代码:

if (DeviceExtension->Flag)
{
KeAcquireInStackQueuedSpinLockAtDpcLevel(&DeviceExtension->SpinLock, &LockHandle);

//... when we will enter here, DeviceExtension->Flag can already be set to FALSE.

KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
}

在另一个调度例程中,我们有以下代码:

KeAcquireInStackQueuedSpinLockAtDpcLevel(&DeviceExtension->SpinLock, &LockHandle);

//...

DeviceExtension->Flag = FALSE;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);

因此,当我们将在第一个调度例程中获取自旋锁时,DeviceExtension->Flag 已经可以被第二个例程设置为 FALSE。解决方案是获取自旋锁,然后检查 DeviceExtension->Flag。然而 DeviceExtension->Flag 可能为 FALSE,在这种情况下自旋锁获取似乎非常繁重。

我对多线程不是很熟悉,尤其是内核态。我知道这个问题很愚蠢,但我迷路了。在这种情况下,正确的解决方案是什么?谢谢。

最佳答案

this flag indicates that device is to be removed, so it works one way

为此特别存在Run-Down Protection

你需要 EX_RUNDOWN_REF RunRef;改为设备扩展中的成员 bool Flag

初始化
ExInitializeRundownProtection(&RunRef);

当你需要做一些操作时,只有当设备还没有被移除时你才需要做:

if (ExAcquireRundownProtection(&DeviceExtension->RunRef))
{
// do something
ExReleaseRundownProtection(&DeviceExtension->RunRef)
}

并在IRP_MN_REMOVE_DEVICE您需要调用的处理程序

ExWaitForRundownProtectionRelease(&DeviceExtension->RunRef);

重要说明 - 尽管在 msdn 中声明 ExAcquireRundownProtectionExReleaseRundownProtection必须调用IRQL <= APC_LEVEL这是错误的。 ExAcquireRundownProtection只需对内存进行一些互锁操作即可 RunRef - 所以如果它在非分页池中 - 我们可以在任何 IRQL 调用这个例程.设备扩展在非分页池中。 ExReleaseRundownProtection可以加拨KeSetEvent Wait 设置为 FALSE .结果它可以在 IRQL <= DISPATCH_LEVEL 运行. ExReleaseRundownProtection我们通常从 IoCompletion 打电话例程(在小于或等于 IRQLDISPATCH_LEVEL 执行)所以这里一切正常。

ExWaitForRundownProtectionRelease当然必须调用 <= APC_LEVEL因为在这里我们可以等待,但是 PnP 管理器发送了 IRP_MN_REMOVE_DEVICEIRQL PASSIVE_LEVEL - 所以这里一切都好


当然你这里可以用and Remove Locks这与破败保护几乎完全相同。简单的破旧保护 - 更多新的 api,以及更好的设计/实现比较删除锁。但是在 IoReleaseRemoveLock 的文档中和 IoReleaseRemoveLock正确说明 IRQL
<= DISPATCH_LEVEL
必须和IoReleaseRemoveLockAndWait必须调用 PASSIVE_LEVEL

关于c++ - Windows 驱动程序、自旋锁获取和条件测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47167312/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com