Реализация процедуры обратного вызова IRP бездействующих запросов USB
При вызове MiniportIdleNotification драйвер USB-минипорта вызывает IoCallDriver , чтобы выдать пакет запроса ввода-вывода (IRP) для запроса простоя USB (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) базовому драйверу USB-шины. Драйвер мини-порта выдает этот IRP, чтобы сообщить драйверу шины USB о том, что сетевой адаптер находится в состоянии простоя и должен быть приостановлен.
Драйвер USB-минипорта должен предоставлять подпрограмму обратного вызова IRP для IRP бездействующего запроса USB. Драйвер шины USB вызывает эту подпрограмму, когда определяет, что сетевой адаптер может быть приостановлен и переведен в состояние с низким энергопотреблением.
Примечание После того как драйвер шины USB обрабатывает IRP бездействующего запроса USB, он вызывает подпрограмму обратного вызова либо синхронно в контексте вызова IoCallDriver , либо асинхронно после возврата MiniportIdleNotification .
Подпрограмма обратного вызова должна вызывать только NdisMIdleNotificationConfirm , чтобы уведомить NDIS о том, что она может продолжить переход состояния с низким энергопотреблением сетевого адаптера. Когда драйвер вызывает NdisMIdleNotificationConfirm, он также должен указать наименьшее состояние питания устройства, в которое может перейти сетевой адаптер.
В контексте вызова NdisMIdleNotificationConfirm NDIS выполняет действия, необходимые для перевода сетевого адаптера в состояние с низким энергопотреблением. Дополнительные сведения см. в разделе Обработка уведомления NDIS о выборочной приостановке простоя.
Ниже приведен пример процедуры обратного вызова для IRP бездействующего запроса USB.
//
// MiniportUsbIdleRequestCallback()
//
// This is the USB selective suspend idle notification. All that is
// needed is to inform NDIS that the USB stack is ready to go to a
// low-power state. Be aware that USB devices will always be requested
// to transition to a power state of NdisDeviceStateD2.
//
VOID MiniportUsbIdleRequestCallback(PVOID AdapterContext)
{
NdisMIdleNotificationConfirm(
AdapterContext->MiniportAdapterHandle,
NdisDeviceStateD2
);
return;
}
Дополнительные сведения о процедуре обратного вызова неактивного запроса USB см. в статье Процедура обратного вызова IRP бездействуемого запроса USB.