Поделиться через


Метод IWDFIoRequest2::StopAcknowledge (wudfddi.h)

[Предупреждение: UMDF 2 является последней версией UMDF и заменяет UMDF 1. Все новые драйверы UMDF должны быть написаны с помощью UMDF 2. Новые функции не добавляются в UMDF 1, а поддержка UMDF 1 в более новых версиях Windows 10 ограничена. Универсальные драйверы Windows должны использовать UMDF 2. Дополнительные сведения см. в разделе начало работы с помощью UMDF.]

Метод StopAcknowledge информирует платформу о том, что драйвер прекратил обработку указанного запроса ввода-вывода.

Синтаксис

void StopAcknowledge(
  [in] BOOL Requeue
);

Параметры

[in] Requeue

Логическое значение, которое, если значение TRUE, приводит к тому, что платформа повторно отправляет запрос в очередь, чтобы платформа снова доставляла его драйверу. Если задано значение FALSE, платформа не отправляет запрос повторно. Дополнительные сведения см. в разделе "Примечания".

Возвращаемое значение

None

Remarks

Если драйвер регистрирует функцию обратного вызова IQueueCallbackIoStop::OnIoStop для очереди ввода-вывода , платформа вызывает ее, когда базовое устройство очереди покидает рабочее состояние (D0). Платформа вызывает эту функцию обратного вызова для каждого запроса ввода-вывода, которым владеет драйвер в момент остановки очереди. Драйвер должен завершить, отменить или отложить обработку каждого запроса, выполнив одно из следующих действий:

  • Если драйвер владеет запросом, он может вызвать IWDFIoRequest::Complete для завершения или отмены запроса.
  • Если драйвер перенаправил запрос в целевой объект ввода-вывода, он может вызвать IWDFIoRequest::CancelSentRequest , чтобы попытаться отменить запрос.
  • Если драйвер откладывает обработку запроса, он должен вызвать StopAcknowledge.
Если драйвер вызывает StopAcknowledge, он должен вызвать этот метод из функции обратного вызова IQueueCallbackIoStop::OnIoStop .

Если драйвер не вызывает IWDFIoRequest::Complete или StopAcknowledge для каждого запроса, который получает функция обратного вызова IQueueCallbackIoStop::OnIoStop , платформа не позволяет устройству покидать рабочее состояние (D0). Потенциально это бездействие может помешать системе войти в состояние гибернации или другое состояние с низким энергопотреблением системы.

Когда функция обратного вызова IQueueCallbackIoStop::OnIoStop драйвера вызывает StopAcknowledge, она может задать для параметра Requeueзначение TRUE или FALSE:

  • Если задать для параметра Requeue значение TRUE , платформа помещает запрос обратно в очередь ввода-вывода.

    Когда базовое устройство вернется в рабочее состояние (D0), платформа повторно выполнит запрос к драйверу.

  • Если задать для параметра Requeue значение FALSE , владение запросом останется у драйвера. Драйвер должен прекратить обработку ввода-вывода, требующую доступа к оборудованию.

    Когда базовое устройство вернется в рабочее состояние (D0), платформа вызовет функцию обратного вызова IQueueCallbackIoResume::OnIoResume драйвера, чтобы драйвер смог продолжить обработку запроса.

Если драйвер ранее вызывал IWDFIoRequest::MarkCancelable, он должен вызвать IWDFIoRequest::UnmarkCancelable перед вызовомStopAcknowledge с параметром Requeue , равным TRUE.

Перед вызовом StopAcknowledge функция обратного вызова IQueueCallbackIoStop::OnIoStop драйвера должна остановить всю обработку запроса ввода-вывода, требующего доступа к базовому устройству, так как устройство должно перейти в состояние с низким энергопотреблением.

Примеры

В следующем примере кода показана функция обратного вызова IQueueCallbackIoStop::OnIoStop , которая проверяет, можно ли отменить полученный запрос, и, если это так, вызывает IWDFIoRequest::UnmarkCancelable. Если IWDFIoRequest::UnmarkCancelable возвращает HRESULT_FROM_WIN32(ERROR_OPERATION_ABORTED), пример просто возвращает значение, так как функция обратного вызова IRequestCallbackCancel::OnCancel драйвера будет обрабатывать запрос. В противном случае в примере вызывается stopAcknowledge и указывается значение FALSE , чтобы платформа в конечном итоге вызывала функцию обратного вызова IQueueCallbackIoResume::OnIoResume драйвера.

void
CMyReadWriteQueue::OnIoStop(
    __in IWDFIoQueue*  pWdfQueue,
    __in IWDFIoRequest*  pWdfRequest,
    __in ULONG  ActionFlags
    )
{ HRESULT status;

    if (ActionFlags & WdfRequestStopRequestCancelable) {
        status = pWdfRequest->UnmarkCancelable();
        if (status == HRESULT_FROM_WIN32(ERROR_OPERATION_ABORTED)) {
        return;
        }
    }
    //
    // Declare an IWDFIoRequest2 interface pointer and obtain the
    // IWDFIoRequest2 interface from the IWDFIoRequest interface.
    //
    CComQIPtr<IWDFIoRequest2> r2 = pWdfRequest;

    r2->StopAcknowledge(FALSE);
}

Требования

Требование Значение
Дата окончания поддержки Недоступно в UMDF 2.0 и более поздних версиях.
Целевая платформа Персональный компьютер
Минимальная версия UMDF 1,9
Верхняя часть wudfddi.h (включая Wudfddi.h)
DLL WUDFx.dll

См. также раздел

IQueueCallbackIoResume::OnIoResume

IQueuecallbackIoStop::OnIoStop

IWDFIoRequest2