Dela via


IRP_MN_QUERY_ID

Busschaufförer måste hantera begäranden för BusQueryDeviceID för sina underordnade enheter (underordnade PDOs). Busschaufförer kan hantera begäranden för BusQueryHardwareIDs, BusQueryCompatibleIDs och BusQueryInstanceID för sina underordnade enheter.

Från och med Windows 7 måste busschaufförer också hantera begäranden för BusQueryContainerID för sina underordnade PDOs.

Mer information om dessa identifierare (ID:n) finns i Enhetsidentifieringssträngar.

Not: Funktionsdrivrutiner och filterdrivrutiner hanterar inte denna IRP.

Värde

0x13

Huvudkod

IRP_MJ_PNP

När det skickas

PnP-hanteraren skickar denna IRP när en enhet räknas upp. En drivrutin kan skicka denna IRP för att hämta instans-ID:t för en av dess enheter.

PnP-chefen och drivrutinerna skickar denna IRP till IRQL PASSIVE_LEVEL i en godtycklig trådkontext.

Indataparametrar

Parameter.QueryId.IdType-medlemmen i IO_STACK_LOCATION-strukturen anger vilken typ av ID som begärs. Möjliga värden är BusQueryDeviceID, BusQueryHardwareIDs, BusQueryCompatibleIDs, BusQueryInstanceID och BusQueryContainerID. Följande ID-typ är reserverad: BusQueryDeviceSerialNumber.

Utdataparametrar

Returneras i I/O-statusblocket.

I/O-statusblock

En drivrutin anger Irp-IoStatus.Status> till STATUS_SUCCESS eller till en lämplig felstatus.

Vid lyckat resultat anger en drivrutin Irp-IoStatus.Information> till en WCHAR-pekare som pekar på den begärda informationen. Vid fel anger en drivrutin Irp-IoStatus.Information> till noll.

Verksamhet

Om en drivrutin returnerar ID:n som svar på denna IRP allokerar den en WCHAR-struktur från den sidsidiga poolen så att den innehåller ID:n. PnP-chefen frigör strukturen när den inte längre behövs.

En drivrutin returnerar något av följande:

  • En REG_SZ sträng som svar på en BusQueryDeviceID-, BusQueryInstanceID- eller BusQueryContainerID-begäran.

  • En REG_MULTI_SZ sträng som svar på en BusQueryHardwareIDs- eller BusQueryCompatibleIDs-begäran.

Om en drivrutin returnerar ett ID med ett ogiltigt tecken felkontrollerar systemet. Tecken med följande värden är ogiltiga i ett ID för denna IRP:

  • Mindre än eller lika med 0x20 (" ")

  • Större än 0x7F

  • Lika med 0x2C (',')

En drivrutin måste följa följande längdbegränsningar för ID:er:

  • Varje maskinvaru-ID eller kompatibelt ID som en drivrutin returnerar i denna IRP måste vara mindre än MAX_DEVICE_ID_LEN tecken lång. Den här konstanten har för närvarande värdet 200 enligt definitionen i sdk\inc\cfgmgr32.h.

  • Det container-ID som en drivrutin returnerar i denna IRP måste formateras som en globalt unik identifierare (GUID) och måste vara MAX_GUID_STRING_LEN tecken, som innehåller null-avslutningen.

  • Om en busschaufför tillhandahåller globalt unika instans-ID:er för sina underordnade enheter (d.v.s. anger drivrutinen DEVICE_CAPABILITIES. UniqueID för enheterna) måste kombinationen av enhets-ID plus instans-ID vara mindre än (MAX_DEVICE_ID_LEN – 1) tecken. Operativsystemet kräver ytterligare tecken för en sökvägsavgränsare.

  • Om en bussdrivrutin inte tillhandahåller globalt unika instans-ID:n för sina underordnade enheter måste kombinationen av enhets-ID plus instans-ID vara mindre än (MAX_DEVICE_ID_LEN – 28). Värdet för den här ekvationen är för närvarande 172.

Busschaufförer bör vara beredda att hantera denna IRP för en underordnad enhet omedelbart efter att enheten har räknats upp.

Ange BusQueryDeviceID och BusQueryInstanceID

Värdena som en busschaufför tillhandahåller för BusQueryDeviceID och BusQueryInstanceID gör det möjligt för operativsystemet att skilja en enhet från andra enheter på datorn. Operativsystemet använder enhets-ID och instans-ID som returneras i IRP_MN_QUERY_ID IRP och det unika ID-fältet som returneras i IRP_MN_QUERY_CAPABILITIES IRP för att hitta registerinformation för enheten.

För BusQueryDeviceID tillhandahåller en busschaufför enhetens enhets-ID. Ett enhets-ID bör innehålla den mest specifika beskrivningen av enheten som är möjlig, med namnet på uppräknaren och strängar som identifierar tillverkaren, enheten, revisionen, paketeraren och den paketerade produkten, där det är möjligt. PCI-bussdrivrutinen svarar till exempel med enhets-ID:n i formuläret PCI\VEN_xxxx&DEV_xxxx&SUBSYS_xxxxxxxx&REV_xx och kodar alla fem objekten som nämns ovan. Ett enhets-ID bör dock inte innehålla tillräckligt med information för att skilja mellan två identiska enheter. Den här informationen bör kodas i instans-ID:t.

För BusQueryInstanceID ska en bussdrivrutin ange en sträng som innehåller enhetens instans-ID . Windows- och bussdrivrutiner använder instans-ID:t med annan information för att skilja mellan två identiska enheter på datorn. Instans-ID:t är antingen unikt på hela datorn eller bara unikt på enhetens överordnade buss.

Om ett instans-ID bara är unikt på bussen anger bussdrivrutinen strängen för BusQueryInstanceID, men anger även ett UniqueID-värde för FALSE som svar på en IRP_MN_QUERY_CAPABILITIES begäran för enheten. Om UniqueID är FALSE förbättrar PnP-hanteraren instans-ID:t genom att lägga till information om enhetens överordnade och därmed göra ID:t unikt på datorn. I det här fallet bör busschauffören inte vidta extra åtgärder för att göra sina enheters instans-ID globalt unika. returnerar bara lämplig information om funktionerna och operativsystemet tar hand om den.

Om en busschaufför kan ange ett globalt unikt ID för varje underordnad enhet, till exempel ett serienummer, anger busschauffören dessa strängar för BusQueryInstanceID och anger ett UniqueID-värde för TRUE som svar på en IRP_MN_QUERY_CAPABILITIES begäran för varje enhet.

Ange BusQueryHardware-ID:ar och BusQueryCompatibleIDs

Värdena som en busschaufför tillhandahåller för BusQueryHardwareIDs och BusQueryCompatibleIDs gör att Windows kan hitta lämpliga drivrutiner för bussens underordnade enhet.

En busschaufför svarar på var och en av dessa begäranden med en REG_MULTI_SZ lista över ID:n som beskriver enheten. Den maximala längden i tecken för en lista med ID:er, inklusive de två NULL-tecken som avslutar listan, är REGSTR_VAL_MAX_HCID_LEN.

När du returnerar mer än ett maskinvaru-ID och/eller mer än ett kompatibelt ID bör en busschaufför ange ID:n i den ordning som är mest specifik för de mest allmänna för att underlätta valet av den bästa drivrutinsmatchningen för enheten. Den första posten i listan över maskinvaru-ID:n är den mest specifika beskrivningen av enheten och är därför vanligtvis identisk med enhets-ID:t.

Windows kontrollerar ID:erna mot de ID:er som anges i INF-filer för möjliga matchningar. Windows söker först igenom listan över maskinvaru-ID:t och sedan listan över kompatibla ID:er. Tidigare poster behandlas som mer specifika beskrivningar av enheten och senare poster som mer allmänna (och därmed mindre optimala) matchningar för enheten. Om ingen matchning hittas i listan över maskinvaru-ID:n kan Windows fråga användaren om installationsmedia innan de går vidare till listan över kompatibla ID:n.

Se Plug and Play för de allmänna reglerna för hantering av Plug and Play-mindre IP-adresser.

Ange BusQueryContainerID:ar

Från och med Windows 7 ska en busschaufför ange en sträng för BusQueryContainerID som innehåller container-ID :t för enheten. Med container-ID:t kan operativsystemet gruppera alla funktionella enheter från en enda flyttbar fysisk enhet. Till exempel har alla funktionella enheter från en flyttbar multifunktionsenhet samma container-ID. Mer information om hur du rapporterar container-ID:n i särskilda fall, till exempel en volymenhet som kan sträcka sig över flera diskar i flera containrar men som inte tillhör någon container, finns i Översikt över container-ID:n.

En flyttbar fysisk enhet definieras som en underordnad enhet som bussdrivrutinen anger en flyttbar funktion för TRUE som svar på en IRP_MN_QUERY_CAPABILITIES begäran. Mer information om flyttbara värden finns i DEVICE_CAPABILITIES.

Busschauffören skapar ett container-ID baserat på ett bussspecifikt unikt ID som enheten tillhandahåller. Mer information finns i Så här genereras container-ID:t.

Drivrutinen måste misslyckas med IRP-begäran och ange IoStatus.Status till STATUS_NOT_SUPPORTED om något av följande är sant:

  • Enheten stöder inte ett bussspecifikt unikt ID som bussdrivrutinen kan använda för att generera ett container-ID.

  • Bussdrivrutinen hade tidigare angett en flyttbar funktion för FALSE som svar på en IRP_MN_QUERY_CAPABILITIES begäran för enheten.

skickar den här IRP-

Vanligtvis skickar endast PnP-chefen denna IRP.

Om du vill hämta maskinvaru-ID:n eller kompatibla ID:n för en enhet anropar du IoGetDeviceProperty i stället för att skicka denna IRP.

En drivrutin kan skicka denna IRP för att hämta instans-ID:t för en av dess enheter. Tänk dig till exempel en PnP ISA-enhet med flera funktioner vars funktioner inte fungerar oberoende av varandra. PnP-hanteraren räknar upp funktionerna som separata enheter, men drivrutinen för en sådan enhet kan krävas för att associera en eller flera av funktionerna. Eftersom PnP ISA garanterar ett unikt instans-ID kan drivrutinen för en sådan multifunktionsenhet använda instans-ID:n för att hitta funktioner som finns på samma enhet. Drivrutinen för en sådan enhet måste också hämta enhetens uppräkningsnamn genom att anropa IoGetDeviceProperty för att bekräfta att enheten är en PnP ISA-enhet.

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_ID och ange Parameters.QueryId.IdType till BusQueryInstanceID.

  • Ange IoStatus.Status till STATUS_NOT_SUPPORTED.

Förutom att skicka fråge-ID IRP måste drivrutinen anropa IoGetDeviceProperty för att hämta DevicePropertyEnumeratorName för enheten.

När IRP har slutförts och drivrutinen har slutförts med ID:t måste drivrutinen frigöra den ID-struktur som returneras av de drivrutiner som hanterade frågans IRP.

Kravspecifikation

Rubrik

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

Se även

Enhetsidentifieringssträngar

IoGetDeviceProperty