Реализация процедуры завершения IRP бездействующих запросов USB
При вызове MiniportIdleNotification драйвер USB-минипорта вызывает IoCallDriver , чтобы выдать пакет запроса ввода-вывода (IRP) для запроса простоя USB (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) базовому драйверу USB-шины. Драйвер мини-порта выдает этот IRP, чтобы сообщить драйверу шины USB о том, что сетевой адаптер находится в состоянии простоя и должен быть приостановлен.
Драйвер USB-минипорта также должен вызвать IoSetCompletionRoutineEx , чтобы зарегистрировать подпрограмму завершения для IRP-запроса бездействия USB. Драйвер USB-шины вызывает подпрограмму завершения при завершении IRP после ее отмены драйвером USB-минипорта. Драйвер usb miniport отменяет IRP, когда NDIS отменяет уведомление о простое, вызывая MiniportCancelIdleNotification.
Подпрограмме завершения необходимо только вызвать NdisMIdleNotificationComplete , чтобы уведомить NDIS о том, что она может продолжить переход с полной мощностью состояния сетевого адаптера.
Примечание Подпрограмма завершения должна возвращать STATUS_MORE_PROCESSING_REQUIRED, если usb-драйвер минипорта будет повторно использовать ресурсы IRP во время другого уведомления о простое от NDIS.
Ниже приведен пример процедуры завершения для IRP бездействующего запроса USB.
//
// MiniportUsbIdleRequestCompletion()
//
// This is the IO_COMPLETION_ROUTINE for the selective suspend IOCTL.
// All that is needed is to inform NDIS that the IdleNotification
// operation is complete.
//
VOID MiniportUsbIdleRequestCompletion(PVOID AdapterContext)
{
NdisMIdleNotificationComplete(Adapter->MiniportAdapterHandle);
// We will be reusing the IRP later, so do not let the IO manager delete it.
return STATUS_MORE_PROCESSING_REQUIRED;
}
Дополнительные сведения о процедуре обратного вызова неактивных запросов USB см. в статье Процедура завершения IRP для неактивного запроса USB.