Sdílet prostřednictvím


Přidání zařízení PnP do spuštěného systému

Tato část popisuje posloupnost událostí, ke kterým dochází, když systém nakonfiguruje zařízení PnP, které uživatel přidal do spuštěného počítače. Tato diskuze zvýrazňuje role správce PnP, ovladačů sběrnice, funkčních ovladačů a ovladačů filtrů při identifikaci a konfiguraci nového zařízení.

Většina této diskuze je také relevantní pro konfiguraci zařízení PnP, které se nachází při spuštění počítače. Konkrétně zařízení, jejichž ovladače jsou označeny SERVICE_DEMAND_START v souboru INF, jsou v podstatě nakonfigurovány stejným způsobem, zda je zařízení přidáno dynamicky nebo je přítomno při spuštění.

Následující obrázek ukazuje první kroky při konfiguraci zařízení, počínaje tím, kdy uživatel připojí hardware k počítači.

diagram znázorňující výčet a hlášení zařízení plug and play

Následující poznámky odpovídají zakroužkovaným číslům na předchozím obrázku:

  1. Uživatel připojí zařízení PnP do volného slotu sběrnice PnP.

    V tomto příkladu uživatel připojí joystick PnP USB do rozbočovače na hostitelském řadiči USB. Rozbočovač USB je sběrnicové zařízení PnP, protože k němu lze připojit podřízená zařízení.

  2. Funkční ovladač sběrnicového zařízení určí, že na jeho sběrnici je nové zařízení.

    Způsob, jakým to ovladač určuje, závisí na architektuře sběrnice. U některých sběrnic obdrží funkční ovladač sběrnice oznámení o nových zařízeních v rámci hot-plug notifikace. Pokud sběrnice nepodporuje oznámení typu hot-plug, musí uživatel v Ovládacích panelech podniknout odpovídající kroky, aby byla sběrnice znovu detekována.

    V tomto příkladu podporuje sběrnice USB oznámení typu hot-plug, aby ovladač funkce sběrnice USB byl upozorněn, že se jeho podřízené položky změnily.

  3. Ovladač funkce pro sběrnicové zařízení upozorní správce PnP, že se změnila jeho sada podřízených zařízení.

    Ovladač funkce upozorní správce PnP tak, že zavolá IoInvalidateDeviceRelations s TypeBusRelations.

  4. Správce PnP se dotazuje ovladačů sběrnice na aktuální seznam zařízení ve sběrnici.

    Správce PnP odešle požadavek IRP_MN_QUERY_DEVICE_RELATIONS do zásobníku zařízení na sběrnici. Hodnota Parameters.QueryDeviceRelations.Type je BusRelations, což znamená, že správce PnP žádá o aktuální seznam zařízení, která jsou na sběrnici (vztahy sběrnice).

    Správce PnP odešle IRP nejvyššímu ovladači ve stacku zařízení na sběrnici. Podle pravidel pro PnP IRP každý ovladač v řetězci zpracovává IRP, je-li to vhodné, a předává IRP k následujícímu ovladači.

  5. Ovladač funkce pro zařízení sběrnice zpracovává IRP.

    Podrobné informace o zpracování tohoto IRP najdete na referenční stránce IRP_MN_QUERY_DEVICE_RELATIONS.

    V tomto příkladu ovladač rozbočovače USB zpracovává tento IRP pro rozbočovač FDO. Ovladač rozbočovače vytvoří PDO pro zařízení joysticku a zahrnuje odkazovaný ukazatel na PDO joysticku v seznamu podřízených zařízení vrácených v rámci IRP.

    Když nadřazený ovladač sběrnice rozbočovače USB (ovladač třídy/minitřídy USB hostitelského řadiče) dokončí IRP, IRP cestuje zpět do zásobníku zařízení pomocí jakýchkoli IoCompletion rutin registrovaných ovladači rozbočovače.

Všimněte si, že ovladač funkce sběrnice hlásí změnu ve svém seznamu podřízených zařízení tím, že osloví správce PnP s dotazem na seznam svých podřazených zařízení. Výsledný požadavek IRP_MN_QUERY_DEVICE_RELATIONS vidí všechny ovladače sběrnicového zařízení. Řidič autobusové funkce je obvykle jediným řidičem pro zpracování IRP a hlášení podřízených položek. V některých zásobnících zařízení je přítomen filtrující ovladač sběrnice a podílí se na vytváření seznamu vztahů sběrnice. Jedním z příkladů je ACPI, které se připojuje jako sběrnicový filtr pro zařízení ACPI. V některých stozích zařízení zpracovávají ovladače filtru nebus požadavek IRP_MN_QUERY_DEVICE_RELATIONS, ale to není typické.

V tuto chvíli má správce PnP aktuální seznam zařízení ve sběrnici. Správce PnP pak určí, jestli jsou nějaká zařízení nově doručená nebo odebraná. V tomto příkladu je k dispozici jedno nové zařízení. Následující obrázek znázorňuje správce PnP, který vytvoří vývojový uzel pro nové zařízení a začne zařízení konfigurovat.

diagram znázorňující vytvoření devnode pro nové plug and play zařízení

Následující poznámky odpovídají zakroužkovaným číslům na předchozím obrázku:

  1. Správce PnP vytvoří devnodes pro všechna nová podřízená zařízení ve sběrnici.

    Správce protokolu PnP porovnává seznam vztahů sběrnice vrácených v IRP_MN_QUERY_DEVICE_RELATIONS IRP se seznamem podřízených položek sběrnice, která je aktuálně zaznamenána ve stromu zařízení PnP. Správce PnP vytvoří devnode pro každé nové zařízení a zahájí proces odebrání pro všechna zařízení, která byla odebrána.

    V tomto příkladu je k dispozici jedno nové zařízení (joystick), takže správce PnP vytvoří devnode pro joystick. V tomto okamžiku je jediným ovladačem nakonfigurovaným pro joystick rodičovský ovladač sběrnice USB rozbočovače, který vytvořil PDO joysticku. Všechny volitelné ovladače filtru sběrnice by se také vyskytovaly v zásobníku zařízení, ale v příkladu vynecháte ovladače filtru sběrnice kvůli jednoduchosti.

    Široká šipka mezi dvěma vývojovými uzly na předchozím obrázku označuje, že joystick devnode je podřízeným uzlu devnode rozbočovače USB.

  2. Správce PnP shromažďuje informace o novém zařízení a začne zařízení konfigurovat.

    Správce PnP odešle posloupnost IRP do zásobníku zařízení, aby shromáždil informace o zařízení. V tomto okamžiku se zásobník zařízení skládá pouze z fyzického objektu zařízení vytvořeného ovladačem nadřazené sběrnice a filtračních objektů zařízení pro všechny volitelné ovladače filtru sběrnice. Autobusoví řidiči a ovladače filtrů sběrnice jsou tedy jediní ovladači, kteří reagují na tyto IRP. V tomto příkladu je jediným ovladačem v zásobníku zařízení pro joystick nadřazený ovladač sběrnice, konkrétně ovladač rozbočovače USB.

    Správce PnP shromažďuje informace o novém zařízení odesláním IRPs do zásobníku zařízení. Mezi tyto irp patří:

    Správce PnP odešle výše uvedené adresy IRP v této fázi zpracování nového zařízení PnP, ale ne nutně v uvedeném pořadí, takže byste neměli provádět předpoklady o pořadí, ve kterém se protokoly IRP odesílají. Neměli byste také předpokládat, že správce PnP odesílá pouze výše uvedené IRP.

    Správce PnP zkontroluje registr a zjistí, jestli bylo zařízení na tomto počítači dříve nainstalované. Správce PnP zkontroluje, zda pro zařízení pod větví < existuje podklíč ><\>. V tomto příkladu je zařízení nové a musí být nakonfigurované úplně od začátku.

  3. Správce PnP ukládá informace o zařízení v registru.

    Větev enum registru je vyhrazená pro použití součástmi operačního systému a její rozložení se může změnit. Programátoři ovladačů musí používat systémové rutiny k extrakci informací souvisejících s ovladači. Nepřistupujte k větvi Výčtu přímo z ovladače. Následující informace výčtu jsou uvedeny pouze pro účely ladění.

    • Správce PnP vytvoří podklíč zařízení pod klíčem pro enumerátor zařízení.

      Správce PnP vytvoří podklíč s názvem HKLM\System\CurrentControlSet\Enum\<enumerátor>\<id zařízení>. Vytvoří enumerátor <, podklíč>, pokud ještě neexistuje.

      enumerátor je komponenta, která zjišťuje zařízení PnP na základě hardwarového standardu PnP. Úlohy enumerátoru provádí ovladač sběrnice PnP ve spolupráci se správcem PnP. Zařízení je obvykle seznamováno svým nadřazeným ovladačem sběrnice, jako je PCI nebo PCMCIA. Některá zařízení jsou vyčíslována ovladačem filtru sběrnice, například ACPI.

    • Správce PnP vytvoří podklíč pro tuto instanci zařízení.

      Pokud je pro IRP_MN_QUERY_CAPABILITIESvráceno Capabilities.UniqueID jako TRUE, znamená to, že ID zařízení je jedinečné v rámci systému. Pokud ne, správce PnP upraví ID tak, aby byl jedinečný pro celý systém.

      Správce PnP vytvoří podklíč s názvem HKLM\System\CurrentControlSet\Enum\<enumerátor>\<ID zařízení>\<id instanceID>.

    • Správce PnP zapíše informace o zařízení do podklíče instance zařízení.

      Správce PnP ukládá informace, včetně následujících, pokud byly poskytnuty pro zařízení:

      DeviceDesc – od IRP_MN_QUERY_DEVICE_TEXT

      Umístění – od IRP_MN_QUERY_DEVICE_TEXT

      Funkce – příznaky z IRP_MN_QUERY_CAPABILITIES

      UINumber: od IRP_MN_QUERY_CAPABILITIES

      HardwareID – od IRP_MN_QUERY_ID

      Kompatibilní identifikátory – z IRP_MN_QUERY_ID

      ContainerID – od IRP_MN_QUERY_ID

      LogConf\BootConfig – z IRP_MN_QUERY_RESOURCES

      LogConf\BasicConfigVector – z IRP_MN_QUERY_RESOURCE_REQUIREMENTS

V tomto okamžiku je správce PnP připraven vyhledat ovladač funkce a filtrovat ovladače pro zařízení, pokud existuje. (Viz následující obrázek.)

diagram znázorňující vyhledání ovladačů funkcí a filtrů

Následující poznámky odpovídají číslovaným kruhům na předchozím obrázku:

  1. Správce PnP v režimu jádra koordinuje se správcem PnP v uživatelském režimu a součástmi nastavení uživatelského režimu, aby zjistil ovladače funkcí a filtrů pro zařízení, pokud existují.

    Správce PnP v režimu jádra zařadí událost do správce PnP v uživatelském režimu a identifikuje zařízení, které je potřeba nainstalovat. Jakmile se privilegovaný uživatel přihlásí, komponenty uživatelského režimu budou pokračovat v hledání ovladačů. Podívejte se na přehled instalace zařízení Informace o součástech instalace a jejich roli při instalaci zařízení.

  2. Součásti instalace uživatelského režimu řídí správce PnP v režimu jádra, aby načetl funkční a filtrační ovladače.

    Komponenty uživatelského režimu volají do režimu jádra, aby se načetly ovladače, což způsobuje volání rutin AddDevice.

Následující obrázek znázorňuje, jak správce PnP načítá ovladače (pokud je to vhodné), zavolá jejich rutiny AddDevice a nasměruje ovladače, aby zařízení spustili.

diagram znázorňující volání rutin adddevice a spuštění nového zařízení.

Následující poznámky odpovídají číslovaným kruhům na předchozím obrázku:

  1. Ovladače dolního filtru

    Než se ovladač funkce připojí ke zásobníku zařízení, správce PnP zpracuje všechny ovladače s nižším filtrem. Pro každý ovladač s nižším filtrem volá správce PnP DriverEntry rutinu, pokud ovladač ještě není načten. Potom správce PnP volá rutinu ovladače AddDevice. V rutině AddDevice vytvoří ovladač filtru objekt zařízení filtru (filtr DO) a připojí ho ke zásobníku zařízení (IoAttachDeviceToDeviceStack). Jakmile připojí objekt zařízení do řetězce zařízení, ovladač je zapojen jako ovladač zařízení.

    V příkladu joysticku USB je pro zařízení jeden ovladač nižšího filtru.

  2. Ovladač funkce

    Po připojení jakýchkoli nižších filtrů správce PnP zpracuje ovladač funkce. Správce PnP volá rutinu DriverEntry ovladače funkčního, pokud ovladač ještě není načten, a poté volá rutinu AddDevice. Ovladač funkce vytvoří objekt zařízení funkce (FDO) a připojí ho ke stacku zařízení.

    V tomto příkladu je ovladač funkce pro joystick USB ve skutečnosti dvojice ovladačů: ovladač třídy HID a ovladač minitřídy HID. Oba ovladače spolupracují, aby sloužily jako ovladač funkce. Dvojice ovladačů vytvoří pouze jeden objekt FDO a připojí ho ke zásobníku zařízení.

  3. Ovladače horního filtru

    Po připojení ovladače funkce správce PnP zpracuje všechny ovladače horního filtru.

    V tomto příkladu je pro zařízení k dispozici jeden ovladač horního filtru.

  4. Přiřazení prostředků a spuštění zařízení

    Správce PnP v případě potřeby přiřadí zařízení prostředky a vydá IRP pro spuštění zařízení.

    • Přiřazování prostředků

      Dříve v procesu konfigurace správce PnP shromáždil požadavky na hardware pro zařízení z nadřazeného ovladače sběrnice zařízení. Po načtení úplné sady ovladačů pro zařízení správce PnP odešle do zásobníku zařízení IRP_MN_FILTER_RESOURCE_REQUIREMENTS požadavek. Všechny ovladače v zásobníku mají možnost zpracovat tento IRP a v případě potřeby upravit seznam požadavků na prostředky zařízení.

      Správce PnP přiřadí k zařízení prostředky, pokud zařízení vyžaduje, na základě požadavků zařízení a prostředků, které jsou aktuálně k dispozici.

      Správce PnP může potřebovat změnit uspořádání přiřazení prostředků stávajících zařízení tak, aby vyhovovalo potřebám nového zařízení. Toto opětovné přiřazování prostředků se nazývá "vyvážení". Ovladače stávajících zařízení obdrží sekvenci zastavení a spuštění IRPs během vyvážení, ale toto vyvážení musí být pro uživatele transparentní.

      V příkladu joysticku USB zařízení nevyžadují hardwarové prostředky, takže správce PnP nastaví seznam prostředků na NULL.

    • Spuštění zařízení (IRP_MN_START_DEVICE)

      Jakmile správce PnP přiřadí k zařízení prostředky, odešle do zásobníku ovladačů zařízení IRP IRP_MN_START_DEVICE, který ovladače nasměruje, aby zařízení spustily.

    Po spuštění zařízení správce PnP odešle ovladačům zařízení tři další IRP:

    • IRP_MN_QUERY_CAPABILITIES

      Jakmile se počáteční IRP úspěšně dokončí, správce PnP odešle do zásobníku zařízení další IRP_MN_QUERY_CAPABILITIES IRP. Všechny ovladače zařízení mají možnost zpracovat IRP. Správce PnP odešle tento protokol IRP po připojení všech ovladačů a spuštění zařízení, protože funkce nebo ovladače filtru můžou potřebovat přístup k zařízení kvůli shromažďování informací o schopnostech.

    • IRP_MN_QUERY_PNP_DEVICE_STATE

      Tento protokol IRP dává ovladači příležitost například hlásit, že by se zařízení nemělo zobrazovat v uživatelských rozhraních, jako je Správce zařízení a program Hotplug. To je užitečné pro zařízení, která jsou přítomna v systému, ale nejsou použitelné v aktuální konfiguraci, například herní port na přenosném počítači, který není použitelný, když je přenosný počítač odpojený.

    • IRP_MN_QUERY_DEVICE_RELATIONS pro vztahy s sběrnicemi

      Správce PnP odešle tento IRP a určí, jestli má zařízení nějaká podřízená zařízení. Pokud ano, správce PnP nakonfiguruje každé zařízení dceřiné.

Použití GUID_PNP_LOCATION_INTERFACE

Rozhraní GUID_PNP_LOCATION_INTERFACE poskytuje vlastnost zařízení SPDRP_LOCATION_PATHS Plug and Play (PnP) zařízení pro zařízení.

Pokud chcete toto rozhraní implementovat v ovladači, zpracujte IRP_MN_QUERY_INTERFACE IRP s InterfaceType = GUID_PNP_LOCATION_INTERFACE. Ovladač poskytuje ukazatel na strukturu PNP_LOCATION_INTERFACE, která obsahuje ukazatele na jednotlivé rutiny rozhraní. Rutina PnpGetLocationString poskytuje část vlastnosti SPDRP_LOCATION_PATHS zařízení specifickou pro zařízení.