Dodawanie urządzenia PnP do działającego systemu
W tej sekcji opisano sekwencję zdarzeń, które występują, gdy system konfiguruje urządzenie PnP dodane przez użytkownika do uruchomionej maszyny. W tej dyskusji przedstawiono role menedżera PnP, sterowników magistrali oraz sterowników funkcji i filtrów w wyliczaniu i konfigurowaniu nowego urządzenia.
Większość tej dyskusji dotyczy również konfigurowania urządzenia PnP, które jest obecne podczas rozruchu maszyny. W szczególności urządzenia, których sterowniki są oznaczone SERVICE_DEMAND_START w pliku INF, są konfigurowane w zasadniczo taki sam sposób, w jaki urządzenie jest dodawane dynamicznie lub jest obecne w czasie rozruchu.
Na poniższej ilustracji przedstawiono pierwsze kroki konfigurowania urządzenia, począwszy od momentu, gdy użytkownik podłącza sprzęt do maszyny.
Poniższe uwagi odpowiadają numerom okręgowym na poprzedniej ilustracji:
Użytkownik podłącza urządzenie PnP do wolnego miejsca w magistrali PnP.
W tym przykładzie użytkownik podłącza joystick USB PnP do koncentratora na kontrolerze hosta USB. Koncentrator USB jest urządzeniem magistrali PnP, ponieważ urządzenia podrzędne można do niego podłączyć.
Sterownik funkcji dla urządzenia magistrali stwierdza, że nowe urządzenie jest podłączone do magistrali.
Sposób, w jaki kierowca to określa, zależy od architektury autobusu. W przypadku niektórych autobusów sterownik funkcji magistrali odbiera powiadomienie o nowej wtyczce nowych urządzeń. Jeśli magistrala nie obsługuje powiadomień o gorącej wtyczce, użytkownik musi podjąć odpowiednie działania w Panelu sterowania, aby spowodować wyliczenie magistrali.
W tym przykładzie magistrala USB obsługuje powiadomienia o gorącej wtyczce, więc sterownik funkcji magistrali USB jest powiadamiany, że jego elementy podrzędne uległy zmianie.
Sterownik funkcji dla urządzenia magistrali powiadamia menedżera PnP, że jego zestaw urządzeń podrzędnych uległ zmianie.
Sterownik funkcji powiadamia menedżera PnP przez wywołanie IoInvalidateDeviceRelations z typemBusRelations.
Menedżer PnP wysyła zapytanie do sterowników magistrali o bieżącą listę urządzeń na magistrali.
Menedżer PnP wysyła żądanie IRP_MN_QUERY_DEVICE_RELATIONS do stosu urządzeń magistrali. Wartość Parameters.QueryDeviceRelations.Type to BusRelations, co wskazuje, że menedżer PnP prosi o bieżącą listę urządzeń znajdujących się w magistrali ( relacjemagistrali).
Menedżer PnP wysyła IRP do najwyższego sterownika w stosie urządzeń magistrali. Zgodnie z regułami dla IRP PnP, każdy sterownik w stosie obsługuje IRP, jeśli jest to właściwe, i przekazuje IRP w dół do następnego sterownika.
Sterownik funkcji dla urządzenia magistrali obsługuje protokół IRP.
Aby uzyskać szczegółowe informacje na temat obsługi tego IRP, zobacz stronę referencyjną IRP_MN_QUERY_DEVICE_RELATIONS.
W tym przykładzie sterownik koncentratora USB obsługuje ten protokół IRP dla koncentratora FDO. Sterownik koncentratora tworzy PDO dla urządzenia joysticka i zawiera wskaźnik do odpowiadającego PDO joysticka na liście urządzeń podrzędnych zwracanej z IRP.
Gdy nadrzędny sterownik magistrali koncentratora USB (klasa kontrolera hosta USB/para sterowników miniklasy) kończy IRP, IRP podróżuje z kopii zapasowej stosu urządzenia za pomocą dowolnego IoCompletion procedur zarejestrowanych przez sterowniki koncentratora.
Należy pamiętać, że sterownik funkcji magistrali zgłasza zmianę na liście elementów podrzędnych, żądając, aby menedżer PnP wysyłał zapytanie o listę urządzeń podrzędnych. Wynikowe żądanie IRP_MN_QUERY_DEVICE_RELATIONS jest widoczne dla wszystkich sterowników urządzenia magistrali. Zazwyczaj sterownik funkcji magistrali jest jedynym sterownikiem do obsługi IRP i raportowania elementów podrzędnych. W niektórych stosach urządzeń sterownik filtru magistrali jest obecny i uczestniczy w konstruowaniu listy relacji magistrali. Jednym z przykładów jest ACPI, który dołącza się jako sterownik filtru magistrali dla urządzeń ACPI. W niektórych stosach urządzeń sterowniki filtrów innych niżbus obsługują żądanie IRP_MN_QUERY_DEVICE_RELATIONS, ale nie jest to typowe.
W tym momencie menedżer PnP ma bieżącą listę urządzeń na magistrali. Menedżer PnP określa następnie, czy jakiekolwiek urządzenia są nowo przybyłe, czy zostały usunięte. W tym przykładzie jest jedno nowe urządzenie. Na poniższej ilustracji przedstawiono menedżera pnP tworzącego węzeł deweloperski dla nowego urządzenia i rozpoczynającego konfigurowanie urządzenia.
Poniższe uwagi odpowiadają numerom okręgowym na poprzedniej ilustracji:
Menedżer PnP tworzy węzły urządzeń dla wszystkich nowych urządzeń podrzędnych na szynie.
Menedżer PnP porównuje listę relacji magistrali zwróconych w IRP_MN_QUERY_DEVICE_RELATIONS IRP do listy dzieci dla magistrali obecnie zarejestrowanej w drzewie urządzeń PnP. Menedżer PnP tworzy devnode dla każdego nowego urządzenia i inicjuje procedurę usuwania dla dowolnego urządzenia, które zostało usunięte.
W tym przykładzie istnieje jedno nowe urządzenie (joystick), więc menedżer PnP tworzy węzeł devnode dla joysticka. W tym momencie jedynym sterownikiem skonfigurowanym dla joysticku jest nadrzędny sterownik magistrali koncentratora USB, który stworzył PDO joysticku. Wszystkie opcjonalne sterowniki filtrów magistrali będą również obecne w stosie urządzenia, ale przykład pomija sterowniki filtrów magistrali dla uproszczenia.
Szeroka strzałka między dwoma węzłami devnode na poprzedniej ilustracji wskazuje, że węzeł devnode joysticka jest elementem podrzędnym węzła devnode koncentratora USB.
Menedżer PnP zbiera informacje o nowym urządzeniu i rozpoczyna konfigurowanie urządzenia.
Menedżer PnP wysyła sekwencję irps do stosu urządzeń w celu zebrania informacji o urządzeniu. W tym momencie stos urządzenia składa się tylko z PDO utworzonego przez sterownik magistrali nadrzędny dla urządzenia i DO filtrów dla jakichkolwiek opcjonalnych sterowników filtrów magistrali. W związku z tym kierowcy autobusu i sterowniki filtrów magistrali są jedynymi sterownikami, które reagują na te IRP. W tym przykładzie jedynym sterownikiem w stosie urządzenia joysticka jest sterownik magistrali nadrzędnej, sterownik koncentratora USB.
Menedżer PnP zbiera informacje o nowym urządzeniu, wysyłając IRP do stosu urządzeń. Te IRPs obejmują następujące:
IRP_MN_QUERY_ID, oddzielny IRP dla każdego z następujących typów identyfikatorów sprzętu:
BusQueryDeviceID
BusQueryInstanceID
BusQueryHardwareIDs
BusQueryCompatibleIDs
BusQueryContainerID
IRP_MN_QUERY_DEVICE_TEXT, oddzielny IRP dla każdego z następujących elementów:
OpisUrządzenia
InformacjeOznajdywaniuTekstuUrządzenia
Menedżer PnP wysyła IRP wymienione powyżej na tym etapie przetwarzania nowego urządzenia PnP, ale niekoniecznie w podanej kolejności, więc nie należy zakładać, w jakiej kolejności są wysyłane IRP. Ponadto nie należy zakładać, że menedżer PnP wysyła tylko IRP wymienione powyżej.
Menedżer PnP sprawdza rejestr, aby określić, czy urządzenie zostało wcześniej zainstalowane na tym komputerze. Menedżer PnP sprawdza, czy dla urządzenia w gałęzi < Enum istnieje podklucz ><\>. W tym przykładzie urządzenie jest nowe i musi być skonfigurowane "od podstaw".
Menedżer PnP przechowuje informacje o urządzeniu w rejestrze.
Gałąź Enum rejestru jest zarezerwowana do użytku przez składniki systemu operacyjnego, a jej układ podlega zmianie. Autorzy sterowników muszą używać procedur systemowych do wyodrębniania informacji związanych z sterownikami. Nie należy uzyskiwać dostępu do gałęzi wyliczenia bezpośrednio ze sterownika. Poniższe informacje o Enum są podane wyłącznie do celów debugowania.
Menedżer PnP tworzy podklucz urządzenia pod kluczem modułu wyliczającego urządzenia.
Menedżer PnP tworzy podklucz o nazwie HKLM\System\CurrentControlSet\Enum\<enumerator>\<identyfikator urządzenia>. Tworzy enumerator <podklucz>, jeśli jeszcze nie istnieje.
Moduł wyliczający to składnik, który odnajduje urządzenia PnP, opierając się na standardzie sprzętowym PnP. Zadania modułu wyliczającego są wykonywane przez kierowcę autobusu PnP we współpracy z menedżerem PnP. Urządzenie jest zwykle wyliczane przez jego nadrzędny sterownik magistrali, taki jak PCI lub PCMCIA. Niektóre urządzenia są wyliczane przez sterownik filtru magistrali, taki jak ACPI.
Menedżer PnP tworzy podklucz dla tego wystąpienia urządzenia.
Jeśli Capabilities.UniqueID zostanie zwrócona jako TRUE dla IRP_MN_QUERY_CAPABILITIES, unikatowy identyfikator urządzenia jest jedyny w całym systemie. Jeśli nie, menedżer PnP modyfikuje identyfikator tak, aby był unikatowy dla całego systemu.
Menedżer PnP tworzy podklucz o nazwie HKLM\System\CurrentControlSet\Enum\<enumerator>\<deviceID>\<instanceID>.
Menedżer PnP zapisuje informacje o urządzeniu w podkluczu charakterystycznym dla danego wystąpienia urządzenia.
Menedżer PnP przechowuje informacje, w tym następujące informacje, jeśli zostały dostarczone dla urządzenia:
DeviceDesc — pochodzący z IRP_MN_QUERY_DEVICE_TEXT
Lokalizacja — z IRP_MN_QUERY_DEVICE_TEXT
możliwości — flagi z IRP_MN_QUERY_CAPABILITIES
UINumber — z IRP_MN_QUERY_CAPABILITIES
HardwareID — z IRP_MN_QUERY_ID
identyfikatory zgodne — z IRP_MN_QUERY_ID
ContainerID — z IRP_MN_QUERY_ID
LogConf\BootConfig — z IRP_MN_QUERY_RESOURCES
LogConf\BasicConfigVector — z IRP_MN_QUERY_RESOURCE_REQUIREMENTS
W tym momencie menedżer PnP jest gotowy do zlokalizowania sterownika funkcji i sterowników filtrów dla urządzenia, jeśli istnieje. (Zobacz poniższą ilustrację).
Poniższe uwagi odpowiadają ponumerowanym okręgom we wcześniejszym rysunku.
Menedżer PnP trybu jądra koordynuje się z menedżerem PnP trybu użytkownika oraz komponentami ustawień trybu użytkownika w celu znalezienia sterowników funkcji i filtrów dla urządzenia, jeśli istnieją.
Menedżer PnP trybu jądra kolejkuje zdarzenie do menedżera PnP trybu użytkownika, identyfikując urządzenie, które wymaga instalacji. Po zalogowaniu się uprzywilejowanego użytkownika składniki trybu użytkownika kontynuują znajdowanie sterowników. Zobacz omówienie instalacji urządzenia Aby uzyskać informacje o składnikach instalacyjnych i ich roli podczas instalowania urządzenia.
Składniki instalatora trybu użytkownika wskazują menedżerowi PnP trybu jądra, aby załadować sterowniki funkcji i filtry.
Komponenty trybu użytkownika wywołują ponownie do trybu jądra, aby załadować sterowniki, co powoduje wywołanie procedur AddDevice.
Na poniższej ilustracji przedstawiono menedżera PnP ładującego sterowniki (jeśli jest to konieczne), wywołując ich procedury AddDevice i kierując sterowniki do uruchomienia urządzenia.
Poniższe uwagi odpowiadają ponumerowanym okręgom we wcześniejszym rysunku.
Sterowniki filtru niższego
Przed dołączeniem sterownika funkcjonalnego do stosu urządzenia, menedżer PnP przetwarza wszelkie niższe sterowniki filtrujące. Dla każdego sterownika filtru dolnego, menedżer PnP wywołuje procedurę DriverEntry, jeśli sterownik nie jest jeszcze załadowany. Następnie menedżer PnP wywołuje procedurę AddDevice sterownika. W swojej procedurze AddDevice sterownik filtru tworzy obiekt urządzenia filtru (filtr DO) i dołącza go do stosu urządzenia (IoAttachDeviceToDeviceStack). Po dołączeniu obiektu urządzenia do stosu urządzeń sterownik jest zaangażowany jako sterownik urządzenia.
W przykładzie joysticka USB jest jeden sterownik filtrujący dolnego poziomu dla urządzenia.
Sterownik funkcji
Po dołączeniu wszystkich niższych filtrów menedżer PnP przetwarza sterownik funkcji. Menedżer PnP wywołuje procedurę DriverEntry sterownika funkcji, jeśli sterownik nie został jeszcze załadowany, i wywołuje procedurę AddDevice. Sterownik funkcji tworzy obiekt funkcji urządzenia (FDO) i dołącza go do stosu urządzenia.
W tym przykładzie sterownik funkcji dla joysticka USB to w rzeczywistości para sterowników: sterownik klasy HID i sterownik miniklasy HID. Oba sterowniki współpracują ze sobą, aby pełnić rolę sterownika funkcji. Para sterowników tworzy tylko jeden FDO i przyłącza go do stosu urządzenia.
Sterowniki filtru górnego
Po dołączeniu sterownika funkcji menedżer PnP przetwarza wszystkie sterowniki górnego filtru.
W tym przykładzie istnieje jeden sterownik górnego filtru dla urządzenia.
Przypisywanie zasobów i uruchamianie urządzenia
Menedżer PnP przypisuje zasoby do urządzenia, w razie potrzeby, i wydaje IRP, aby uruchomić urządzenie.
Przypisywanie zasobów
Wcześniej w procesie konfiguracji menedżer pnP zebrał wymagania dotyczące zasobów sprzętowych dla urządzenia z nadrzędnego sterownika magistrali urządzenia. Po załadowaniu pełnego zestawu sterowników dla urządzenia menedżer PnP wysyła żądanie IRP_MN_FILTER_RESOURCE_REQUIREMENTS do stosu urządzeń. Wszystkie sterowniki w stosie mają możliwość obsługi tego protokołu IRP i modyfikowania listy wymagań dotyczących zasobów urządzenia, jeśli jest to konieczne.
Menedżer PnP przypisuje zasoby do urządzenia, jeśli urządzenie wymaga, na podstawie wymagań urządzenia i zasobów, które są obecnie dostępne.
Menedżer pnP może wymagać ponownego rozmieszczania przypisań zasobów istniejących urządzeń, aby zaspokoić potrzeby nowego urządzenia. Ponowne przypisywanie zasobów jest nazywane "ponownym równoważeniem". Sterowniki istniejących urządzeń otrzymują sekwencję zatrzymania i uruchamiania irps podczas ponownego równoważenia, ale ponowne równoważenie musi być niewidoczne dla użytkowników.
W przykładzie joysticka USB, urządzenia USB nie wymagają zasobów sprzętowych, więc menedżer PnP ustawia listę zasobów na NULL.
Uruchamianie urządzenia (IRP_MN_START_DEVICE)
Gdy menedżer pnP przypisze zasoby do urządzenia, wysyła IRP_MN_START_DEVICE IRP do stosu urządzeń, aby skierować sterowniki do uruchomienia urządzenia.
Po uruchomieniu urządzenia menedżer PnP wysyła trzy kolejne IRP-y do sterowników urządzenia.
-
Po pomyślnym zakończeniu uruchamiania protokołu IRP menedżer pnP wysyła kolejny IRP_MN_QUERY_CAPABILITIES IRP do stosu urządzenia. Wszystkie sterowniki urządzenia mają możliwość obsługi protokołu IRP. Menedżer pnP wysyła ten protokół IRP w tej chwili, po dołączeniu wszystkich sterowników i uruchomieniu urządzenia, ponieważ sterowniki funkcji lub filtru mogą wymagać dostępu do urządzenia w celu zbierania informacji o możliwościach.
-
Ten protokół IRP umożliwia sterownikowi, na przykład zgłaszanie, że urządzenie nie powinno być wyświetlane w interfejsach użytkownika, takich jak Menedżer urządzeń i program Hotplug. Jest to przydatne w przypadku urządzeń znajdujących się w systemie, których nie można używać w bieżącej konfiguracji, takich jak port gry na laptopie, który nie jest możliwy do użycia, gdy laptop jest niepodłączony.
IRP_MN_QUERY_DEVICE_RELATIONS dla relacji autobusowych
Menedżer pnP wysyła ten protokół IRP w celu ustalenia, czy urządzenie ma jakiekolwiek urządzenia podrzędne. Jeśli tak, menedżer PnP konfiguruje każde urządzenie podrzędne.
Korzystanie z GUID_PNP_LOCATION_INTERFACE
Interfejs GUID_PNP_LOCATION_INTERFACE dostarcza właściwość sprzętową SPDRP_LOCATION_PATHS Plug and Play (PnP) dla urządzenia.
Aby zaimplementować ten interfejs w sterowniku, obsłuż IRP_MN_QUERY_INTERFACE IRP przy użyciu interfejsu InterfaceType = GUID_PNP_LOCATION_INTERFACE. Sterownik dostarcza wskaźnik do struktury PNP_LOCATION_INTERFACE zawierającej wskaźniki do poszczególnych procedur interfejsu. Procedura PnpGetLocationString podaje specyficzną dla urządzenia część właściwości SPDRP_LOCATION_PATHS urządzenia.