windows - 延迟执行 IRP_MN_SET_POWER

标签 windows device-driver

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

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()没有等待就立即返回了?有什么建议吗?

谢谢,

最佳答案

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

  1. 检查KeDelayExecutionThread 的返回值。根据文档,似乎此函数可能会返回 STATUS_ALERTEDSTATUS_USER_APC 的初步结果。好吧,由于您正在执行非警报状态,所以这不应该发生,但是 OTOH 我不太明白 STATUS_ALERTEDSTATUS_USER_APC 之间有什么区别。除此之外,它可能会返回一个错误状态,这可能会提供信息。

  2. 根据文档,您必须以 IRQL <= APC_LEVEL 运行。您应该检查您的实际 IRQL (KeGetCurrentIrql)。

  3. 无论如何,恕我直言,在内核模式下阻塞线程是一个非常奇怪的设计。通常这会挂起整个系统。如果您想延迟 IRP 处理,您最好在调度例程中返回 STATUS_PENDING,然后通过定时器 DPC 完成此 IRP。

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

关于windows - 延迟执行 IRP_MN_SET_POWER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6572259/

相关文章:

Python 连续读取 Popen (Windows)

c++ - 了解 C++ 程序 [ Bjarne Stroustrup 的书 ]

c - 平台设备驱动的Major编号是怎么分配的?

java - 是否可以用 Java 编写设备驱动程序?

linux - "cat"命令在从 Linux 设备驱动程序读取时终止

windows - Python : How to open a folder on Windows Explorer(Python 3. 6.2,Windows 10)

c# - 如何为我的 Web 应用程序创建 MSI?

c++ - 将 Unicode 命令行参数传递给控制台应用程序

c - 如何将位域(通过引用)传递给函数?

windows - "partially opaque"对 Windows 代码意味着什么?