Implementieren einer MiniportCancelIdleNotification-Handlerfunktion
NDIS ruft die MiniportCancelIdleNotification-Handlerfunktion des Miniporttreibers auf, um den Leerlaufbenachrichtigungsprozess abzubrechen und den Netzwerkadapter in einen Vollstromzustand zu übertragen. Wenn diese Funktion aufgerufen wird, muss der Miniporttreiber die folgenden Schritte ausführen:
Der Miniporttreiber muss alle busspezifischen IRPs abbrechen, die er zuvor für die Leerlaufbenachrichtigung ausgestellt haben kann.
Der Miniporttreiber ruft NdisMIdleNotificationComplete auf. Dieser Aufruf benachrichtigt NDIS, dass die Leerlaufbenachrichtigung abgeschlossen wurde. Anschließend kompiliert NDIS den selektiven Anhaltevorgang, indem der Netzwerkadapter in einen Vollstromzustand übergestellt wird.
Wenn beispielsweise MiniportCancelIdleNotification aufgerufen wird, ruft der USB-Miniporttreiber IoCancelIrp auf, um das E/A-Anforderungspaket (IRP) für eine USB-Leerlaufanforderung (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) abzubrechen. Der USB-Miniporttreiber hat diesen IRP zuvor in seiner MiniportIdleNotification-Handlerfunktion ausgegeben. Sobald der USB-Bustreiber das IRP abgebrochen hat, ruft er die Abschlussroutine des IRP auf. Wenn der USB-Bustreiber die Abschlussroutine aufruft, wird bestätigt, dass das IRP abgebrochen wird und das Gerät in einen Vollstromzustand fortgesetzt werden kann. Im Kontext der Abschlussroutine ruft der Miniporttreiber NdisMIdleNotificationComplete auf.
Hinweis : Der USB-Bustreiber kann die Abschlussroutine entweder synchron im Kontext des Aufrufs von IoCancelIrp oder asynchron nach dem Zurückgeben von MiniportCancelIdleNotification aufrufen.
Nachfolgend sehen Sie ein Beispiel für eine MiniportCancelIdleNotification-Handlerfunktion für einen USB-Miniporttreiber. In diesem Beispiel werden die Schritte veranschaulicht, die mit dem Abbrechen einer IRP für usb-Leerlaufanforderungen verbunden sind.
//
// 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);
}
Richtlinien zum Implementieren einer Abschlussroutine für ein IRP für USB-Leerlaufanforderungen finden Sie unter Implementieren einer USB Idle Request IRP Completion Routine.