Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Menedżer PnP wysyła to żądanie, aby określić niektóre relacje między urządzeniami. Następujące typy sterowników obsługują to żądanie:
Kierowcy magistrali muszą obsługiwać żądania BusRelations dla ich adaptera lub kontrolera (magistrala FDO). Sterowniki filtrów mogą obsługiwać żądania BusRelations .
Sterowniki magistrali muszą obsługiwać żądania TargetDeviceRelation dla urządzeń podrzędnych (podrzędnych obiektów PDO).
Sterowniki funkcji i filtru mogą obsługiwać żądania RemovalRelations i PowerRelations .
Kierowcy magistrali mogą obsługiwać żądania wyrzuceniaRelations dla urządzeń podrzędnych (podrzędnych obiektów PDO).
Wartość
0x07
Kod główny
Po wysłaniu
Menedżer pnP wysyła ten protokół IRP w celu zebrania informacji o urządzeniach z relacją z określonym urządzeniem.
Menedżer PnP wysyła zapytanie do elementu BusRelations (urządzeń podrzędnych) urządzenia, gdy urządzenie jest wyliczane i w innym czasie, gdy urządzenie jest aktywne, na przykład gdy sterownik wywołuje procedurę IoInvalidateDeviceRelations , aby wskazać, że urządzenie podrzędne przybyło lub odeszło.
Menedżer PnP wysyła zapytanie do elementu RemoveRelations urządzenia przed usunięciem sterowników urządzenia. Menedżer PnP wysyła zapytania dotyczące elementu RemovalRelations i EjectionRelations przed wyrzuceniem urządzenia.
Menedżer pnP wysyła zapytanie do elementu TargetDeviceRelation urządzenia, gdy aplikacja w trybie sterownika lub użytkownika rejestruje się w celu powiadomienia PnP o zdarzeniu EventCategoryTargetDeviceChange na urządzeniu. Menedżer PnP wysyła zapytania dotyczące urządzenia skojarzonego z określonym obiektem pliku. IRP_MN_QUERY_DEVICE_RELATIONS jest jedynym parametrem IRP pnP, który ma prawidłowy parametr obiektu pliku. Sterownik może wykonywać zapytania dotyczące stosu urządzenia dla elementu TargetDeviceRelation. Sterownik nie musi podawać obiektu pliku podczas wysyłania zapytania TargetDeviceRelation .
Menedżer PnP wysyła zapytanie do usługi PowerRelations urządzenia, gdy sterownik urządzenia wywołuje metodę IoInvalidateDeviceRelations , aby wskazać, że zestaw urządzeń, z którymi to urządzenie ma niejawną relację zarządzania energią, uległa zmianie. Żądania PowerRelations są obsługiwane począwszy od systemu Windows 7.
W przypadku żądań BusRelations, RemovalRelations, EjectionRelations i PowerRelations menedżer PnP wysyła IRP_MN_QUERY_DEVICE_RELATIONS w irQL = PASSIVE_LEVEL w kontekście wątku systemowego.
W przypadku żądań TargetDeviceRelation menedżer PnP wysyła ten protokół IRP pod adresem IRQL = PASSIVE_LEVEL w dowolnym kontekście wątku.
Parametry wejściowe
Element członkowski Parameters.QueryDeviceRelations.Type struktury IO_STACK_LOCATION określa typ relacji, których dotyczy zapytanie. Możliwe wartości to BusRelations, EjectionRelations, RemovalRelations, TargetDeviceRelation i PowerRelations.
Element członkowski FileObject bieżącej struktury IO_STACK_LOCATION wskazuje prawidłowy obiekt pliku tylko wtedy, gdy parametr.QueryDeviceRelations.Type to TargetDeviceRelationRelation.
Parametry wyjściowe
Zwrócony w bloku stanu We/Wy.
Blok stanu we/wy
Sterownik ustawia parametr Irp-IoStatus.Status> na STATUS_SUCCESS lub stan awarii, taki jak STATUS_INSUFFICIENT_RESOURCES.
Po powodzeniu sterownik ustawia element Irp-IoStatus.Information> na wskaźnik PDEVICE_RELATIONS wskazujący żądane informacje o relacjach. Struktura DEVICE_RELATIONS jest definiowana w następujący sposób:
typedef struct _DEVICE_RELATIONS {
ULONG Count;
PDEVICE_OBJECT Objects[1]; // variable length
} DEVICE_RELATIONS, *PDEVICE_RELATIONS;
Operacja
Jeśli sterownik zwraca relacje w odpowiedzi na ten IRP_MN_QUERY_DEVICE_RELATIONS, sterownik przydziela strukturę DEVICE_RELATIONS ze stronicowanej pamięci, która zawiera liczbę i odpowiednią liczbę wskaźników obiektów urządzenia. Menedżer PnP zwalnia strukturę, gdy nie jest już potrzebna. Jeśli sterownik zastępuje DEVICE_RELATIONS strukturę przydzieloną przez inny sterownik, sterownik musi zwolnić poprzednią strukturę.
Sterownik musi odwoływać się do pdO dowolnego urządzenia, które raportuje w tym IRP (ObReferenceObject). Menedżer PnP usuwa odwołanie, jeśli jest to konieczne.
Sterownik funkcji lub filtru powinien być przygotowany do obsługi tego protokołu IRP dla urządzenia w dowolnym momencie po zakończeniu procedury AddDevice dla urządzenia. Sterowniki magistrali powinny być przygotowane do obsługi zapytania dla busRelations natychmiast po wyliczenie urządzenia.
Ogólne reguły dotyczące obsługi pomocniczych adresów IR plug and Play można znaleźć w temacie Plug and Play ( Plug and Play).
W poniższych podsekcjach opisano konkretne akcje do obsługi różnych zapytań.
Żądanie BusRelations
Gdy menedżer PnP wysyła zapytanie o relacje magistrali (urządzenia podrzędne) adaptera lub kontrolera, kierowca magistrali musi zwrócić listę wskaźników do obiektów PDO wszystkich urządzeń znajdujących się fizycznie w magistrali. Kierowca autobusu zgłasza wszystkie urządzenia, niezależnie od tego, czy zostały uruchomione. Kierowca autobusu może wymagać zasilania urządzenia magistrali, aby określić, które dzieci są obecne.
Ostrzeżenie Nie można przekazać obiektu urządzenia do żadnej procedury, która przyjmuje pdO jako argument, dopóki menedżer PnP nie utworzy węzła urządzenia (devnode) dla tego obiektu. (Jeśli sterownik przekaże obiekt urządzenia, system sprawdzi błąd w 0xCA sprawdzania błędów: PNP_DETECTED_FATAL_ERROR). Menedżer pnP tworzy węzeł devnode w odpowiedzi na żądanie IRP_MN_QUERY_DEVICE_RELATIONS . Sterownik może bezpiecznie założyć, że węzeł deweloperski pdO został utworzony po odebraniu żądania IRP_MN_QUERY_RESOURCE_REQUIREMENTS .
Sterownik magistrali, który odpowiada na ten protokół IRP, jest sterownikiem funkcji dla karty magistrali magistrali lub kontrolera, a nie sterownik magistrali nadrzędnej dla magistrali, z którą jest podłączony adapter lub kontroler. Sterowniki funkcji dla urządzeń innych niż magistrala nie obsługują tego zapytania. Takie sterowniki po prostu przekazać IRP do następnego niższego sterownika. (Zobacz poniższą ilustrację). Sterowniki filtrów zwykle nie obsługują tego zapytania.
W systemach operacyjnych Windows Vista i nowszych zalecamy, aby sterowniki zawsze wcisły IRP_MN_QUERY_DEVICE_RELATIONS IRP i zakończyć jego przetwarzanie później. Ta kolejność umożliwia systemowi przetwarzanie zapytań relacyjnych magistrali asynchronicznie. (W systemach operacyjnych przed Windows Vista sterowniki mogą bezpiecznie zwrócić STATUS_PENDING z ich procedur wysyłania, ale menedżer PnP nie nakłada się na zapytanie relacji magistrali z żadną inną operacją.
Na poniższym diagramie pokazano, jak kierowcy obsługują zapytanie dotyczące relacji magistrali.
W przykładzie pokazanym na rysunku menedżer PnP wysyła IRP_MN_QUERY_DEVICE_RELATIONS dla busRelations do sterowników urządzenia koncentratora USB. Menedżer PnP żąda listy elementów podrzędnych urządzenia koncentratora.
Podobnie jak w przypadku wszystkich adresów IR PnP, menedżer PnP wysyła protokół IRP do najwyższego sterownika w stosie urządzenia dla urządzenia.
Opcjonalny sterownik filtru może być głównym sterownikiem w stosie. Sterownik filtru zwykle nie obsługuje tego protokołu IRP; przekazuje IRP w dół stosu. Sterownik filtru może obsługiwać ten protokół IRP, na przykład jeśli sterownik uwidacznia urządzenie nieliczalne w magistrali.
Sterownik magistrali koncentratora USB obsługuje protokół IRP.
Sterownik magistrali koncentratora USB:
Tworzy obiekt PDO dla dowolnego urządzenia podrzędnego, które jeszcze go nie ma.
Oznacza nieaktywne pdO dla dowolnego urządzenia, które nie jest już obecne w magistrali. Sterownik magistrali nie usuwa takich obiektów PDOs.Aby uzyskać więcej informacji o tym, kiedy usunąć obiekty PDO, zobacz Usuwanie urządzenia.
Raportuje wszystkie urządzenia podrzędne, które znajdują się w magistrali.
Dla każdego urządzenia podrzędnego sterownik magistrali odwołuje się do pdO i umieszcza wskaźnik do pdO w strukturze DEVICE_RELATIONS.
W tym przykładzie istnieją dwa obiekty PDO: jeden dla urządzenia emulatora i jeden dla urządzenia klawiaturowego.
Kierowca autobusu powinien sprawdzić, czy inny kierowca utworzył już strukturę DEVICE_RELATIONS dla tego IRP. Jeśli tak, kierowca autobusu musi dodać do istniejących informacji.
Jeśli w magistrali nie ma urządzenia podrzędnego, sterownik ustawia liczbę na zero w strukturze DEVICE_RELATIONS i zwraca powodzenie.
Ustawia odpowiednie wartości w bloku stanu we/wy i przekazuje protokół IRP do następnego niższego sterownika. Sterownik magistrali dla karty lub kontrolera nie kończy IRP.
Opcjonalny niższy filtr, jeśli jest obecny, zwykle nie obsługuje tego protokołu IRP. Taki sterownik filtru przekazuje protokół IRP w dół stosu. Jeśli sterownik filtru niższego obsługuje ten protokół IRP, może dodać obiekty PDO do listy urządzeń podrzędnych, ale nie może usunąć żadnych obiektów PDO utworzonych przez inne sterowniki.
Sterownik magistrali nadrzędnej nie obsługuje tego protokołu IRP, chyba że jest jedynym sterownikiem w stosie urządzenia (urządzenie jest w trybie nieprzetworzonym). Podobnie jak we wszystkich środowiskach IRP, sterownik magistrali nadrzędnej kończy protokół IRP za pomocą funkcji IoCompleteRequest.
Jeśli w stosie urządzenia znajduje się co najmniej jeden sterownik filtru magistrali, takie sterowniki mogą obsługiwać protokół IRP w drodze do sterownika magistrali i/lub w drodze zapasowej stosu urządzenia (jeśli istnieją procedury IoCompletion ). Zgodnie z regułami protokołu IRP pnP, taki sterownik może dodać obiekty PDO do IRP w drodze w dół stosu i/lub zmodyfikować listę relacji w drodze zapasowej stosu (w procedurach IoCompletion ).
Żądanie wyrzuceniarelacji
Sterownik zwraca wskaźniki do obiektów PDO wszystkich urządzeń, które mogą zostać fizycznie usunięte z systemu po wyrzuceniu określonego urządzenia. Nie zgłaszaj obiektów PDO elementów podrzędnych urządzenia; Menedżer PnP zawsze żąda usunięcia urządzeń podrzędnych przed ich urządzeniem nadrzędnym.
Menedżer pnP wysyła IRP_MN_EJECT IRP do urządzenia, które jest wyrzucane. Sterownik dla takiego urządzenia otrzymuje również protokół IRP usuwania. Relacje wysuwania urządzenia otrzymują IRP_MN_REMOVE_DEVICE IRP (a nie IRP_MN_EJECT IRP).
Tylko sterownik magistrali nadrzędnej może odpowiedzieć na zapytanie WysunięcieRelations dla jednego z jego urządzeń podrzędnych. Sterowniki funkcji i filtru muszą przekazać go do następnego niższego sterownika w stosie urządzenia. Jeśli kierowca magistrali otrzymuje ten protokół IRP jako sterownik funkcji dla karty lub kontrolera, sterownik magistrali wykonuje zadania sterownika funkcji i musi przekazać IRP do następnego niższego sterownika.
Żądanie usługi PowerRelations
Począwszy od systemu Windows 7, zapytanie PowerRelations umożliwia sterownikowi określenie relacji zarządzania energią poza tradycyjną relacją między magistralą nadrzędną, która obsługuje wyliczanie PnP i wyliczane urządzenie podrzędne w magistrali. Jeśli na przykład kierowca magistrali nie może wyliczyć urządzenia podrzędnego w magistrali lub jeśli urządzenie jest elementem podrzędnym więcej niż jednej magistrali, zapytanie PowerRelations może opisać relacje zasilania urządzenia podrzędnego z magistralą lub magistralami.
Menedżer PnP wystawia zapytanie PowerRelations dla urządzenia, gdy sterownik urządzenia wywołuje procedurę IoInvalidateDeviceRelations i określa wartość parametru typuPowerRelations.
W odpowiedzi na to zapytanie sterownik urządzenia docelowego (czyli urządzenie, które jest elementem docelowym zapytania), dostarcza DEVICE_RELATIONS strukturę zawierającą wskaźniki do obiektów PDO innych urządzeń, które muszą być włączone przez menedżera zasilania przed włączeniem urządzenia docelowego. Z drugiej strony te inne urządzenia muszą być wyłączone dopiero po wyłączeniu urządzenia docelowego. Menedżer zasilania używa informacji z zapytania, aby zagwarantować, że te urządzenia są włączone i wyłączone w odpowiedniej kolejności.
Ta gwarancja porządkowania ma zastosowanie tylko do globalnych przejść stanu uśpienia systemu, które obejmują przejścia do i z S1, S2, S3 (uśpienia), S4 (hibernacji) i S5 (zamykanie) stanów zasilania systemu. Gwarancja zamawiania usługi PowerRelations nie ma zastosowania do przejścia stanu zasilania urządzenia Dx, podczas gdy system pozostaje w stanie systemu S0 (uruchomiony), z wyjątkiem przejścia zarządzania energią środowiska uruchomieniowego (DFx ).
Jeśli urządzenie docelowe znajduje się na ścieżce urządzenia dla specjalnego pliku (takiego jak plik stronicowania, plik hibernacji lub plik zrzutu awaryjnego), sterownik urządzenia docelowego musi wykonać dodatkowy krok, gdy obsługuje IRP_MN_DEVICE_USAGE_NOTIFICATION IRP , w którym inPath ma wartość TRUE. Ten sterownik musi mieć pewność, że urządzenia, których obiekty PDO są dostarczane dla zapytania PowerRelations , mogą również obsługiwać dostęp do ścieżki urządzenia dla pliku specjalnego. Aby potwierdzić tę obsługę, sterownik urządzenia docelowego musi najpierw wysłać IRP_MN_DEVICE_USAGE_NOTIFICATION IRP do każdego z tych urządzeń, a ten protokół IRP musi określić ten sam typ UsageNotification.Type co urządzenie docelowe. Tylko wtedy, gdy wszystkie urządzenia odbierające ten protokół IRP zakończą proces IRP kodem stanu powodzenia, może sterownik urządzenia docelowego ukończyć jego IRP_MN_DEVICE_USAGE_NOTIFICATION IRP pomyślnie. W przeciwnym razie ten sterownik musi ukończyć ten protokół IRP z kodem stanu błędu.
Gdy ten sam sterownik obsługuje protokół IRP IRP_MN_DEVICE_USAGE_NOTIFICATION , dla którego parametr InPath ma wartość FALSE, sterownik musi wysłać IRP_MN_DEVICE_USAGE_NOTIFICATION IRP do tego samego zestawu urządzeń zależnych, co w przypadku, gdy wartość InPath ma wartość TRUE. Jednak sterownik nigdy nie powinien ukończyć tego protokołu IRP z kodem stanu błędu, gdy parametr InPath ma wartość FALSE.
Sterownik, który odpowiada na zapytanie PowerRelations , powinien zarejestrować powiadomienia o zmianie urządzenia docelowego na wszystkich urządzeniach, których obiekty PDO są dostarczane dla zapytania PowerRelations . Aby zarejestrować się w celu uzyskania tych powiadomień, sterownik może wywołać procedurę IoRegisterPlugPlayNotification i określić wartość parametru EventCategoryTargetDeviceChange.
Żądanie removalRelations
Sterownik zwraca wskaźniki do obiektów PDO wszystkich urządzeń, których sterowniki muszą zostać usunięte po usunięciu sterowników dla określonego urządzenia. Nie zgłaszaj obiektów PDO elementów podrzędnych urządzenia; Menedżer pnP już żąda usunięcia urządzeń podrzędnych przed usunięciem urządzenia.
Kolejność usuwania stosunków jest niezdefiniowana.
Każdy sterownik w stosie urządzenia może obsłużyć ten typ zapytania relacji. Sterownik funkcji lub filtru obsługuje protokół IRP przed przekazaniem go do następnego niższego sterownika. Kierowca autobusu obsługuje protokół IRP, a następnie go kończy.
TargetDeviceRelation Request
Zapytanie TargetDeviceRelation umożliwia menedżerowi PnP wykonywanie zapytań względem stosu urządzenia innego niż PnP dla pdO w stosie urządzenia PnP, który kontroluje sprzęt.
Ogólnie rzecz biorąc, sterowniki przekazują IRP_MN_QUERY_DEVICE_RELATIONS IRP w dół stosu do momentu osiągnięcia dolnej części określonego stosu urządzenia. Sterownik w dolnej części stosu innego niż PnP następnie przekazuje dalej lub ponownie wystawia protokół IRP do odpowiedniego stosu PnP. Na przykład menedżer PnP może wysłać zapytanie TargetDeviceRelation do obiektu urządzenia w górnej części stosu systemu plików, który jest stosem innej niż PnP. Każdy obiekt urządzenia w stosie systemu plików przekaże zapytanie do obiektu urządzenia poniżej niego, dopóki zapytanie nie osiągnie obiektu urządzenia w dolnej części stosu. Najniższy obiekt urządzenia w stosie będzie przesyłać dalej lub ponownie wydać zapytanie TargetDeviceRelation do obiektu urządzenia w górnej części stosu woluminu magazynu PnP, a następnie zapytanie zostanie przekazane do obiektu PDO w dolnej części stosu woluminów magazynu.
Poniższa lista zawiera podsumowanie sytuacji, w których można bezpiecznie uzyskać wskaźnik do pdO w dolnej części stosu urządzenia PnP:
Obiekt urządzenia w usłudze PnP
Obiekt urządzenia, który znajduje się w stosie urządzenia PnP, dowiaduje się o pdO stosu stosu, gdy wywoływana jest rutyna AddDevice dla urządzenia. Sterownik może bezpiecznie buforować wskaźnik do pdO, jeśli użycie wskaźnika jest prawidłowo zsynchronizowane z przychodzącymi komunikatami IRP_MN_REMOVE_DEVICE przy użyciu procedur usuwania blokady.
Obiekt urządzenia w stosie spoza systemu PnP, a nie w dolnej części stosu
W przypadku obiektu urządzenia, który nie znajduje się w dolnej części stosu innego niż PnP, sterownik może wysłać zapytanie TargetDeviceRelation w celu uzyskania wskaźnika do pdO w dolnej części odpowiedniego stosu urządzenia PnP.
Obiekt pliku dla urządzenia
Biorąc pod uwagę obiekt pliku urządzenia, sterownik może wywołać obiekt IoGetRelatedDeviceObject , aby pobrać obiekt urządzenia, a następnie postępować zgodnie z instrukcjami w poprzednim elemencie listy.
Obsługa obiektu urządzenia
Biorąc pod uwagę dojście do obiektu urządzenia, sterownik może wywołać obiekt ObReferenceObjectByHandle , aby uzyskać obiekt pliku dla urządzenia, a następnie postępować zgodnie z instrukcjami w poprzednim elemencie listy.
Sterownik magistrali nadrzędnej musi obsługiwać zapytanie o relacje TargetDeviceRelation dla swoich urządzeń podrzędnych. Sterownik magistrali odwołuje się do obiektu PDO urządzenia podrzędnego z obiektem ObReferenceObject i zwraca wskaźnik do obiektu PDO w strukturze DEVICE_RELATIONS . W strukturze tego typu relacji znajduje się tylko jeden wskaźnik PDO. Menedżer PnP usuwa odwołanie do obiektu PDO, gdy sterownik lub aplikacja wyrejestruje powiadomienia na urządzeniu.
Tylko sterownik magistrali nadrzędnej odpowiada na zapytanie TargetDeviceRelation . Sterowniki funkcji i filtru muszą przekazać go do następnego niższego sterownika w stosie urządzenia. Jeśli kierowca magistrali otrzymuje ten protokół IRP jako sterownik funkcji dla karty lub kontrolera, sterownik magistrali wykonuje zadania sterownika funkcji i musi przekazać IRP do następnego niższego sterownika.
Jeśli sterownik nie znajduje się w stosie opartym na pdO, sterownik wysyła do obiektu urządzenia nowy identyfikator IRP zapytania docelowego urządzenia skojarzony z uchwytem pliku, na którym sterownik wykonuje operacje we/wy.
Wysyłanie tego protokołu IRP
Kierowcy nie mogą wysyłać IRP_MN_QUERY_DEVICE_RELATIONS do żądania BusRelations. Sterowniki nie są ograniczone do wysyłania tego protokołu IRP dla funkcji RemovalRelations lub EjectionRelations, ale nie jest prawdopodobne, że sterownik to zrobi.
Sterowniki mogą wykonywać zapytania dotyczące stosu urządzeń dla elementu TargetDeviceRelation. Aby uzyskać informacje na temat wysyłania adresów IRPs, zobacz Obsługa adresów IRPs . Następujące kroki dotyczą konkretnie tego protokołu IRP:
Ustaw wartości w następnej lokalizacji stosu we/wy IRP: ustaw wartość MajorFunction na IRP_MJ_PNP, ustaw wartość MinorFunction na wartość IRP_MN_QUERY_DEVICE_RELATIONS, ustaw parametr Parameters.QueryDeviceRelations.Type na wartość TargetDeviceRelation i ustaw właściwość Irp-FileObject> na prawidłowy obiekt pliku.
Zainicjuj stan IoStatus.Status , aby STATUS_NOT_SUPPORTED.
Jeśli sterownik wysłał ten IRP, aby uzyskać pdO do raportowania w odpowiedzi na IRP_MN_QUERY_DEVICE_RELATIONS dla TargetDeviceRelation , że sterownik odebrał, sterownik zgłasza pdO i zwalnia zwróconą strukturę relacji po zakończeniu IRP. Jeśli sterownik zainicjował ten protokół IRP z innego powodu, sterownik zwalnia strukturę relacji po zakończeniu IRP i wyłuskaniu pdO, gdy nie jest już potrzebny.
Wymagania
Nagłówek |
Wdm.h (w tym Wdm.h, Ntddk.h, lub Ntifs.h) |
Zobacz też
IoRegisterPlugPlayNotification
IRP_MN_DEVICE_USAGE_NOTIFICATION