Задержка выполнения IRP_MN_SET_POWER - PullRequest
1 голос
/ 04 июля 2011

Я занимаюсь разработкой драйвера устройства 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 () возвращается немедленно, без ожидания?Есть предложения?

Спасибо,

Ответы [ 2 ]

2 голосов
/ 04 июля 2011

Не уверен, но вот несколько советов:

  1. Проверьте возвращаемое значение KeDelayExecutionThread. Согласно документам кажется , что эта функция может возвращать предварительно либо STATUS_ALERTED, либо STATUS_USER_APC. Ну, так как вы выполняете состояние без предупреждения, этого не должно произойти, но ОТО, я не совсем понимаю, в чем разница между STATUS_ALERTED и STATUS_USER_APC. Кроме того, он может вернуть вам статус ошибки, который может быть информативным.

  2. В соответствии с документацией вы должны работать на IRQL <= <code>APC_LEVEL. Вы должны проверить свой фактический IRQL (KeGetCurrentIrql).

  3. В любом случае, ИМХО, это довольно странный дизайн - блокировать поток в режиме ядра. Обычно от этого зависает вся система. Если вы хотите отложить обработку IRP, вам лучше вернуть STATUS_PENDING в процедуре отправки, а затем через таймер DPC завершить эту IRP.

Если вы не знакомы с этим, прочитайте в MSDN следующее: KeInitializeDpc, KeInitializeTimer, KeSetTimer.

1 голос
/ 05 июля 2011

Предыдущий ответ был хорошим, блокировка в цепочке питания, как это, не рекомендуется (даже в документах). Зачем вам нужна 10-секундная задержка на первом месте?

-Скотт

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...