Power Manager-routines gebruiken voor niet-actieve detectie
Power Manager biedt ondersteuning voor niet-actieve detectie via de PoRegisterDeviceForIdleDetection - en PoSetDeviceBusy-routines .
De beheerder van het energiebeleid van het apparaat roept PoRegisterDeviceForIdleDetection aan en geeft het volgende op om inactieve detectie voor zijn apparaat in te schakelen:
De time-outwaarde voor inactiviteit die moet worden toegepast wanneer het systeem optimaliseert voor prestaties.
De time-outwaarde voor inactiviteit die moet worden toegepast wanneer het systeem optimaliseert voor energiebesparing.
De energiestatus van het apparaat waarnaar het apparaat moet overgaan wanneer het niet actief is.
PoRegisterDeviceForIdleDetection retourneert een aanwijzer naar een niet-actieve teller, die het stuurprogramma later gebruikt om inactieve detectie uit te schakelen. Bellers van PoRegisterDeviceForIdleDetection moeten worden uitgevoerd op IRQL-DISPATCH_LEVEL < .
Een stuurprogramma kan het apparaat op elk gewenst moment registreren voor inactieve detectie nadat het apparaat is gestart en gereed is voor het verwerken van stroomgerelateerde IR-aanvragen. Een stuurprogramma kan bijvoorbeeld niet-actieve detectie inschakelen als onderdeel van de IoCompletion-routine voor een IRP van een PnP-startapparaat.
De time-outwaarden voor een bepaald apparaat moeten evenredig zijn aan de opstartlatentie van het apparaat en gebaseerd zijn op waargenomen apparaatgedrag. Voor bepaalde typen apparaten kan een stuurprogramma waarden voor energiebesparende en prestatie-gerelateerde time-outs van -1 opgeven om de standaard time-outs voor het energiebeheer van de apparaatklasse te gebruiken. Zie de apparaatspecifieke documentatie voor meer informatie.
Wanneer het apparaat wordt gebruikt, moet het stuurprogramma PoSetDeviceBusy aanroepen, waarbij de aanwijzer wordt doorgegeven die is geretourneerd door PoRegisterDeviceForIdleDetection. PoSetDeviceBusy stelt de niet-actieve teller opnieuw in, waardoor het aftellen van inactiviteit voor het apparaat opnieuw wordt gestart. Het stuurprogramma moet PoSetDeviceBusy aanroepen bij elke I/O-bewerking.
Om te bepalen of het apparaat niet actief is, vergelijkt de Power Manager de waarde van de niet-actieve teller met de door het stuurprogramma opgegeven time-outwaarde voor inactiviteit voor het huidige energiebeleid van het systeem (behoud of prestaties). Zie de Microsoft Windows SDK voor functies die betrekking hebben op het energiebeleid van het systeem.
Wanneer het apparaat voldoet aan de time-outwaarde, verzendt power manager een apparaatset-IRP, waarbij de energiestatus van het apparaat wordt opgegeven die het stuurprogramma heeft doorgegeven in de aanroep naar PoRegisterDeviceForIdleDetection. Power Manager verzendt geen query-IRP voordat de set-power IRP wordt verzonden. De stuurprogramma's in de stack verwerken het set-power IRP zoals zij een ander IRP zouden verwerken; ze moeten het op tijd voltooien en ze mogen niet falen. (Zie Device Power-Down IRPs verwerken.)
Wanneer het stuurprogramma geen inactiviteitsdetectie meer vereist of niet is voorbereid op het afhandelen van power-down IRP's van het apparaat, moet PoRegisterDeviceForIdleDetection opnieuw aanroepen, waarbij nul wordt doorgegeven voor beide time-outwaarden. Als u de time-outs instelt op nul, wordt de detectie van inactiviteit uitgeschakeld voor energie-instellingen voor zowel energiebesparing (batterij) als prestaties (netstroom). Het stuurprogramma kan snel de detectie van inactiviteit opnieuw inschakelen; het roept gewoon PoRegisterDeviceForIdleDetection aan met niet-nul time-outwaarden. Zodra de bestuurder het apparaat heeft geregistreerd, kan hij de detectie van inactiviteit in- en uitschakelen door de time-outwaarden te wijzigen, zelfs als het apparaat is uitgeschakeld en opnieuw is opgestart.