Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Řidičova rutina DispatchPower podporuje řízení spotřeby tím, že zpracovává IRPy pro kód vstupně-výstupní funkce IRP_MJ_POWER. Kódu funkce IRP_MJ_POWER je přidruženo několik dílčích I/O kódů funkcí pro správu napájení. Power Manager pomocí těchto menších kódů funkcí směruje ovladače na změnu stavu napájení, čekat na události probuzení systému a reagovat na ně a dotazovat se na ovladače o jejich zařízeních.
Rutina DispatchPower každého řidiče provádí následující úlohy:
Pokud je to možné, zpracujte IRP.
Pomocí funkce PoCallDriver předejte IRP dalšímu nižšímu ovladači v zásobníku zařízení.
Pokud jste řidičem sběrnice, proveďte požadovanou operaci napájení na zařízení a dokončete zpracování IRP.
Všechny ovladače zařízení musí mít možnost zpracovávat energetické IRP zařízení, s výjimkou několika případů, kdy je povoleno, aby ovladač funkce nebo filtru daný IRP zpracovat odmítl. Většina ovladačů funkcí a filtrů buď provádí určité zpracování, nebo nastaví rutinu IoCompletion pro každý power IRP a pak předá IRP dalšímu nižšímu ovladači, aniž by ho dokončil. Nakonec IRP dosáhne ovladače sběrnice, který fyzicky změní stav napájení zařízení v případě potřeby a dokončí IRP.
Po dokončení IRP volá správce vstupně-výstupních operací všechny rutiny IoCompletion, které byly nastaveny ovladači během sestupu IRP dolů zásobníkem zařízení. Určení, zda ovladač potřebuje nastavit rutinu dokončení, závisí na typu IRP a na individuálních požadavcích ovladače.
IRP, které zapnuli zařízení, musí nejprve obsloužit nejnižší ovladač v zásobníku zařízení (podkladový ovladač sběrnice) a potom každý následný ovladač v zásobníku. Power IRPs, které vypínají zařízení, musí nejprve zpracovat ovladač na vrcholu zásobníku zařízení a potom každý následující ovladač směrem dolů po zásobníku.
Speciální manipulace s vyměnitelnými zařízeními
V rutinách DispatchPower by ovladače vyměnitelných zařízení měly zkontrolovat, zda je zařízení stále přítomno. Pokud bylo zařízení odebráno, ovladač by neměl předat IRP dolů na další nižší ovladač. Místo toho by ovladač měl udělat toto:
Zavolejte PoStartNextPowerIrp a začněte zpracovávat další IRP napájení.
Nastavte Irp->IoStatus.Status na STATUS_DELETE_PENDING.
Zavolejte IoCompleteRequest a zadejte IO_NO_INCREMENT a dokončete IRP.
Vrátit STATUS_DELETE_PENDING.