首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >延迟IRP_MN_SET_POWER的执行

延迟IRP_MN_SET_POWER的执行
EN

Stack Overflow用户
提问于 2011-07-04 21:36:04
回答 2查看 559关注 0票数 1

我正在开发一个Windows设备驱动程序,需要将系统关机的执行延迟大约10秒。我在我的驱动程序的DispatchPower()函数中使用了以下代码:

代码语言:javascript
复制
NTSTATUS DispatchPower(
  __in  struct _DEVICE_OBJECT *DeviceObject,
  __in  struct _IRP *Irp
)
{

    switch(stack->MinorFunction)
    {
        case IRP_MN_SET_POWER:            
            delay_time.QuadPart = WDF_REL_TIMEOUT_IN_SEC(10);
            KeDelayExecutionThread(KernelMode, FALSE, &delay_time);
    }

}

但是看起来KeDelayExecutionThread()不需要等待就可以立即返回?有什么建议吗?

谢谢,

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-07-04 22:41:12

不确定,但这里有一些建议:

  1. 检查KeDelayExecutionThread的返回值。根据文档,此函数可能会返回STATUS_ALERTEDSTATUS_USER_APC的初步结果。好吧,既然你正在执行一种不可警示的状态,这应该不会发生,但是我不太明白STATUS_ALERTEDSTATUS_USER_APC之间的区别。除此之外,它可能会返回一个错误状态,这可能是你必须在IRQL <= APC_LEVEL上运行的文档的informative.
  2. According。你应该检查一下你实际的IRQL,这是一个非常奇怪的设计,在内核模式下阻塞一个线程。通常这会挂起整个系统。如果你想延迟IRP的处理,你最好在调度例程中返回STATUS_PENDING,然后通过定时器DPC完成这个IRP。

如果你对此不熟悉,请阅读关于以下内容的MSDN:KeInitializeDpcKeInitializeTimerKeSetTimer

票数 2
EN

Stack Overflow用户

发布于 2011-07-06 00:12:23

前面的答案很好,在这样的power线程中阻塞是不被鼓励的(即使在文档中也是如此)。为什么你首先需要10秒的延迟呢?

-scott

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6572259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档