gpt4 book ai didi

windows - 设备驱动程序 IRQL 和线程/上下文切换

转载 作者:可可西里 更新时间:2023-11-01 09:22:24 26 4
gpt4 key购买 nike

我是 Windows 设备驱动程序编程的新手。我知道某些操作只能在 IRQL PASSIVE_LEVEL 执行。例如,Microsoft 有关于如何从内核驱动程序写入文件的示例代码:

if (KeGetCurrentIrql() != PASSIVE_LEVEL)
return STATUS_INVALID_DEVICE_STATE;

Status = ZwCreateFile(...);

我的问题是:是什么阻止了在上面的 KeGetCurrentIrql() 检查之后引发 IRQL?假设发生上下文或线程切换,当它返回到我的驱动程序时,IRQL 会不会突然变为 DISPATCH_LEVEL,然后导致系统崩溃?

如果这不可能,那么为什么不检查 DriverEntry 函数中的 IRQL 并一劳永逸地完成它呢?

最佳答案

线程的irql只能自己引发。

因为你是从upper/lower drivers调用的,所以当前running context的irql可能不同。并且有几个函数可以提高/降低 irql。

几个例子:

IRP_MJ_READ

   NTSTATUS DispatchRead(
__in struct _DEVICE_OBJECT *DeviceObject,
__in struct _IRP *Irp
)
{
// this will be called at irql == PASSIVE_LEVEL
...
// we have acquire a spinlock
KSSPIN_LOCK lck;
KeInititializeSpinLock( &lck );
KIRQL prev_irql;
KeAcquireSpinLock( &lck,&prev_irql );

// KeGetCurrentIrql() == DISPATCH_LEVEL

KeReleaseSpinLock( &lck, prev_irql );
// KeGetCurrentIrql() == PASSIVE_LEVEL
...
}

(Io-)完成例程可以在 DISPATCH_LEVEL 调用,因此应该相应地运行。

NTSTATUS CompleteSth(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp,IN PVOID Context)
{
// KeGetCurrentIrql() >= PASSIVE_LEVEL
}

关于windows - 设备驱动程序 IRQL 和线程/上下文切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2311040/

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