Implementatie van een IRP-voltooiingsroutine voor niet-actieve USB-aanvragen
Wanneer MiniportIdleNotification wordt aangeroepen, roept het USB-minipoortstuurprogramma IoCallDriver- aan om een I/O-aanvraagpakket (IRP) uit te geven voor een USB-inactiviteitsaanvraag (IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) naar het onderliggende USB-busstuurprogramma. Het minipoortstuurprogramma geeft deze IRP uit om het USB-busstuurprogramma te informeren dat de netwerkadapter inactief is en moet worden onderbroken.
Het USB-minipoortstuurprogramma moet ook IoSetCompletionRoutineEx aanroepen om een voltooiingsroutine te registreren voor de IRP van de USB-inactiviteitsaanvraag. Het USB-busstuurprogramma roept de voltooiingsroutine aan wanneer het de IRP voltooit nadat deze is geannuleerd door het USB-minipoortstuurprogramma. Het USB-minipoortstuurprogramma annuleert de IRP wanneer NDIS de inactieve melding annuleert door MiniportCancelIdleNotificationaan te roepen.
De voltooiingsroutine hoeft alleen NdisMIdleNotificationComplete aan te roepen om NDIS op de hoogte te stellen dat deze kan doorgaan met de overgang van de volledige energiestatus van de netwerkadapter.
Opmerking De voltooiingsroutine moet STATUS_MORE_PROCESSING_REQUIRED retourneren als het USB-minipoortstuurprogramma de IRP-resources opnieuw gebruikt tijdens een andere niet-actieve melding van NDIS.
Hier volgt een voorbeeld van een voltooiingsroutine voor de USB-inactiviteitsaanvraag-IRP.
//
// 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;
}
Voor meer informatie over de USB-inactiviteit aanvraag callbackroutine, zie de IRP-voltooiingsroutine.