Метод 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.
Если драйвер не вызывает IWDFIoRequest::Complete или StopAcknowledge для каждого запроса, который получает функция обратного вызова IQueueCallbackIoStop::OnIoStop , платформа не позволяет устройству покидать рабочее состояние (D0). Потенциально это бездействие может помешать системе войти в состояние гибернации или другое состояние с низким энергопотреблением системы.
Когда функция обратного вызова IQueueCallbackIoStop::OnIoStop драйвера вызывает StopAcknowledge, она может задать для параметра Requeueзначение TRUE или FALSE:
-
Если задать для параметра Requeue значение TRUE , платформа помещает запрос обратно в очередь ввода-вывода.
Когда базовое устройство вернется в рабочее состояние (D0), платформа повторно выполнит запрос к драйверу.
-
Если задать для параметра Requeue значение FALSE , владение запросом останется у драйвера. Драйвер должен прекратить обработку ввода-вывода, требующую доступа к оборудованию.
Когда базовое устройство вернется в рабочее состояние (D0), платформа вызовет функцию обратного вызова IQueueCallbackIoResume::OnIoResume драйвера, чтобы драйвер смог продолжить обработку запроса.
Перед вызовом 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