IRP_MN_ESZKÖZKAPCSOLATOK_LEKÉRDEZÉSE

A PnP-kezelő elküldi ezt a kérést az eszközök közötti bizonyos kapcsolatok meghatározásához. A következő típusú illesztőprogramok kezelik ezt a kérést:

  • A buszvezetőknek BusRelations adapterre vagy vezérlőre (bus FDO) vonatkozó kéréseket kell kezelniük. A szűrőillesztők BusRelations kéréseket kezelhetnek.

  • A buszvezetőknek kezelniük kell TargetDeviceRelation gyermekeszközeik (gyermek PDO-k) kéréseit.

  • A függvény- és szűrőillesztők és PowerRelations kéréseket kezelhetnek.

  • A buszvezetők kezelhetik EjectionRelations gyermekeszközeikre (gyermek PDO-k) vonatkozó kéréseket.

Érték

0x07

Fő kód

IRP_MJ_PNP

Küldéskor

A PnP-kezelő elküldi ezt az IRP-t, hogy információkat gyűjtsön a megadott eszközzel kapcsolatban lévő eszközökről.

A PnP-kezelő lekérdezi az eszköz BusRelations (gyermekeszközök) értékét az eszköz számbavételekor, máskor pedig az eszköz aktív állapotában, például amikor egy illesztőprogram meghívja a IoInvalidateDeviceRelations rutint, amely azt jelzi, hogy egy gyermekeszköz megérkezett vagy elindult.

A PnP-kezelő lekérdezi az eszköz RemoveRelations, mielőtt eltávolítja az eszköz illesztőprogramjait. A PnP-kezelő lekérdezi RemovalRelations és EjectionRelations, mielőtt kibocsát egy eszközt.

A PnP-kezelő lekérdezi az eszköz TargetDeviceRelation, amikor egy illesztőprogram vagy felhasználói módú alkalmazás regisztrál egy EventCategoryTargetDeviceChange az eszközön. A PnP-kezelő lekérdezi az adott fájlobjektumhoz társított eszközt. IRP_MN_QUERY_DEVICE_RELATIONS az egyetlen PnP IRP, amely érvényes fájlobjektum-paraméterrel rendelkezik. Az illesztőprogramok lekérdezhetik TargetDeviceRelationeszközveremét. Az illesztőprogramnak nem kell fájlobjektumot megadnia a TargetDeviceRelation lekérdezés elküldésekor.

A PnP-kezelő lekérdezi az eszköz PowerRelations, amikor az eszköz illesztőprogramja meghívja IoInvalidateDeviceRelations annak jelzésére, hogy megváltozott azoknak az eszközöknek az halmaza, amelyekkel az eszköz implicit energiagazdálkodási kapcsolatban áll. PowerRelations kérések a Windows 7-től kezdve támogatottak.

A BusRelations, RemovalRelations, EjectionRelationsés PowerRelations kérések esetében a PnP-kezelő IRP_MN_QUERY_DEVICE_RELATIONS küld irQL = PASSIVE_LEVEL a rendszerszál kontextusában.

A TargetDeviceRelation kérések esetében a PnP-kezelő ezt az IRP-t irQL = PASSIVE_LEVEL egy tetszőleges szálkörnyezetben küldi el.

Bemeneti paraméterek

A Parameters.QueryDeviceRelations.TypeIO_STACK_LOCATION struktúra tagja határozza meg a lekérdezett kapcsolatok típusát. Lehetséges értékek: BusRelations, EjectionRelations, RemovalRelations, TargetDeviceRelationés PowerRelations.

A FileObject jelenlegi IO_STACK_LOCATION struktúrájának tagja csak akkor mutat érvényes fájlobjektumra, ha Parameters.QueryDeviceRelations.TypeTargetDeviceRelation.

Kimeneti paraméterek

Az I/O állapotblokkban van visszaadva.

I/O állapotblokk

Az illesztőprogramok Irp->IoStatus.Status STATUS_SUCCESS vagy hibaállapotra, például STATUS_INSUFFICIENT_RESOURCES.

Sikeresség esetén az illesztő az Irp- >IoStatus.Information egy PDEVICE_RELATIONS mutatóra állítja, amely a kért kapcsolati adatokra mutat. A DEVICE_RELATIONS szerkezet a következőképpen van definiálva:

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

Művelet

Ha egy illesztőprogram a IRP_MN_QUERY_DEVICE_RELATIONSválaszul ad vissza kapcsolatokat, az illesztőprogram egy DEVICE_RELATIONS struktúrát foglal le a lapozott memóriából, amely számmal és a megfelelő számú eszközobjektum-mutatóval rendelkezik. A PnP-kezelő felszabadítja a struktúrát, ha már nincs rá szükség. Ha egy illesztőprogram egy másik illesztőprogram által lefoglalt DEVICE_RELATIONS struktúrát cserél le, az illesztőprogramnak fel kell szabadítania az előző struktúrát.

Az illesztőprogramnak hivatkoznia kell az ebben az IRP-ben (ObReferenceObject) szereplő eszközök oem-jára. A PnP-kezelő szükség esetén eltávolítja a hivatkozást.

A függvény- vagy szűrőillesztőknek készen kell állniuk arra, hogy kezelni tudják az eszköz IRP-jét, miután az AddDevice rutinja befejeződött az eszközön. A buszvezetőknek készen kell állniuk arra, hogy közvetlenül az eszköz számbavétele után kezeljék BusRelations lekérdezését.

Az Plug and Play kisebb INTEGRÁCIÓS- kezelésének általános szabályaiért lásd Plug and Play.

Az alábbi alszakaszok a különböző lekérdezések kezeléséhez szükséges konkrét műveleteket ismertetik.

BusRelations-kérelem

Amikor a PnP-kezelő lekérdezi egy adapter vagy vezérlő buszkapcsolatait (gyermekeszközeit), a buszvezetőnek vissza kell adnia a buszon fizikailag jelen lévő eszközök PPO-jainak mutatóinak listáját. A buszvezető minden eszközt jelent, függetlenül attól, hogy elindultak-e. Előfordulhat, hogy a buszvezetőnek be kell állítania a buszeszközt annak megállapításához, hogy mely gyermekek vannak jelen.

Figyelmeztetés Az eszközobjektumok nem továbbíthatók olyan rutinnak, amely argumentumként használ egy oem-et, amíg a PnP-kezelő nem hoz létre eszközcsomópontot (devnode) az adott objektumhoz. (Ha az illesztőprogram átmegy egy eszközobjektumon, a rendszer hibaellenőrzést végez hibaellenőrzési 0xCA: PNP_DETECTED_FATAL_ERROR.) A PnP-kezelő a IRP_MN_QUERY_DEVICE_RELATIONS kérésre válaszul hozza létre a devnode-t. Az illesztőprogram nyugodtan feltételezheti, hogy az oem devnode akkor lett létrehozva, amikor IRP_MN_QUERY_RESOURCE_REQUIREMENTS kérést kap.

Az IRP-nek válaszoló buszillesztő a buszadapter vagy -vezérlő függvényillesztője, nem pedig annak a busznak a szülőbusz-illesztőprogramja, amelyhez az adapter vagy a vezérlő csatlakozik. A nem buszos eszközök függvényillesztői nem kezelik ezt a lekérdezést. Az ilyen illesztőprogramok csak adják át az IRP-t a következő alsó illesztőnek. (Lásd a következő ábrát.) A szűrőillesztők általában nem kezelik ezt a lekérdezést.

Windows Vista és újabb operációs rendszereken azt javasoljuk, hogy az illesztőprogramok mindig a IRP_MN_QUERY_DEVICE_RELATIONS IRP-t használják, és később fejezze be a feldolgozást. Ez a sorrend lehetővé teszi, hogy a rendszer aszinkron módon dolgozza fel a buszrelációs lekérdezéseket. (Windows Vista előtti operációs rendszereken az illesztőprogramok biztonságosan vissza tudják küldeni STATUS_PENDING a küldési rutinjukból, de a PnP-kezelő nem fedi át a buszrelációs lekérdezést semmilyen más művelettel.)

Az alábbi ábra bemutatja, hogyan kezelik az illesztőprogramok a buszkapcsolatok lekérdezését.

diagram, amely a buszkapcsolatok lekérdezését kezelő illesztőprogramokat szemlélteti.

Az ábrán látható példában a PnP-kezelő IRP_MN_QUERY_DEVICE_RELATIONS küld a BusRelations az USB Hub-eszköz illesztőprogramjainak. A PnP-kezelő a központi eszköz gyermekeinek listáját kéri.

  1. Az összes PnP-integrációs modulhoz hasonlóan a PnP-kezelő is elküldi az IRP-t az eszköz veremének legfelső illesztőjének.

  2. Lehetséges, hogy egy választható szűrőillesztő a verem legfelső illesztőprogramja. A szűrőillesztők általában nem kezelik ezt az IRP-t; az IRP-t átadja a veremen. A szűrőillesztők kezelhetik ezt az IRP-t, például ha az illesztőprogram egy nem számozható eszközt tesz elérhetővé a buszon.

  3. Az USB Hub buszillesztő kezeli az IRP-t.

    Az USB Hub buszillesztő:

    • Létrehoz egy oem-et minden olyan gyermekeszközhöz, amely még nem rendelkezik ilyen eszközzel.

    • Minden olyan eszköz esetében, amely már nem található meg a buszon, megjelöli az oem inaktívként való megjelölését. A buszillesztő nem törli az ilyen PDF-eket.További információ a pdO-k törlésének időpontjáról: Eszköz eltávolítása.

    • Jelenti a buszon található gyermekeszközöket.

      Minden gyermekeszköz esetében a buszvezető hivatkozik az oem-re, és a DEVICE_RELATIONS szerkezetében mutatót helyez az oem-hez.

      Ebben a példában két PDO található: egy a joystick-eszközhöz, egy pedig a billentyűzet eszközhöz.

      A buszvezetőnek ellenőriznie kell, hogy egy másik vezető már létrehozott-e DEVICE_RELATIONS struktúrát ehhez az IRP-hez. Ha igen, a buszvezetőnek hozzá kell adnia a meglévő információkat.

      Ha a buszon nincs gyermekeszköz, a vezető nullára állítja a számot a DEVICE_RELATIONS struktúrában, és sikert ad vissza.

    • Beállítja a megfelelő értékeket az I/O állapotblokkban, és átadja az IRP-t a következő alsó illesztőnek. Az adapter vagy vezérlő buszillesztője nem hajtja végre az IRP-t.

  4. Ha van ilyen, a választható alacsonyabb szűrő általában nem kezeli ezt az IRP-t. Egy ilyen szűrőillesztő átadja az IRP-t a veremen. Ha egy alacsonyabb szűrővel rendelkező illesztőprogram kezeli ezt az IRP-t, hozzáadhatja az OEM-eket a gyermekeszközök listájához, de nem törölheti a más illesztőprogramok által létrehozott PDO-kat.

  5. A szülőbusz-illesztőprogram nem kezeli ezt az IRP-t, kivéve, ha ez az egyetlen illesztőprogram az eszközveremben (az eszköz nyers módban van). Mint minden PnP IRP- hez, a szülő buszvezető az IRP-t IoCompleteRequest.

    Ha egy vagy több buszszűrő illesztőprogram található az eszköz veremében, az ilyen illesztőprogramok kezelhetik az IRP-t a buszillesztő felé vezető úton és/vagy az IRP-nek az eszközverem biztonsági mentésén (ha vannak IoCompletion rutinok). A PnP IRP szabályai szerint az ilyen illesztőprogramok a veremen lefelé haladva hozzáadhatnak PDO-kat az IRP-hez, és/vagy módosíthatják az IRP kapcsolatlistáját a verem biztonsági mentéséhez (IoCompletion rutinokban).

EjectionRelations kérelem

Az illesztőprogram minden olyan eszköz PPO-jára mutató mutatót ad vissza, amely fizikailag eltávolítható a rendszerből a megadott eszköz kibocsátásakor. Ne jelentse az eszköz gyermekeinek PDO-ját; A PnP-kezelő mindig azt kéri, hogy a gyermekeszközöket a szülőeszköz előtt távolítsák el.

A PnP-kezelő egy IRP_MN_EJECT IRP-t küld egy kijelzett eszközre. Az ilyen eszköz illesztőprogramja is kap egy eltávolítási IRP-t. Az eszköz kibocsátó kapcsolatai IRP_MN_REMOVE_DEVICE IRP-t kapnak (nem IRP_MN_EJECT IRP-t).

Csak a szülőbusz-illesztő válaszolhat egy EjectionRelations lekérdezésre az egyik gyermekeszközén. A függvény- és szűrőillesztőknek át kell adniuk azt az eszköz verem következő alsó illesztőprogramjának. Ha egy buszvezető ezt az IRP-t kapja az adapter vagy vezérlő függvényillesztőjeként, a buszvezető elvégzi a függvényillesztő feladatait, és át kell adnia az IRP-t a következő alsó illesztőnek.

PowerRelations-kérelem

A Windows 7-től kezdve a PowerRelations lekérdezés lehetővé teszi az illesztőprogram számára, hogy a PnP-számbavételt támogató szülőbusz és a buszon lévő számbavett gyermekeszköz közötti hagyományos kapcsolaton kívüli energiagazdálkodási kapcsolatot adjon meg. Ha például egy buszvezető nem tud számba adni egy gyermekeszközt a buszon, vagy ha egy eszköz egynél több busz gyermeke, a PowerRelations lekérdezés le tudja írni a gyermekeszköz és a busz energiaviszonyait.

A PnP-kezelő PowerRelations lekérdezést ad ki egy eszközhöz, amikor az eszköz illesztőprogramja meghívja a IoInvalidateDeviceRelations rutint, és megadja a PowerRelationsType paraméterértékét.

A lekérdezésre válaszul a céleszköz illesztőprogramja (vagyis a lekérdezés céleszköze) egy DEVICE_RELATIONS struktúrát biztosít, amely a power manager által a céleszköz bekapcsolása előtt bekapcsolandó egyéb eszközök PPO-jára mutató mutatókat tartalmaz. Ezzel szemben ezeket a többi eszközt csak a céleszköz kikapcsolása után kell kikapcsolni. A power manager a lekérdezés információi alapján garantálja, hogy ezek az eszközök a megfelelő sorrendben vannak be- és kikapcsolva.

Ez a rendezési garancia csak azokra a globális rendszerállapot-áttűnésekre vonatkozik, amelyek magukban foglalják az S1, S2, S3 (alvási), az S4 (hibernált) és az S5 (leállítási) rendszer energiaállapotait. A PowerRelations rendelési garancia nem vonatkozik a Dx eszköz energiaállapot-áttűnésére, amíg a rendszer az S0 (futó) rendszerállapotban marad, kivéve irányított futtatókörnyezeti energiagazdálkodás (DFx) áttűnéseket.

Ha a céleszköz egy speciális fájl (például lapozófájl, hibernált fájl vagy összeomlási memóriaképfájl) eszközútvonalán található, a céleszköz illesztőprogramjának egy további lépést kell végrehajtania, amikor egy IRP_MN_DEVICE_USAGE_NOTIFICATION IRP-t kezel, amelyben InPath igaz . Ennek az illesztőprogramnak biztosítania kell, hogy a powerrelations lekérdezés PDO-kkal rendelkező eszközök is támogathassák a speciális fájl eszközútvonalában való elhelyezést. A támogatás megerősítéséhez a céleszköz illesztőprogramjának először minden eszközre el kell küldenie a IRP_MN_DEVICE_USAGE_NOTIFICATION IRP-t, és ennek az IRP-nek ugyanazt a UsageNotification.Type kell megadnia, mint a céleszközt. Ha az IRP-t fogadó összes eszköz sikeresen befejezi az IRP-t egy sikeres állapotkóddal, a céleszköz illesztőprogramja sikeresen befejezheti a IRP_MN_DEVICE_USAGE_NOTIFICATION IRP-t. Ellenkező esetben az illesztőprogramnak hibaállapot-kóddal kell elvégeznie ezt az IRP-t.

Ha ugyanez az illesztőprogram olyan IRP_MN_DEVICE_USAGE_NOTIFICATION IRP-t kezel, amelyhez InPath hamis , az illesztőprogramnak a IRP_MN_DEVICE_USAGE_NOTIFICATION IRP-t ugyanazon függő eszközökre kell küldenie, mint abban az esetben, amikor InPath igaz . Az illesztőprogramnak azonban soha nem szabad hibaállapotkóddal befejeznie ezt az IRP-t, ha InPath hamis .

A PowerRelations lekérdezésre válaszoló illesztőprogramnak regisztrálnia kell a céleszköz-változási értesítéseket minden olyan eszközön, amelynek A PowerRelations lekérdezéshez megadott PD-jei vannak megadva. Az értesítések regisztrálásához az illesztőprogram meghívhatja az IoRegisterPlugPlayNotification rutint, és megadhatja EventCategory paraméterértékét EventCategoryTargetDeviceChange.

Eltávolítási kérelmek

Az illesztőprogram visszaadja azoknak az eszközöknek a PDO-jait, amelyek illesztőprogramjait el kell távolítani a megadott eszköz illesztőprogramjainak eltávolításakor. Ne jelentse az eszköz gyermekeinek PDO-ját; A PnP-kezelő már az eszköz eltávolítása előtt kéri a gyermekeszközök eltávolítását.

Az eltávolítási kapcsolatok eltávolításának sorrendje nincs meghatározva.

Az eszközverem bármely illesztőprogramja képes kezelni ezt a kapcsolattípus-lekérdezést. A függvények vagy szűrőillesztők kezelik az IRP-t, mielőtt átadják azt a következő alsó illesztőnek. A buszvezető kezeli az IRP-t, majd végrehajtja azt.

TargetDeviceRelation kérelem

A TargetDeviceRelation lekérdezés lehetővé teszi, hogy a PnP-kezelő lekérdezhesse a hardvert vezérlő PnP-eszközverem nem PnP-eszközveremét.

Az illesztőprogramok általában addig továbbítják a IRP_MN_QUERY_DEVICE_RELATIONS IRP-t, amíg az IRP el nem éri egy adott eszközverem alját. A nem PnP-verem alján lévő illesztőprogram ezután továbbítja vagy újra kiadja az IRP-t a megfelelő PnP-veremnek. A PnP-kezelő például küldhet egy TargetDeviceRelation lekérdezést a fájlrendszer verem tetején lévő eszközobjektumra, amely nem PnP-verem. A fájlrendszer verem minden eszközobjektuma átadja a lekérdezést az alatta lévő eszközobjektumnak, amíg a lekérdezés el nem éri a verem alján lévő eszközobjektumot. A verem legalacsonyabb eszközobjektuma továbbítaná vagy újból kiadná a TargetDeviceRelation lekérdezést a PnP-tárolókötet verem tetején lévő eszközobjektumnak, majd a lekérdezést a tárkötet verem alján lévő oem-nek továbbítja.

Az alábbi lista összefoglalja azokat a helyzeteket, amelyekben biztonságosan beszerezhet egy PnP-eszközverem alján található oem-hez mutató mutatót:

  • Eszközobjektum egy PnP-ben

    A PnP-eszközveremben található eszközobjektumok megismerik a verem oem-jét, amikor meghívják az AddDevice rutint az eszközhöz. Az illesztőprogram biztonságosan gyorsítótárazza a mutatót az OEM-hez, ha a mutató használata megfelelően szinkronizálva van a bejövő IRP_MN_REMOVE_DEVICE üzenetekkel az eltávolítási zárolási rutinok használatával.

  • Eszközobjektum nem PnP-veremben, nem a verem alján

    Olyan eszközobjektumok esetében, amelyek nem PnP-verem alján találhatók, az illesztő elküldhet egy TargetDeviceRelation lekérdezést, amely a megfelelő PnP-eszközverem alján található oem-hez mutató mutatót kér le.

  • Az eszköz fájlobjektuma

    Az eszköz fájlobjektuma miatt az illesztőprogram meghívhatja IoGetRelatedDeviceObject az eszközobjektum lekéréséhez, majd kövesse az előző listaelem utasításait.

  • Az eszközobjektum kezelése

    Az eszközobjektum leírója alapján az illesztőprogram meghívhatja ObReferenceObjectByHandle, hogy lekérje az eszköz fájlobjektumát, majd kövesse az előző listaelem utasításait.

A szülőbusz-vezetőnek kezelnie kell egy TargetDeviceRelation kapcsolati lekérdezést a gyermekeszközeihez. A buszvezető a gyermekeszköz oem-ére hivatkozik ObReferenceObject, és egy mutatót ad vissza a DEVICE_RELATIONS struktúrában lévő oem-hez. Ehhez a relációs típushoz csak egy oem mutató van a struktúrában. A PnP-kezelő eltávolítja az oem-re mutató hivatkozást, amikor az illesztőprogram vagy az alkalmazás nem regisztrál az eszközön való értesítésre.

Csak a szülőbusz-illesztőprogram válaszol egy TargetDeviceRelation lekérdezésre. A függvény- és szűrőillesztőknek át kell adniuk azt az eszköz verem következő alsó illesztőprogramjának. Ha egy buszvezető ezt az IRP-t kapja az adapter vagy vezérlő függvényillesztőjeként, a buszvezető elvégzi a függvényillesztő feladatait, és át kell adnia az IRP-t a következő alsó illesztőnek.

Ha egy illesztőprogram nincs oem-alapú veremben, az illesztőprogram egy új céleszköz-relációs lekérdezésIRP-t küld annak a fájlleíróhoz társított eszközobjektumnak, amelyen az illesztőprogram I/O-t hajt végre.

IRP- küldése

Az illesztőprogramok nem küldhetnek IRP_MN_QUERY_DEVICE_RELATIONSBusRelationsigényléséhez. Az illesztőprogramok nem korlátozódnak arra, hogy ezt az IRP-t elküldje RemovalRelations vagy EjectionRelations, de nem valószínű, hogy egy illesztőprogram ezt tenné.

Az illesztőprogramok lekérdezhetik TargetDeviceRelationeszközveremét. Az integrációs modulokkal kapcsolatos információkért lásd INTEGRÁCIÓS kezelésével kapcsolatos információkat. A következő lépések kifejezetten erre az IRP-re vonatkoznak:

  • Állítsa be az értékeket az IRP következő I/O-veremhelyén: állítsa MajorFunctionIRP_MJ_PNPértékre, állítsa MinorFunctionIRP_MN_QUERY_DEVICE_RELATIONSértékre, állítsa be paramétereket A.QueryDeviceRelations.TypeTargetDeviceRelation, és állítsa Irp->FileObject egy érvényes fájlobjektumra.

  • Inicializálja IoStatus.Status STATUS_NOT_SUPPORTED.

Ha egy illesztőprogram azért küldte el ezt az IRP-t, hogy a TargetDeviceRelationIRP_MN_QUERY_DEVICE_RELATIONS válaszul jelentse az oem-et, akkor az illesztőprogram jelenti az oem-et, és felszabadítja a visszaadott kapcsolatok struktúráját az IRP befejezésekor. Ha egy illesztőprogram más okból kezdeményezte ezt az IRP-t, az illesztőprogram felszabadítja a kapcsolati struktúrát, amikor az IRP befejezi és elhalasztja az oem-et, amikor már nincs rá szükség.

Követelmények

Fejléc

Wdm.h (wdm.h, Ntddk.h vagy Ntifs.h)

Lásd még

AddDevice

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