Implémentation d’une routine d’exécution IRP de demande d’inactivité USB
Lorsque MiniportIdleNotification est appelé, le pilote miniport USB appelle IoCallDriver pour émettre un paquet de demandes d’E/S (IRP) pour une demande d’inactivité USB (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) au pilote de bus USB sous-jacent. Le pilote miniport émet cette IRP pour informer le pilote de bus USB que la carte réseau est inactive et doit être suspendue.
Le pilote miniport USB doit également appeler IoSetCompletionRoutineEx pour inscrire une routine d’achèvement pour l’IRP de demande d’inactivité USB. Le pilote de bus USB appelle la routine d’achèvement lorsqu’il termine l’IRP après l’annulation par le pilote miniport USB. Le pilote miniport USB annule l’IRP lorsque NDIS annule la notification d’inactivité en appelant MiniportCancelIdleNotification.
La routine d’achèvement n’a qu’à appeler NdisMIdleNotificationComplete pour informer NDIS qu’elle peut poursuivre la transition de l’état d’alimentation totale de la carte réseau.
Note La routine d’achèvement doit retourner STATUS_MORE_PROCESSING_REQUIRED si le pilote miniport USB réutilise les ressources IRP lors d’une autre notification d’inactivité de NDIS.
Voici un exemple de routine d’achèvement pour l’IRP de demande d’inactivité 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;
}
Pour plus d’informations sur la routine de rappel de la demande d’inactivité USB, consultez Routine d’achèvement de la demande d’inactivité USB.