Implementando uma função de manipulador MiniportCancelIdleNotification
O NDIS chama a função de manipulador MiniportCancelIdleNotification do driver de miniporta para cancelar o processo de notificação ociosa e fazer a transição do adaptador de rede para um estado de energia total. Quando essa função é chamada, o driver de miniporta deve seguir estas etapas:
O driver de miniporta deve cancelar quaisquer IRPs específicos do barramento que possa ter emitido anteriormente para a notificação de inatividade.
O driver de miniporta chama NdisMIdleNotificationComplete. Esta chamada notifica o NDIS de que a notificação ociosa foi concluída. Em seguida, o NDIS compila a operação de suspensão seletiva fazendo a transição do adaptador de rede para um estado de energia total.
Por exemplo, quando MiniportCancelIdleNotification é chamado, o driver de miniporta USB chama IoCancelIrp para cancelar o pacote de solicitação de E/S (IRP) para uma solicitação ociosa USB (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION). O driver de miniporta USB emitiu anteriormente esse IRP em sua função de manipulador MiniportIdleNotification. Assim que o driver do barramento USB cancela o IRP, ele chama a rotina de conclusão do IRP. Quando o driver de barramento USB chama a rotina de conclusão, ele confirma que o IRP foi cancelado e o dispositivo pode retomar para um estado de energia total. No contexto da rotina de conclusão, o driver de miniporta chama NdisMIdleNotificationComplete.
Observação O driver de barramento USB pode chamar a rotina de conclusão de forma síncrona no contexto da chamada para IoCancelIrp ou de forma assíncrona após o retorno de MiniportCancelIdleNotification.
A seguir está um exemplo de uma função de manipulador MiniportCancelIdleNotification para um driver de miniporta USB. Este exemplo mostra as etapas envolvidas no cancelamento de uma IRP de solicitação ociosa USB.
//
// MiniportCancelIdleNotification()
//
// This routine is called if NDIS has to cancel an idle notification.
// All that is needed is to cancel the selective suspend IRP.
//
VOID MiniportCancelIdleNotification(
_In_ NDIS_HANDLE MiniportAdapterContext
)
{
IoCancelIrp(Adapter->UsbSsIrp);
}
Para obter diretrizes sobre como implementar uma rotina de conclusão para uma IRP de solicitação ociosa USB, consulte Implementando uma rotina de conclusão de IRP de solicitação ociosa USB.