Använda Power Manager-rutiner för att upptäcka inaktivitet

Power Manager har stöd för inaktiv identifiering via rutinerna PoRegisterDeviceForIdleDetection och PoSetDeviceBusy .

För att aktivera detektering av inaktivitet för enheten anropar en ansvarig för enhetens energipolicy PoRegisterDeviceForIdleDetection och anger:

  • Timeout-värdet för inaktivitet som ska tillämpas när systemet optimerar för prestanda.

  • Timeout-värdet för inaktivitet som ska tillämpas när systemet optimeras för bevarande.

  • Enhetens energitillstånd som enheten ska övergå till när den är inaktiv.

PoRegisterDeviceForIdleDetection returnerar en pekare till en overksamhetsräknare, som drivrutinen använder senare för att stänga av övervakning av inaktivitet. Uppringare av PoRegisterDeviceForIdleDetection måste köras på IRQL-DISPATCH_LEVEL<.

En drivrutin kan registrera sin enhet för detektering av inaktivitet när som helst efter att enheten har startats och är redo att hantera IRP:er för enhetskraft. En drivrutin kan till exempel aktivera detektering av inaktivitet som en del av sin IoCompletion-rutin för en PnP-startenhets-IRP.

Tidsgränsvärdena för en viss enhet ska vara proportionella mot enhetens fördröjning vid uppstart och baserade på observerat enhetsbeteende. För enheter av vissa typer kan en drivrutin ange timeout-värden för bevarande och prestanda för -1 för att använda standardtidsgräns för energiprincip för enhetsklassen. Mer information finns i den enhetsspecifika dokumentationen.

När enheten används måste drivrutinen anropa PoSetDeviceBusy och skicka pekaren som returneras av PoRegisterDeviceForIdleDetection. PoSetDeviceBusy återställer den inaktiva räknaren, vilket startar om nedräkningen för inaktivitet för enheten. Drivrutinen ska anropa PoSetDeviceBusy vid varje I/O-åtgärd.

För att avgöra om enheten är inaktiv jämför Power Manager värdet för den inaktiva räknaren med det drivrutinsdefinierade timeout-värdet för inaktivitet för den aktuella systemkraftsprincipen (antingen bevarande eller prestanda). Se Microsoft Windows SDK för funktioner som rör systemets energiprincip.

När enheten uppfyller timeout-värdet skickar Power Manager en IRP för att ställa in enhetskraft och anger enhetskrafttillståndet som drivrutinen skickade i sitt anrop till PoRegisterDeviceForIdleDetection. Strömhanteraren skickar inte en fråge-IRP innan den skickar en set-power-IRP. Drivrutinerna i stacken hanterar set-power IRP som de skulle hantera andra; de måste slutföra det i tid och de kan inte misslyckas. (Se Handleda enhet Power-Down IRP:er.)

När drivrutinen inte längre kräver identifiering av inaktivitet eller inte är beredd att hantera IRP:er för avstängning av enheter bör den anropa PoRegisterDeviceForIdleDetection igen och ange noll för båda timeout-värdena. Om tidsgränserna anges till noll inaktiveras identifiering av inaktivitet för både energisparfunktioner (batteri) och prestandapolicyer (nätdrift). Drivrutinen kan snabbt återaktivera inaktivitetsdetektering. Den anropar bara PoRegisterDeviceForIdleDetection med timeout-värden som inte är noll. När drivrutinen har registrerat enheten kan den aktivera och inaktivera detektering av inaktivitet genom att ändra tidsgränsvärdena, även om enheten har stängts av och aktiverats igen.