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


Реализация процедуры завершения 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.