IRP_MN_QUERY_DEVICE_RELATIONS

PnP-chefen skickar den här begäran för att fastställa vissa relationer mellan enheter. Följande typer av drivrutiner hanterar den här begäran:

  • Busschaufförer måste hantera BusRelations begäranden för sitt kort eller sin styrenhet (buss-FDO). Filterdrivrutiner kan hantera BusRelations- begäranden.

  • Busschaufförer måste hantera TargetDeviceRelation begäranden för sina underordnade enheter (underordnade PDOs).

  • Funktions- och filterdrivrutiner kan hantera RemovalRelations och PowerRelations begäranden.

  • Busschaufförer kan hantera EjectionRelations begäranden för sina underordnade enheter (underordnade PDOs).

Värde

0x07

Huvudkod

IRP_MJ_PNP

När det skickas

PnP-hanteraren skickar denna IRP för att samla in information om enheter med en relation till den angivna enheten.

PnP-hanteraren frågar en enhets BusRelations (underordnade enheter) när enheten räknas upp och vid andra tillfällen medan enheten är aktiv, till exempel när en drivrutin anropar IoInvalidateDeviceRelations rutin för att indikera att en underordnad enhet har anlänt eller avgått.

PnP-hanteraren frågar en enhets RemovalRelations innan den tar bort en enhets drivrutiner. PnP-hanteraren frågar efter RemovalRelations och EjectionRelations innan en enhet matas ut.

PnP-hanteraren frågar en enhets TargetDeviceRelation när en drivrutin eller ett program i användarläge registrerar sig för PnP-meddelande om en EventCategoryTargetDeviceChange- på enheten. PnP-hanteraren frågar efter den enhet som är associerad med ett visst filobjekt. IRP_MN_QUERY_DEVICE_RELATIONS är den enda PnP IRP som har en giltig filobjektparameter. En drivrutin kan köra frågor mot en enhetsstack för TargetDeviceRelation. En drivrutin behöver inte ange ett filobjekt när TargetDeviceRelation fråga skickas.

PnP-hanteraren frågar en enhets PowerRelations när drivrutinen för enheten anropar IoInvalidateDeviceRelations för att ange att uppsättningen enheter som enheten har en implicit energisparrelation med har ändrats. PowerRelations-begäranden stöds från och med Windows 7.

För BusRelations, RemovalRelations, EjectionRelationsoch PowerRelations-begäranden skickar PnP-chefen IRP_MN_QUERY_DEVICE_RELATIONS på IRQL = PASSIVE_LEVEL i kontexten för en systemtråd.

För TargetDeviceRelation--begäranden skickar PnP-chefen denna IRP på IRQL = PASSIVE_LEVEL i en godtycklig trådkontext.

Indataparametrar

Parameters.QueryDeviceRelations.Type medlem i IO_STACK_LOCATION-strukturen anger vilken typ av relationer som efterfrågas. Möjliga värden är BusRelations, EjectionRelations, RemovalRelations, TargetDeviceRelationoch PowerRelations.

FileObject medlem i den aktuella IO_STACK_LOCATION-strukturen pekar endast på ett giltigt filobjekt om Parameters.QueryDeviceRelations.Type är TargetDeviceRelation.

Utdataparametrar

Returneras i I/O-statusblocket.

I/O-statusblock

En drivrutin anger Irp–>IoStatus.Status till STATUS_SUCCESS eller felstatus, till exempel STATUS_INSUFFICIENT_RESOURCES.

Vid lyckat resultat anger en drivrutin Irp–>IoStatus.Information till en PDEVICE_RELATIONS pekare som pekar på den begärda relationsinformationen. Den DEVICE_RELATIONS strukturen definieras på följande sätt:

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

Verksamhet

Om en drivrutin returnerar relationer som svar på den här IRP_MN_QUERY_DEVICE_RELATIONSallokerar drivrutinen en DEVICE_RELATIONS struktur från det sidiga minnet som innehåller ett antal och lämpligt antal pekare för enhetsobjekt. PnP-chefen frigör strukturen när den inte längre behövs. Om en drivrutin ersätter en DEVICE_RELATIONS struktur som en annan drivrutin allokerade, måste drivrutinen frigöra den tidigare strukturen.

En drivrutin måste referera till PDO för alla enheter som den rapporterar i denna IRP (ObReferenceObject). PnP-hanteraren tar bort referensen när det är lämpligt.

En funktions- eller filterdrivrutin bör vara beredd att hantera denna IRP för en enhet när som helst efter att dess AddDevice- rutin har slutförts för enheten. Bussdrivrutiner bör vara beredda att hantera en fråga för BusRelations omedelbart efter att en enhet har räknats upp.

Allmänna regler för hantering av Plug and Play-mindre IP-adresser se Plug and Play-.

Följande underavsnitt beskriver de specifika åtgärderna för att hantera de olika frågorna.

BusRelations-begäran

När PnP-hanteraren frågar efter bussrelationer (underordnade enheter) för ett kort eller en styrenhet måste busschauffören returnera en lista med pekare till PDO:erna för alla enheter som fysiskt finns på bussen. Busschauffören rapporterar alla enheter, oavsett om de har startats. Busschauffören kan behöva starta sin bussenhet för att avgöra vilka underordnade som finns.

Varning Ett enhetsobjekt kan inte skickas till någon rutin som tar en PDO som argument förrän PnP-hanteraren skapar en enhetsnod (devnode) för objektet. (Om drivrutinen skickar ett enhetsobjekt felsöks systemet med Felkontroll 0xCA: PNP_DETECTED_FATAL_ERROR.) PnP-chefen skapar devnode som svar på IRP_MN_QUERY_DEVICE_RELATIONS begäran. Drivrutinen kan på ett säkert sätt anta att PDO:ens devnode har skapats när den tar emot en IRP_MN_QUERY_RESOURCE_REQUIREMENTS begäran.

Busschauffören som svarar på denna IRP är funktionsdrivrutinen för busskortet eller styrenheten, inte den överordnade busschauffören för den buss som adaptern eller styrenheten är ansluten till. Funktionsdrivrutiner för icke-bus-enheter hanterar inte den här frågan. Sådana drivrutiner skickar bara IRP till nästa lägre drivrutin. (Se följande bild.) Filterdrivrutiner hanterar vanligtvis inte den här frågan.

I Windows Vista och senare operativsystem rekommenderar vi att drivrutinerna alltid använder IRP_MN_QUERY_DEVICE_RELATIONS IRP och slutför bearbetningen senare. Med den här ordningen kan systemet bearbeta bussrelationsfrågor asynkront. (På operativsystem före Windows Vista kan drivrutinerna på ett säkert sätt returnera STATUS_PENDING från sina sändningsrutiner, men PnP-chefen överlappar inte bussrelationsfrågan med någon annan åtgärd.)

Följande diagram visar hur drivrutiner hanterar en fråga för bussrelationer.

diagram som illustrerar drivrutiner som hanterar en fråga för bussrelationer.

I exemplet som visas i bilden skickar PnP-chefen en IRP_MN_QUERY_DEVICE_RELATIONS för BusRelations till drivrutinerna för USB-hubben. PnP-chefen begär en lista över hubbenhetens underordnade.

  1. Precis som med alla PnP-IP-adresser skickar PnP-hanteraren IRP till den översta drivrutinen i enhetsstacken för enheten.

  2. En valfri filterdrivrutin kan vara den främsta drivrutinen i stacken. En filterdrivrutin hanterar vanligtvis inte denna IRP. den skickar IRP ned i stacken. En filterdrivrutin kan till exempel hantera denna IRP om drivrutinen exponerar en icke-uppräkningsbar enhet på bussen.

  3. USB Hub-bussdrivrutinen hanterar IRP.

    USB Hub-bussdrivrutinen:

    • Skapar en PDO för alla underordnade enheter som inte redan har en.

    • Markerar den inaktiva PDO:n för alla enheter som inte längre finns på bussen. Bussdrivrutinen tar inte bort sådana PDOs.Mer information om när du ska ta bort PDOs finns i Ta bort en enhet.

    • Rapporterar alla underordnade enheter som finns på bussen.

      För varje underordnad enhet refererar busschauffören till PDO:n och pekar på PDO:n i DEVICE_RELATIONS struktur.

      Det finns två PDF-filer i det här exemplet: en för joystick-enheten och en för tangentbordsenheten.

      Bussdrivrutinen bör kontrollera om en annan drivrutin redan har skapat en DEVICE_RELATIONS struktur för denna IRP. I så fall måste busschauffören lägga till den befintliga informationen.

      Om det inte finns någon underordnad enhet på bussen anger drivrutinen antalet till noll i DEVICE_RELATIONS struktur och returnerar framgång.

    • Anger lämpliga värden i I/O-statusblocket och skickar IRP till nästa lägre drivrutin. Bussdrivrutinen för adaptern eller styrenheten slutför inte IRP.

  4. Ett valfritt lägre filter, om det finns, hanterar vanligtvis inte denna IRP. En sådan filterdrivrutin skickar IRP nedåt i stacken. Om en drivrutin med lägre filter hanterar den här IRP:n kan den lägga till PDO:er i listan över underordnade enheter, men den får inte ta bort några PDOs som skapats av andra drivrutiner.

  5. Den överordnade bussdrivrutinen hanterar inte denna IRP, såvida det inte är den enda drivrutinen i enhetsstacken (enheten är i raw-läge). Precis som med alla PnP-IRP:er slutför den överordnade busschauffören IRP med IoCompleteRequest.

    Om det finns en eller flera bussfilterdrivrutiner i enhetsstacken kan sådana drivrutiner hantera IRP på väg ner till busschauffören och/eller på IRP:ns väg säkerhetskopiera enhetsstacken (om det finns IoCompletion- rutiner). Enligt PnP IRP-reglerna kan en sådan drivrutin lägga till PDOs i IRP på väg nedåt i stacken och/eller ändra relationslistan på IRP:s sätt att säkerhetskopiera stacken (i IoCompletion rutiner).

EjectionRelations Request

En drivrutin returnerar pekare till PDOs för alla enheter som kan tas bort fysiskt från systemet när den angivna enheten matas ut. Rapportera inte PDOs för underordnade enheter på enheten. PnP-hanteraren begär alltid att underordnade enheter tas bort före den överordnade enheten.

PnP-hanteraren skickar en IRP_MN_EJECT IRP till en enhet som matas ut. Drivrutinen för en sådan enhet får också en ta bort IRP. Enhetens utmatningsrelationer tar emot en IRP_MN_REMOVE_DEVICE IRP (inte en IRP_MN_EJECT IRP).

Endast en överordnad busschaufför kan svara på en EjectionRelations fråga för en av dess underordnade enheter. Funktions- och filterdrivrutiner måste skicka den till nästa lägre drivrutin i enhetsstacken. Om en busschaufför tar emot denna IRP som funktionsdrivrutin för sitt kort eller sin styrenhet utför bussdrivrutinen uppgifter för en funktionsdrivrutin och måste skicka IRP till nästa lägre drivrutin.

PowerRelations-begäran

Från och med Windows 7 gör frågan PowerRelations att en drivrutin kan ange en energisparrelation utanför den konventionella relationen mellan en överordnad buss som stöder PnP-uppräkning och en uppräknad underordnad enhet på bussen. Om en busschaufför till exempel inte kan räkna upp en underordnad enhet på bussen, eller om en enhet är underordnad fler än en buss, kan PowerRelations- fråga beskriva den underordnade enhetens kraftrelationer med bussen eller bussarna.

PnP-hanteraren utfärdar en PowerRelations- fråga efter en enhet när drivrutinen för enheten anropar rutinen IoInvalidateDeviceRelations och anger ett type parametervärde för PowerRelations.

Som svar på den här frågan tillhandahåller drivrutinen för målenheten (dvs. den enhet som är målet för frågan) en DEVICE_RELATIONS struktur som innehåller pekare till PDOs för andra enheter som måste aktiveras av power manager innan målenheten aktiveras. Dessa andra enheter måste däremot stängas av först när målenheten har inaktiverats. Power Manager använder informationen från frågan för att garantera att enheterna är aktiverade och inaktiverade i rätt ordning.

Den här ordningsgarantin gäller endast för övergångar i det globala systemets viloläge, som omfattar övergångar till och från systemkraftstillståndet S1, S2, S3 (viloläge), S4 (viloläge) och S5 (avstängning). Den PowerRelations- beställningsgarantin gäller inte för övergångar av Dx-enhetens energitillstånd medan systemet finns kvar i systemtillståndet S0 (körs), förutom vid DFx (Directed Runtime Power Management) övergångar.

Om målenheten finns på enhetssökvägen för en särskild fil (till exempel växlingsfilen, vilolägesfilen eller kraschdumpfilen) måste drivrutinen för målenheten utföra ytterligare ett steg när den hanterar en IRP_MN_DEVICE_USAGE_NOTIFICATION IRP där InPath- är TRUE. Den här drivrutinen måste se till att de enheter vars PDO:er tillhandahålls för PowerRelations fråga också kan ha stöd för att vara i enhetssökvägen för specialfilen. För att bekräfta det här stödet måste drivrutinen för målenheten först skicka IRP_MN_DEVICE_USAGE_NOTIFICATION IRP till var och en av dessa enheter, och denna IRP måste ange samma UsageNotification.Type som målenheten. Endast om alla enheter som tar emot den här IRP:n slutför IRP med statuskoden lyckades kan drivrutinen för målenheten slutföra sin IRP_MN_DEVICE_USAGE_NOTIFICATION IRP. Annars måste den här drivrutinen slutföra denna IRP med en felstatuskod.

När samma drivrutin hanterar en IRP_MN_DEVICE_USAGE_NOTIFICATION IRP som InPath- är FALSEmåste drivrutinen skicka IRP_MN_DEVICE_USAGE_NOTIFICATION IRP till samma uppsättning beroende enheter som för det fall då InPath-TRUE-. Drivrutinen bör dock aldrig slutföra denna IRP med en felstatuskod när InPath- är FALSE.

Drivrutinen som svarar på PowerRelations- fråga bör registrera sig för meddelanden om enhetsändring på alla enheter vars PDO:er har angetts för PowerRelations- fråga. Om du vill registrera dig för dessa meddelanden kan drivrutinen anropa IoRegisterPlugPlayNotification rutin och ange ett EventCategory parametervärde för EventCategoryTargetDeviceChange.

RemovalRelations Request

En drivrutin returnerar pekare till PDOs för alla enheter vars drivrutiner måste tas bort när drivrutinerna för den angivna enheten tas bort. Rapportera inte PDOs för underordnade enheter på enheten. PnP-hanteraren begär redan att underordnade enheter tas bort innan en enhet tas bort.

Ordningen i vilken borttagningsrelationer tas bort är odefinierad.

Alla drivrutiner i enhetsstacken kan hantera den här typen av relationsfråga. En funktion eller filterdrivrutin hanterar IRP innan den skickas till nästa lägre drivrutin. En busschaufför hanterar IRP och slutför den sedan.

TargetDeviceRelation-begäran

Med frågan TargetDeviceRelation kan PnP-hanteraren köra frågor mot en icke-PnP-enhetsstack för PDO:n i PnP-enhetsstacken som styr maskinvaran.

I allmänhet vidarebefordrar drivrutinerna IRP_MN_QUERY_DEVICE_RELATIONS IRP ned sin stack tills IRP når botten av en viss enhetsstacken. En drivrutin längst ned i en icke-PnP-stack vidarebefordrar eller utfärdar sedan IRP till relevant PnP-stack. PnP-hanteraren kan till exempel skicka en TargetDeviceRelation fråga till enhetsobjektet överst i filsystemstacken, som är en icke-PnP-stack. Varje enhetsobjekt i filsystemsstacken skickar frågan till enhetsobjektet under den tills frågan nådde enhetsobjektet längst ned i stacken. Det lägsta enhetsobjektet i stacken vidarebefordrar eller utfärdar TargetDeviceRelation fråga till enhetsobjektet överst i PnP-lagringsvolymstacken och sedan skickas frågan ned till PDO:n längst ned i lagringsvolymstacken.

I följande lista sammanfattas de situationer där du på ett säkert sätt kan hämta en pekare till PDO:n längst ned i en PnP-enhetsstack:

  • Enhetsobjekt i en PnP

    Ett enhetsobjekt som finns i en PnP-enhetsstack lär sig om stackens PDO när AddDevice- rutin för enheten anropas. Drivrutinen kan cachelagrar pekaren till PDO:en på ett säkert sätt om användningen av pekaren synkroniseras korrekt med inkommande IRP_MN_REMOVE_DEVICE meddelanden med hjälp av borttagningslåsrutinerna.

  • Enhetsobjekt i en icke-PnP-stack, inte längst ned i stacken

    För ett enhetsobjekt som inte finns längst ned i en icke-PnP-stack kan en drivrutin skicka en TargetDeviceRelation fråga för att hämta en pekare till PDO längst ned i motsvarande PnP-enhetsstack.

  • Filobjekt för enheten

    Med ett filobjekt för enheten kan en drivrutin anropa IoGetRelatedDeviceObject för att hämta enhetsobjektet och sedan följa anvisningarna i föregående listobjekt.

  • Hantera till enhetsobjektet

    Med ett handtag till enhetsobjektet kan en drivrutin anropa ObReferenceObjectByHandle för att hämta filobjektet för enheten och sedan följa anvisningarna i föregående listobjekt.

En överordnad bussdrivrutin måste hantera en TargetDeviceRelation relationsfråga för sina underordnade enheter. Bussdrivrutinen refererar till den underordnade enhetens PDO med ObReferenceObject och returnerar en pekare till PDO:n i DEVICE_RELATIONS-strukturen. Det finns bara en PDO-pekare i strukturen för den här relationstypen. PnP-hanteraren tar bort referensen till PDO:n när drivrutinen eller programmet avregistreras för avisering på enheten.

Endast en överordnad busschaufför svarar på en TargetDeviceRelation fråga. Funktions- och filterdrivrutiner måste skicka den till nästa lägre drivrutin i enhetsstacken. Om en busschaufför tar emot denna IRP som funktionsdrivrutin för sitt kort eller sin styrenhet utför bussdrivrutinen uppgifter för en funktionsdrivrutin och måste skicka IRP till nästa lägre drivrutin.

Om en drivrutin inte finns i en PDO-baserad stack skickar drivrutinen en ny målenhetsrelationsfrågas-IRP till det enhetsobjekt som är associerat med filhandtaget där drivrutinen utför I/O.

skickar den här IRP-

Drivrutiner får inte skicka IRP_MN_QUERY_DEVICE_RELATIONS för att begära BusRelations. Drivrutiner är inte begränsade från att skicka denna IRP för RemovalRelations eller EjectionRelations, men det är inte troligt att en drivrutin skulle göra det.

Drivrutiner kan köra frågor mot en enhetsstack för TargetDeviceRelation. Mer information om hur du skickar IP-adresser finns i Hantera IP-adresser. Följande steg gäller specifikt för denna IRP:

  • Ange värdena på nästa I/O-stackplats för IRP: ange MajorFunction till IRP_MJ_PNP, ange MinorFunction till IRP_MN_QUERY_DEVICE_RELATIONS, ange Parameters.QueryDeviceRelations.Type till TargetDeviceRelationoch ange Irp>FileObject till ett giltigt filobjekt.

  • Initiera IoStatus.Status till STATUS_NOT_SUPPORTED.

Om en drivrutin skickade den här IRP:en för att få PDO:en att rapportera som svar på en IRP_MN_QUERY_DEVICE_RELATIONS för TargetDeviceRelation som drivrutinen tog emot, rapporterar drivrutinen PDO:en och frigör den returnerade relationsstrukturen när IRP är klar. Om en drivrutin initierade den här IRP:n av en annan anledning frigör drivrutinen relationsstrukturen när IRP slutförs och avrefereras PDO:n när den inte längre behövs.

Krav

Header

Wdm.h (inklusive Wdm.h, Ntddk.h eller Ntifs.h)

Se även

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