Sdílet prostřednictvím


Rutiny DispatchPnP

Rutina DispatchPnP ovladače podporuje funkcionalitu Plug and Play tím, že zpracovává I/O požadavky (IRP) pro kód IRP_MJ_PNP vstupně-výstupních operací. K funkčnímu kódu IRP_MJ_PNP jsou přidruženy několik menších vstupně-výstupních funkčních kódů (viz Dílčí IRP Plug and Play), z nichž některé musí všechny ovladače zpracovávat, zatímco některé lze zpracovávat volitelně. Správce PnP používá tyto menší kódy funkcí k nasměrování ovladačů na spouštění, zastavování a odebírání zařízení a dotazování ovladačů na jejich zařízení.

Všechny ovladače zařízení musí mít možnost zpracovat PnP IRP pro zařízení, s výjimkou několika případů, kdy může ovladač funkce nebo filtru selhat IRP.

Rutina DispatchPnP každého ovladače musí dodržovat tato pravidla:

  • Funkční nebo filtrační ovladač musí předat PnP IRP dalšímu ovladači v hardwarovém zásobníku zařízení, ledaže by tento ovladač zpracoval IRP a narazil na selhání, například kvůli nedostatku prostředků.

    Pokud některý z ovladačů nenarazí na chybu, musí mít všechny ovladače pro zařízení možnost zpracovat PnP IRP. Správce PnP odesílá IRP na nejvyšší ovladač ve stohu zařízení. Ovladače funkce a filtru předávají IRP dalšímu ovladači a nadřazený ovladač sběrnice dokončí IRP. Další informace najdete v tématu Předávání PnP IRPs v zásobníku zařízení .

    Ovladač může odmítnout IRP, pokud se pokusí ho zpracovat a dojde k chybě (například nedostatkem zdrojů). Pokud ovladač obdrží IRP s kódem, který není schopen zpracovat, nesmí IRP odmítnout. Musí předat takový IRP dalšímu ovladači bez změny jeho stavu.

  • Ovladač musí zpracovávat určité PnP IRP a může se volitelně zabývat jinými.

    Každý ovladač PnP je nutný ke zpracování určitých irps, jako jsou IRP_MN_REMOVE_DEVICE, a volitelně může zpracovat jiné. Podívejte se na Plug and Play Minor IRPs pro informace o tom, které IRP jsou vyžadovány a volitelné pro každý typ ovladače (funkční ovladače, filtrační ovladače a sběrnicové ovladače).

    Ovladač může neúspěšně zpracovat požadovaný IRP PnP s odpovídajícím stavem chyby, ale ovladač nesmí vrátit STATUS_NOT_SUPPORTED pro takový IRP.

  • Pokud ovladač zvládá IRP PnP úspěšně, ovladač nastaví stav protokolu IRP na úspěch. Nezávisí na jiném ovladači v sestavě, aby nastavil stav.

    Ovladač nastaví Irp-IoStatus.Status> na STATUS_SUCCESS, aby informoval správce PnP, že ovladač úspěšně zpracoval IRP. U některých IRP operací může být ovladač nesouvisející se sběrnicí schopný spoléhat na svůj mateřský ovladač sběrnice, aby nastavil stav na úspěch. Toto je ale riziková praxe. Kvůli konzistenci a robustnosti musí ovladač nastavit stav protokolu IRP na úspěch pro každý PnP IRP, který úspěšně zpracovává.

  • Pokud ovladač selže s IRP, ovladač dokončí IRP se stavem chyby a nepředá IRP do dalšího ovladače.

    Chcete-li selhat IRP jako IRP_MN_QUERY_STOP_DEVICE, ovladač nastaví Irp->IoStatus.Status na STATUS_UNSUCCESSFUL. Mezi další hodnoty stavu chyb pro jiné IRP patří STATUS_INSUFFICIENT_RESOURCES a STATUS_INVALID_DEVICE_STATE.

    Ovladače nenastavují STATUS_NOT_SUPPORTED pro IRPs, které zpracovávají. Toto je počáteční stav nastavený správcem PnP. Pokud je IRP dokončen s tímto stavem, znamená to, že žádný ovladač v zásobníku nevyřídil IRP; všechny ovladače jej prostě předaly dalšímu ovladači.

  • Ovladač musí zpracovávat protokol IRP PnP v jeho rutině odesílání (na cestě IRP do zásobníku zařízení), v rutině IoCompletion (na cestě IRP zpět do zásobníku zařízení) nebo obojí, jak je uvedeno na referenční stránce pro IRP.

    Některé PnP IRPs, jako je například IRP_MN_REMOVE_DEVICE, musí nejprve zpracovat ovladač v horní části zásobníku zařízení a poté každým dalším nižším ovladačem. Ostatní, například IRP_MN_START_DEVICE, musí nejprve zpracovat nadřazený řidič autobusu. Ostatní, například IRP_MN_QUERY_CAPABILITIES, se dají zvládnout jak při sestupování, tak při návratu v hierarchii zařízení. Více informací o pravidlech, která platí pro jednotlivé IRP systému Plug and Play, naleznete v části Plug and Play Minor IRPs. Informace o zpracování PnP, které musí nejprve zpracovat nadřazený ovladač sběrnice, najdete v tématu Pozpožďování zpracování protokolu IRP až do dokončení nižších ovladačů .

  • Ovladač musí přidat informace do IRP při sestupu po zásobníku zařízení a upravit nebo odebrat informace při návratu IRP zpět nahoru.

    Při vracení informací v reakci na PnP dotaz IRP musí ovladač dodržovat tuto konvenci, aby vrstvené ovladače zařízení mohly uspořádaně předávat informace.

  • Pokud to není explicitně zdokumentováno, ovladač nesmí záviset na tom, že PnP IRPs jsou odesílány v konkrétním pořadí.

  • Když ovladač odešle IRP PnP, musí odeslat IRP na nejvyšší ovladač v zásobníku zařízení.

    Většina PnP IRP je odesílána správcem PnP, ale některé můžou odesílat ovladače (například IRP_MN_QUERY_INTERFACE). Ovladač musí odeslat PnP IRP k ovladači umístěnému v horní části zásobníku zařízení. Zavolejte IoGetAttachedDeviceReference a získejte ukazatel na objekt zařízení pro ovladač v horní části zásobníku zařízení.