Sdílet prostřednictvím


IRP_MN_QUERY_DEVICE_RELATIONS

Správce PnP odešle tento požadavek, aby určil určité vztahy mezi zařízeními. Tento požadavek zpracovávají následující typy ovladačů:

  • Ovladače sběrnice musí zpracovávat požadavky BusRelations na adaptér nebo kontroler (FDO sběrnice). Ovladače filtru můžou zpracovávat požadavky BusRelations .

  • Ovladače sběrnice musí zpracovávat požadavky TargetDeviceRelation pro svá podřízená zařízení (podřízené PDO).

  • Ovladače funkcí a filtrů můžou zpracovávat požadavky RemovalRelations a PowerRelations .

  • Ovladače sběrnice můžou zpracovávat žádosti o vysunutírelations pro svá podřízená zařízení (podřízená PDO).

Hodnota

0x07

Hlavní kód

IRP_MJ_PNP

Při odeslání

Správce PnP odešle tento IRP, aby shromáždil informace o zařízeních se vztahem k zadanému zařízení.

Správce PnP dotazuje busRelations (podřízená zařízení) zařízení, když je zařízení uvedeno a jindy, když je zařízení aktivní, například když ovladač volá rutinu IoInvalidateDeviceRelations , která označuje, že podřízené zařízení dorazilo nebo odešelo.

Správce PnP před odebráním ovladačů zařízení dotazuje odebrání zařízení. Správce PnP se před vysunutím zařízení dotazuje na RemovalRelations a Vysunutírelations .

Správce PnP se dotazuje targetDeviceRelation zařízení, když ovladač nebo aplikace v uživatelském režimu zaregistruje oznámení PnP události EventCategoryTargetDeviceChange na zařízení. Správce PnP se dotazuje na zařízení, které je přidružené k určitému objektu souboru. IRP_MN_QUERY_DEVICE_RELATIONS je jediný protokol IRP PnP, který má platný parametr objektu souboru. Ovladač může dotazovat zásobník zařízení pro TargetDeviceRelation. Ovladač nemusí při odesílání dotazu TargetDeviceRelation zadávat objekt souboru.

Správce PnP se dotazuje na PowerRelations zařízení, když ovladač zařízení volá IoInvalidateDeviceRelations , aby indikoval, že se změnila sada zařízení, se kterými má toto zařízení implicitní vztah řízení spotřeby. Požadavky PowerRelations se podporují od Windows 7.

Pro požadavky BusRelations, RemovalRelations, VysunutíRelations a PowerRelations odešle správce PnP IRP_MN_QUERY_DEVICE_RELATIONS v IRQL = PASSIVE_LEVEL v kontextu systémového vlákna.

Pro požadavky TargetDeviceRelation správce PnP odešle tento IRP v IRQL = PASSIVE_LEVEL v libovolném kontextu vlákna.

Vstupní parametry

Parametr.QueryDeviceRelations.Type člen struktury IO_STACK_LOCATION určuje typ relací, které se dotazují. Mezi možné hodnoty patří BusRelations, EjectionRelations, RemovalRelations, TargetDeviceRelation a PowerRelations.

Člen FileObject aktuální IO_STACK_LOCATION struktury odkazuje na platný objekt souboru pouze pokud Parameters.QueryDeviceRelations.Type je TargetDeviceRelation.

Výstupní parametry

Vráceno v bloku stavu vstupně-výstupních operací.

Blok stavu vstupně-výstupních operací

Ovladač nastaví stav Irp-IoStatus.Status> na STATUS_SUCCESS nebo na stav selhání, jako je STATUS_INSUFFICIENT_RESOURCES.

Při úspěchu ovladač nastaví Irp-IoStatus.Information> na PDEVICE_RELATIONS ukazatel, který odkazuje na požadované informace o relacích. Struktura DEVICE_RELATIONS je definována takto:

typedef struct _DEVICE_RELATIONS {
  ULONG  Count;
  PDEVICE_OBJECT  Objects[1];  // variable length
} DEVICE_RELATIONS, *PDEVICE_RELATIONS;

Operace

Pokud ovladač vrátí relace v reakci na tento IRP_MN_QUERY_DEVICE_RELATIONS, ovladač přidělí strukturu DEVICE_RELATIONS ze stránkované paměti, která obsahuje počet a odpovídající počet ukazatelů objektu zařízení. Správce PnP uvolní strukturu, když už ji nepotřebujete. Pokud ovladač nahradí DEVICE_RELATIONS strukturu, kterou přidělil jiný ovladač, ovladač musí uvolnit předchozí strukturu.

Ovladač musí odkazovat na primární název libovolného zařízení, které hlásí v tomto IRP (ObReferenceObject). Správce PnP odebere odkaz, pokud je to vhodné.

Funkce nebo ovladač filtru by měly být připravené na zpracování tohoto protokolu IRP pro zařízení kdykoli po dokončení rutiny AddDevice pro zařízení. Ovladače sběrnice by měly být připravené na zpracování dotazu na BusRelations ihned po vytvoření výčtu zařízení.

Obecná pravidla týkající se zpracování dílčích přístupových bodů irps plug and play naleznete v tématu Plug and Play.

Následující pododdíly popisují konkrétní akce pro zpracování různých dotazů.

Žádost o busRelations

Když správce PnP zadá dotazy na vztahy sběrnice (podřízená zařízení) adaptéru nebo kontroleru, musí ovladač sběrnice vrátit seznam ukazatelů na primární počítače všech zařízení fyzicky přítomných ve sběrnici. Řidič autobusu hlásí všechna zařízení bez ohledu na to, jestli byly spuštěny. Řidič autobusu možná bude muset zapnout své sběrnicové zařízení, aby určil, které děti jsou přítomny.

Varování Objekt zařízení nelze předat žádné rutině, která přebírá primární objekt jako argument, dokud správce PnP vytvoří uzel zařízení (devnode) pro tento objekt. (Pokud ovladač předává objekt zařízení, systém zkontroluje chybu pomocí kontroly chyb 0xCA: PNP_DETECTED_FATAL_ERROR.) Správce PnP vytvoří vývojový uzel v reakci na požadavek IRP_MN_QUERY_DEVICE_RELATIONS . Ovladač může bezpečně předpokládat, že se devnode pdO vytvořil, když obdrží požadavek IRP_MN_QUERY_RESOURCE_REQUIREMENTS .

Ovladač sběrnice, který reaguje na tento IRP, je ovladač funkce pro adaptér nebo ovladač sběrnice, nikoli nadřazený ovladač sběrnice pro sběrnici, ke které je adaptér nebo kontroler připojený. Ovladače funkcí pro jiná než sběrná zařízení tento dotaz nezpracují. Tito řidiči prostě předávají IRP dalšímu nižšímu ovladači. (Viz následující obrázek.) Ovladače filtru obvykle nezpracují tento dotaz.

V systému Windows Vista a novějších operačních systémech doporučujeme, aby ovladače vždy pendovaly IRP_MN_QUERY_DEVICE_RELATIONS IRP a dokončily jeho zpracování později. Toto pořadí umožňuje systému asynchronně zpracovávat relační dotazy sběrnice. (V operačních systémech před systémem Windows Vista mohou ovladače bezpečně vracet STATUS_PENDING ze svých rutin odeslání, ale správce PnP nepřekrývá relační dotaz sběrnice s žádnou jinou operací.)

Následující diagram znázorňuje, jak ovladače zpracovávají dotaz na relace sběrnice.

diagram znázorňující ovladače zpracovávající dotaz na relace sběrnice

V příkladu zobrazeném na obrázku odešle správce PnP ovladači rozbočovače USB IRP_MN_QUERY_DEVICE_RELATIONS pro BusRelations . Správce PnP požaduje seznam podřízených zařízení rozbočovače.

  1. Stejně jako u všech PnP IRPs pošle správce PnP hlavní ovladač v zásobníku zařízení pro dané zařízení.

  2. Volitelný ovladač filtru může být hlavním ovladačem v zásobníku. Ovladač filtru obvykle nezpracuje tento protokol IRP; projde IRP v zásobníku. Ovladač filtru může zpracovat tento IRP, například pokud ovladač zveřejní na sběrnici zařízení, které není vyčíslitelné.

  3. Ovladač sběrnice rozbočovače USB zpracovává IRP.

    Ovladač sběrnice rozbočovače USB:

    • Vytvoří pdo pro jakékoli podřízené zařízení, které ho ještě nemá.

    • Označí primární název souboru neaktivní pro jakékoli zařízení, které už není na sběrnici. Ovladač sběrnice takové soubory PDO neodstraní.Další informace o tom, kdy se mají odstranit pdos, naleznete v tématu Odebrání zařízení.

    • Hlásí všechna podřízená zařízení, která jsou na sběrnici.

      Pro každé podřízené zařízení ovladač sběrnice odkazuje na pdO a umístí ukazatel na pdO ve struktuře DEVICE_RELATIONS.

      V tomto příkladu jsou dva pdos: jeden pro zařízení joystick a jeden pro zařízení klávesnice.

      Řidič sběrnice by měl zkontrolovat, zda již jiný řidič vytvořil strukturu DEVICE_RELATIONS pro tento IRP. Pokud ano, řidič autobusu musí přidat k existujícím informacím.

      Pokud na sběrnici není žádné podřízené zařízení, ovladač nastaví počet na nulu ve struktuře DEVICE_RELATIONS a vrátí úspěch.

    • Nastaví příslušné hodnoty v bloku stavu vstupně-výstupních operací a předá protokol IRP dalšímu nižšímu ovladači. Ovladač sběrnice pro adaptér nebo kontroler nedokoncuje IRP.

  4. Volitelný nižší filtr, pokud je k dispozici, obvykle nezpracuje tento IRP. Takový ovladač filtru předává IRP dolů zásobníku. Pokud ovladač s nižším filtrem zpracovává tento protokol IRP, může přidat pdO do seznamu podřízených zařízení, ale nesmí odstranit žádné PDO vytvořené jinými ovladači.

  5. Nadřazený ovladač sběrnice nezpracuje tento protokol IRP, pokud se nejedná o jediný ovladač v zásobníku zařízení (zařízení je v nezpracovaném režimu). Stejně jako u všech PnP IRP dokončí nadřazený ovladač sběrnice IRP pomocí IoCompleteRequest.

    Pokud je v zásobníku zařízení jeden nebo více ovladačů filtru sběrnice, můžou tyto ovladače zpracovat IRP na cestě dolů k ovladači sběrnice a/nebo na cestě IRP zálohovat zásobník zařízení (pokud existují rutiny IoCompletion ). Podle pravidel IRP PnP může takový ovladač přidat pdo do protokolu IRP na cestě dolů zásobníku nebo upravit seznam relací na cestě IRP zpět zásobníku (v rutinách IoCompletion ).

Žádost o vysunutírelations

Ovladač vrátí ukazatele na primární počítače všech zařízení, která mohou být fyzicky odebrána ze systému při vysunutí zadaného zařízení. Neohlašujte primární soubory podřízených zařízení; Správce PnP vždy požaduje, aby se podřízená zařízení odebrala před nadřazeným zařízením.

Správce PnP odešle IRP_MN_EJECT protokolu IRP do zařízení, které se vysune. Ovladač takového zařízení obdrží také odebrané IRP. Vztahy vysunutí zařízení obdrží IRP_MN_REMOVE_DEVICE IRP (nikoli IRP_MN_EJECT IRP).

Na dotaz vysunutírelations na jedno z podřízených zařízení může odpovědět pouze nadřazený ovladač sběrnice. Ovladače funkcí a filtrů je nutné předat do dalšího nižšího ovladače v zásobníku zařízení. Pokud ovladač sběrnice obdrží tento IRP jako ovladač funkce pro svůj adaptér nebo ovladač, ovladač sběrnice provádí úlohy ovladače funkce a musí předat IRP dalšímu nižšímu ovladači.

Žádost o powerrelations

Od Windows 7 umožňuje dotaz PowerRelations určit vztah řízení spotřeby mimo konvenční relaci mezi nadřazenou sběrnici, která podporuje výčt PnP a výčtové podřízené zařízení ve sběrnici. Pokud například ovladač sběrnice nemůže vytvořit výčet podřízeného zařízení ve sběrnici nebo pokud je zařízení podřízenou položkou více sběrnic, může dotaz PowerRelations popsat vztahy napájení podřízeného zařízení se sběrnicemi nebo autobusy.

Správce PnP vydá dotaz PowerRelations pro zařízení, když ovladač zařízení volá rutinu IoInvalidateDeviceRelations a určuje hodnotu parametru TypePowerRelations.

V reakci na tento dotaz ovladač cílového zařízení (tj. zařízení, které je cílem dotazu) poskytuje DEVICE_RELATIONS strukturu, která obsahuje ukazatele na primární objekty všech ostatních zařízení, která musí být před zapnutím cílového zařízení zapnuta správcem napájení. Naopak tato další zařízení musí být vypnutá až po vypnutí cílového zařízení. Power Manager pomocí informací z dotazu zaručuje, že jsou tato zařízení ve správném pořadí zapnutá a vypnutá.

Tato záruka řazení se vztahuje pouze na přechody stavu spánku globálního systému, mezi které patří přechody do a z stavu napájení systému S1, S2, S3 (režim spánku), S4 (hibernace) a S5 (vypnutí). Záruka řazení PowerRelations se nevztahuje na přechody napájení zařízení Dx, zatímco systém zůstává ve stavu systému S0 (spuštěný), s výjimkou přechodů DFx (Direct Runtime Power Management ).

Pokud je cílové zařízení v cestě zařízení pro speciální soubor (například stránkovací soubor, soubor hibernace nebo soubor s výpisem stavu systému), ovladač cílového zařízení musí provést další krok, když zpracovává IRP_MN_DEVICE_USAGE_NOTIFICATION IRP, ve kterém je InPathtrue. Tento ovladač musí zajistit, aby zařízení, jejichž primární soubory jsou zadané pro dotaz PowerRelations , mohly být také podporovány v cestě zařízení pro speciální soubor. Aby bylo možné tuto podporu potvrdit, musí ovladač cílového zařízení nejprve odeslat IRP_MN_DEVICE_USAGE_NOTIFICATION IRP každému z těchto zařízení a tento protokol IRP musí zadat stejný typ UsageNotification.Type jako cílové zařízení. Pouze pokud všechna zařízení, která obdrží tento IRP, dokončí IRP se stavovým kódem úspěchu, může ovladač cílového zařízení úspěšně dokončit svůj IRP_MN_DEVICE_USAGE_NOTIFICATION IRP. Jinak tento ovladač musí dokončit tento kód IRP se stavovým kódem selhání.

Pokud tento stejný ovladač zpracovává IRP_MN_DEVICE_USAGE_NOTIFICATION IRP, pro který je InPathNEPRAVDA, musí ovladač odeslat IRP_MN_DEVICE_USAGE_NOTIFICATION IRP do stejné sady závislých zařízení jako v případě, kdy je InPathpravda. Ovladač by však nikdy neměl dokončit tento IRP se stavovým kódem selhání, pokud je v cestěNEPRAVDA.

Ovladač, který reaguje na dotaz PowerRelations , by se měl zaregistrovat pro oznámení o změnách cílových zařízení na všech zařízeních, jejichž PDO jsou zadané pro dotaz PowerRelations . Ovladač může volat rutinu IoRegisterPlugPlayNotification a zadat hodnotu parametru EventCategory EventCategoryTargetDeviceChange.

Žádost o odebránírelations

Ovladač vrátí ukazatele na primární počítače všech zařízení, jejichž ovladače musí být při odebrání ovladačů pro zadané zařízení odebrány. Neohlašujte primární soubory podřízených zařízení; Správce PnP již před odebráním zařízení požádá o odebrání podřízených zařízení.

Pořadí odebrání vztahů není definováno.

Každý ovladač v zásobníku zařízení dokáže zpracovat tento typ dotazu relací. Funkce nebo ovladač filtru zpracovává IRP před jeho předáním dalšímu nižšímu ovladači. Řidič autobusu zpracovává IRP a pak ho dokončí.

Požadavek TargetDeviceRelation

Dotaz TargetDeviceRelation umožňuje správci PnP dotazovat zásobník zařízení jiného typu než PnP pro pdO v zásobníku zařízení PnP, který řídí hardware.

Obecně platí, že ovladače předávají IRP_MN_QUERY_DEVICE_RELATIONS IRP dolů jejich zásobníku, dokud IRP nedosáhne dolní části konkrétního zásobníku zařízení. Ovladač v dolní části zásobníku jiného typu než PnP pak předá nebo znovu vydá IRP příslušnému zásobníku PnP. Správce PnP může například odeslat dotaz TargetDeviceRelation do objektu zařízení v horní části zásobníku systému souborů, což je zásobník jiného typu než PnP. Každý objekt zařízení v zásobníku systému souborů předá dotaz objektu zařízení pod ním, dokud dotaz nedosáhne objektu zařízení v dolní části zásobníku. Nejnižší objekt zařízení v zásobníku by předal nebo znovu vydal dotaz TargetDeviceRelation na objekt zařízení v horní části zásobníku svazku úložiště PnP a pak by se dotaz předal do primárního objektu v dolní části zásobníku svazků úložiště.

Následující seznam shrnuje situace, ve kterých můžete bezpečně získat ukazatel na primární objekt v dolní části zásobníku zařízení PnP:

  • Objekt zařízení v PnP

    Objekt zařízení, který je v zásobníku zařízení PnP, se při volání rutiny AddDevice pro zařízení dozví o primárním objektu zásobníku. Pokud je použití ukazatele správně synchronizované s příchozími IRP_MN_REMOVE_DEVICE zprávami pomocí rutin pro odebrání zámku, může ovladač bezpečně uložit ukazatel do mezipaměti do mezipaměti.

  • Objekt zařízení v zásobníku bez PnP, ne v dolní části zásobníku

    U objektu zařízení, který není v dolní části zásobníku jiného typu než PnP, může ovladač odeslat dotaz TargetDeviceRelation , který získá ukazatel na primární objekt v dolní části odpovídajícího zásobníku zařízení PnP.

  • Objekt souboru pro zařízení

    Při zadání objektu souboru pro zařízení může ovladač volat IoGetRelatedDeviceObject , aby získal objekt zařízení, a pak postupujte podle pokynů v předchozí položce seznamu.

  • Popisovač objektu zařízení

    Vzhledem k popisovači objektu zařízení může ovladač volat ObReferenceObjectByHandle získat objekt souboru pro zařízení a poté postupovat podle pokynů v předchozí položce seznamu.

Nadřazený ovladač sběrnice musí zpracovat dotaz na relace TargetDeviceRelation pro jeho podřízená zařízení. Ovladač sběrnice odkazuje na primární název podřízeného zařízení s Objektem ObReferenceObject a vrátí ukazatel na primární objekt v DEVICE_RELATIONS struktuře . Ve struktuře tohoto typu relace je pouze jeden ukazatel PDO. Správce PnP odebere odkaz na pdO, když ovladač nebo aplikace zruší registraci oznámení na zařízení.

Dotaz TargetDeviceRelation odpovídá pouze nadřazený ovladač sběrnice. Ovladače funkcí a filtrů je nutné předat do dalšího nižšího ovladače v zásobníku zařízení. Pokud ovladač sběrnice obdrží tento IRP jako ovladač funkce pro svůj adaptér nebo ovladač, ovladač sběrnice provádí úlohy ovladače funkce a musí předat IRP dalšímu nižšímu ovladači.

Pokud ovladač není v zásobníku založeném na primárním objektu, ovladač odešle do objektu zařízení přidruženého k objektu zařízení přidruženému k popisovači souboru, na kterém ovladač provádí vstupně-výstupní operace.

Odesílání tohoto protokolu IRP

Ovladače nesmí odesílat IRP_MN_QUERY_DEVICE_RELATIONS k vyžádání busRelations. Ovladače nejsou omezeny odesíláním tohoto protokolu IRP pro OdstraněníRelations nebo VysunutíRelations, ale není pravděpodobné, že by to ovladač udělal.

Ovladače můžou dotazovat zásobník zařízení pro TargetDeviceRelation. Informace o odesílání ip adres IR Najdete v tématu Zpracování ip adres IRP . Následující kroky platí konkrétně pro tento IRP:

  • Nastavte hodnoty v umístění dalšího vstupně-výstupního zásobníku IRP: nastavte MajorFunction na IRP_MJ_PNP, nastavte MinorFunction na IRP_MN_QUERY_DEVICE_RELATIONS, nastavte Parameters.QueryDeviceRelations.Type na TargetDeviceRelation a nastavte Irp-FileObject> na platný objekt souboru.

  • Inicializace ioStatus.Status na STATUS_NOT_SUPPORTED

Pokud ovladač odeslal tento IRP, aby získal pdO sestavu v reakci na IRP_MN_QUERY_DEVICE_RELATIONS pro TargetDeviceRelation , který ovladač přijal, ovladač hlásí pdO a uvolní vrácenou strukturu relací po dokončení IRP. Pokud obchodní faktor zahájil tento IRP z jiného důvodu, ovladač uvolní strukturu vztahů po dokončení protokolu IRP a dereference pdO, pokud už není potřeba.

Požadavky

Záhlaví

Wdm.h (včetně Wdm.h, Ntddk.h nebo Ntifs.h)

Viz také

PřidatZařízení

IoCompleteRequest

IoGetRelatedDeviceObject

IoInvalidateDeviceRelations

IoRegisterPlugPlayNotification

IRP_MJ_PNP

IRP_MN_DEVICE_USAGE_NOTIFICATION

IRP_MN_EJECT

IRP_MN_QUERY_RESOURCE_REQUIREMENTS

IRP_MN_REMOVE_DEVICE

IO_STACK_LOCATION

ObReferenceObject

ObReferenceObjectByHandle