Condividi tramite


Power IRP per il sistema

Un IRP di alimentazione di sistema specifica il codice IRP principale IRP_MJ_POWER, uno dei codici IRP di alimentazione secondari elencati di seguito e il valore SystemPowerState nel membro Power.Type dello stack IRP. Solo il risparmio energia può inviare tale IRP; un driver non può inviare un IRP di alimentazione di sistema.

Il risparmio energia invia un IRP di alimentazione di sistema per uno dei motivi seguenti:

  • Per modificare lo stato di alimentazione del sistema in risposta a un timeout di inattività, una modifica nell'attività di sistema, una richiesta utente o una batteria in scadenza (IRP_MN_SET_POWER)

  • Per eseguire query sui dispositivi per determinare se il sistema può passare alla sospensione (IRP_MN_QUERY_POWER)

  • Per confermare lo stato corrente di alimentazione del sistema dopo una query (IRP_MN_SET_POWER)

Il risparmio energia invia IRP_MN_QUERY_POWER e IRP_MN_SET_POWER richieste per conto del sistema. Un driver può non riuscire in una richiesta di IRP_MN_QUERY_POWER ma non può avere esito negativo IRP_MN_SET_POWER.

Ad esempio, per modificare lo stato di alimentazione del sistema, il risparmio energia invia un IRP di alimentazione di sistema al driver superiore nello stack in ogni nodo del dispositivo dell'albero dei dispositivi. La figura seguente illustra come i driver all'interno di un singolo stack di dispositivi gestiscono un IRP di alimentazione del sistema.

diagramma che illustra il percorso di un irp di alimentazione di sistema.

Come illustrato nella figura precedente:

  1. Il risparmio energia chiama il gestore di I/O per inviare un IRP di alimentazione di sistema a ogni nodo foglia nell'albero dei dispositivi.

  2. Se possibile, i driver gestiscono le routine IoCompletion e chiamano IoCallDriver (Windows 7 e Windows Vista) o PoCallDriver (Windows Server 2003, Windows XP e Windows 2000) per inoltrare l'IRP verso il basso nello stack. Se un driver deve avere esito negativo sull'IRP, il driver lo esegue immediatamente e completa l'IRP. I driver possono avere esito negativo IRP_MN_QUERY_POWER IRP, ma non devono avere esito negativo IRP_MN_SET_POWER IRP che impostano lo stato di alimentazione del sistema.

  3. Quando il driver proprietario dei criteri di alimentazione per il dispositivo riceve l'IRP, tale driver imposta una routine IoCompletion per l'IRP di sistema e quindi inoltra l'IRP.When the driver that owns power policy for the device receive the IRP, that driver set an IoCompletion routine for the system IRP and then forwards the IRP.

  4. Eventuali altri driver nello stack gestiscono l'IRP, se possibile, impostano le routine IoCompletion , se necessario, e inoltrano l'IRP al driver inferiore successivo, come nel passaggio 2.

  5. Alla fine, il conducente dell'autobus riceve e completa l'IRP di sistema.

  6. Il gestore di I/O chiama tutte le routine IoCompletion impostate come driver che hanno passato l'IRP di sistema verso il basso lo stack di dispositivi.

  7. Nella routine IoCompletion il proprietario dei criteri di risparmio energia del dispositivo chiama PoRequestPowerIrp per inviare un IRP di alimentazione del dispositivo, specificando uno stato di alimentazione del dispositivo valido per lo stato di alimentazione del sistema nell'IRP di sistema. Il driver imposta una routine di callback da richiamare al completamento dell'IRP di alimentazione del dispositivo.

    Se necessario, il driver consulta il membro DeviceState nella copia memorizzata nella cache della struttura di DEVICE_CAPABILITIES (vedere Reporting Device Power Capabilities) per determinare quali stati di alimentazione del dispositivo corrispondono allo stato di alimentazione del sistema in IRP.

  8. Al termine dell'IRP del dispositivo e dopo l'esecuzione di tutte le routine di completamento IRP del dispositivo, viene richiamata la routine di callback del proprietario dei criteri di alimentazione. Nella routine di callback il driver copia lo stato restituito nell'IRP di sistema. In Windows Server 2003, Windows XP e Windows 2000 il callback chiama PoStartNextPowerIrp per avviare l'IRP di alimentazione successiva. Tuttavia, in Windows 7 e Windows Vista, la chiamata a PoStartNextPowerIrp non è necessaria e tale chiamata non esegue alcuna operazione di risparmio energia. Infine, il callback chiama IoCompleteRequest per completare l'IRP di sistema.

Per altre informazioni, vedere Gestione delle richieste di stato di alimentazione del sistema.

Poiché alcuni dispositivi richiedono un inrush di corrente quando vengono accusati, i runtime di integrazione di alimentazione di sistema vengono gestiti in modo sincrono e seriale in tutto il sistema. Un solo IRP può essere attivo alla volta. Per altre informazioni, vedere Chiamata di IoCallDriver e Chiamata di PoCallDriver.