Een PnP-apparaat toevoegen aan een actief systeem
In deze sectie wordt de volgorde beschreven van gebeurtenissen die optreden wanneer het systeem een PnP-apparaat configureert dat een gebruiker heeft toegevoegd aan een actieve machine. In deze discussie worden de rollen van de PnP-manager, busstuurprogramma's en functie- en filterdrivers uitgelicht bij het inventariseren en configureren van een nieuw apparaat.
De meeste van deze discussie is ook relevant voor het configureren van een PnP-apparaat dat aanwezig is wanneer de computer wordt opgestart. Apparaten waarvan de stuurprogramma's zijn gemarkeerd als SERVICE_DEMAND_START in een INF-bestand, worden in wezen op dezelfde manier geconfigureerd als het apparaat dynamisch wordt toegevoegd of aanwezig is tijdens het opstarten.
In de volgende afbeelding ziet u de eerste stappen voor het configureren van het apparaat, te beginnen vanaf het moment dat de gebruiker de hardware op de computer aansluit.
De volgende opmerkingen komen overeen met de cirkelnummers in de vorige afbeelding:
Een gebruiker sluit een PnP-apparaat aan op een gratis sleuf op een PnP-bus.
In dit voorbeeld sluit de gebruiker een PnP USB-joystick aan op de hub op een USB-hostcontroller. De USB-hub is een PnP-busapparaat omdat randapparatuur kan worden verbonden.
Het functiestuurprogramma voor het busapparaat bepaalt dat een nieuw apparaat zich in de bus bevindt.
Hoe het stuurprogramma dit bepaalt, is afhankelijk van de busarchitectuur. Voor sommige bussen ontvangt de busfunctiechauffeur melding van nieuwe apparaten. Als de bus geen melding van hot-plug ondersteunt, moet de gebruiker de juiste actie ondernemen in het Configuratiescherm om ervoor te zorgen dat de bus wordt geënumereerd.
In dit voorbeeld ondersteunt de USB-bus hot-plugmelding, zodat het functiestuurprogramma voor de USB-bus wordt gewaarschuwd dat de kinderen zijn gewijzigd.
Het functiestuurprogramma voor het busapparaat meldt aan de PnP-manager dat de groep van verbonden apparaten is gewijzigd.
Het functiestuurprogramma brengt de PnP-manager op de hoogte door IoInvalidateDeviceRelations aan te roepen met een Type van BusRelations.
De PnP-manager vraagt de busstuurprogramma’s op naar de huidige lijst met apparaten op de bus.
De PnP-manager verzendt een IRP_MN_QUERY_DEVICE_RELATIONS aanvraag naar de apparaatstack voor de bus. De waarde Parameters.QueryDeviceRelations.Type is BusRelations, waarmee wordt aangegeven dat de PnP-manager vraagt om de huidige lijst met apparaten die aanwezig zijn op de bus (busrelaties).
De PnP-manager stuurt de IRP naar het bovenste stuurprogramma in de apparaatstack voor de bus. Volgens de regels voor PnP IRPs verwerkt elk stuurprogramma in de stack de IRP, indien van toepassing, en geeft de IRP door aan het volgende stuurprogramma.
Het functiestuurprogramma voor het busapparaat verwerkt de IRP.
Zie de referentiepagina voor IRP_MN_QUERY_DEVICE_RELATIONS voor gedetailleerde informatie over het verwerken van deze IRP.
In dit voorbeeld verwerkt het USB-hubstuurprogramma deze IRP voor de hub FDO-. Het hubstuurprogramma maakt een PDO- voor het joystickapparaat en neemt een verwijzende pointer naar de joystick PDO op in de lijst van onderliggende apparaten die met het IRP worden geretourneerd.
Wanneer het bovenliggende busstuurprogramma van de USB-hub (het stuurprogrammapaar van de USB-hostcontrollerklasse/miniklasse) de IRP voltooit, reist de IRP terug omhoog door de apparaatstack via IoCompletion-routines zoals , geregistreerd door de hubstuurprogramma's.
Houd er rekening mee dat het busfunctiestuurprogramma een wijziging in zijn lijst van onderliggende apparaten aangeeft door de PnP-manager te verzoeken navraag te doen naar zijn lijst van onderliggende apparaten. De resulterende IRP_MN_QUERY_DEVICE_RELATIONS aanvraag wordt waargenomen door alle drivers voor de busapparatuur. Normaal gesproken is het busfunctiestuurprogramma het enige stuurprogramma voor het verwerken van de IRP en het rapporteren van kinderen. In sommige apparaatstacks is er een busfilterdriver aanwezig die betrokken is bij het samenstellen van de lijst met busrelaties. Een voorbeeld is ACPI, dat als busfilterstuurprogramma wordt gekoppeld voor ACPI-apparaten. In sommige stacks van apparaten verwerken niet-busfilterstuurprogramma's de IRP_MN_QUERY_DEVICE_RELATIONS-aanvraag, maar dit is niet gebruikelijk.
Op dit moment heeft de PnP-manager de huidige lijst met apparaten in de bus. De PnP-manager bepaalt vervolgens of apparaten nieuw zijn aangekomen of zijn verwijderd. In dit voorbeeld is er één nieuw apparaat. In de volgende afbeelding ziet u de PnP-manager die een devnode voor het nieuwe apparaat maakt en het apparaat begint te configureren.
De volgende opmerkingen komen overeen met de cirkelnummers in de vorige afbeelding:
De PnP-manager maakt devnodes voor nieuwe kindapparaten op de bus.
De PnP-manager vergelijkt de lijst met busrelaties die in de IRP_MN_QUERY_DEVICE_RELATIONS IRP zijn geretourneerd met de lijst met kinderen van de bus die momenteel is vastgelegd in de PnP-apparaathierarchie. De PnP-manager maakt een devnode voor elk nieuw apparaat en initieert verwijderingsverwerking voor alle apparaten die zijn verwijderd.
In dit voorbeeld is er één nieuw apparaat (een joystick), dus de PnP-manager maakt een devnode voor de joystick. Op dit moment is het enige stuurprogramma dat is geconfigureerd voor de joystick het bovenliggende USB-hub busstuurprogramma, dat de PDO van de joystick heeft gemaakt. Eventuele optionele busfilterstuurprogramma's zouden ook aanwezig zijn in de apparaatstack, maar in het voorbeeld worden busfilterstuurprogramma's weggelaten om het eenvoudig te maken.
De brede pijl tussen de twee devnodes in de vorige afbeelding geeft aan dat de stick devnode een onderliggend element is van de USB-hub devnode.
De PnP-manager verzamelt informatie over het nieuwe apparaat en begint met het configureren van het apparaat.
De PnP-manager verzendt een reeks IRP's naar de apparaatstack om informatie van het apparaat te verzamelen. Op dit moment bestaat de apparaatstack alleen uit de PDO die gemaakt is door het bovenliggende busstuurprogramma van het apparaat en filter-DO's voor eventuele optionele busfilterstuurprogramma's. Daarom zijn de buschauffeurs en busfilterstuurprogramma's de enige stuurprogramma's die reageren op deze IRP's. In dit voorbeeld is het enige stuurprogramma in de joystick-apparaatstack het bovenliggende busstuurprogramma, het USB-hubstuurprogramma.
De PnP-manager verzamelt informatie over een nieuw apparaat door IRP's naar de apparaatstack te verzenden. Deze IRP's omvatten het volgende:
IRP_MN_QUERY_ID, een afzonderlijke IRP voor elk van de volgende typen hardware-id's:
BusQueryDeviceID
BusQueryInstanceID
BusQueryHardwareIDs
BusQueryCompatibleIDs
BusQueryContainerID
IRP_MN_QUERY_DEVICE_TEXT, een afzonderlijk IRP voor elk van de volgende items:
DeviceTextDescription
DeviceTextLocationInformation
De PnP-manager verzendt de hierboven vermelde IR's in deze fase van het verwerken van een nieuw PnP-apparaat, maar niet noodzakelijkerwijs in de vermelde volgorde, dus u moet geen veronderstellingen maken over de volgorde waarin de IR's worden verzonden. U moet er ook niet van uitgaan dat de PnP-manager alleen de hierboven vermelde IR's verzendt.
De PnP-beheer controleert het register om te bepalen of het apparaat eerder op deze computer is geïnstalleerd. De PnP-manager controleert op een <enumerator>\<deviceID> subsleutel voor het apparaat onder de Enum branch. In dit voorbeeld is het apparaat nieuw en moet het volledig opnieuw worden geconfigureerd.
De PnP-manager slaat informatie op over het apparaat in het register.
De Enum-vertakking van het register is gereserveerd voor gebruik door onderdelen van het besturingssysteem en de indeling ervan kan worden gewijzigd. Schrijvers van stuurprogramma's moeten systeemroutines gebruiken om informatie met betrekking tot stuurprogramma's te verkrijgen. Open de Enum-vertakking niet rechtstreeks vanuit een stuurprogramma. De volgende Enum informatie wordt alleen vermeld voor foutopsporingsdoeleinden.
De PnP-manager maakt een subsleutel voor het apparaat onder de sleutel voor de enumerator van het apparaat.
De PnP-manager maakt een subsleutel met de naam HKLM\System\CurrentControlSet\Enum\<enumerator>\<deviceID>. Hiermee maakt u de <enumerator> subsleutel als deze nog niet bestaat.
Een enumerator- is een onderdeel dat PnP-apparaten detecteert op basis van een PnP-hardwarestandaard. De taken van een enumerator worden uitgevoerd door een PnP-buschauffeur in samenwerking met de PnP-manager. Een apparaat wordt doorgaans opgesomd door de hoofd-busdriver, zoals PCI of PCMCIA. Sommige apparaten worden opgesomd door een busfilterstuurprogramma, zoals ACPI.
De PnP-manager maakt een subsleutel voor dit exemplaar van het apparaat.
Als Capabilities.UniqueID- wordt geretourneerd als TRUE- voor IRP_MN_QUERY_CAPABILITIES, is de unieke id van het apparaat uniek in het systeem. Zo niet, wijzigt de PnP-manager de id zodat deze uniek is voor het hele systeem.
De PnP-manager maakt een subsleutel met de naam HKLM\System\CurrentControlSet\Enum\<enumerator>\<deviceID>\<instanceID>.
De PnP-manager schrijft informatie over het apparaat naar de subsleutel voor het apparaatexemplaar.
De PnP-manager slaat informatie op, waaronder het volgende, als deze is opgegeven voor het apparaat:
DeviceDesc- - uit IRP_MN_QUERY_DEVICE_TEXT
Locatie — uit IRP_MN_QUERY_DEVICE_TEXT
Capabilities — de vlaggen van IRP_MN_QUERY_CAPABILITIES
UINumber — uit IRP_MN_QUERY_CAPABILITIES
HardwareID- — uit IRP_MN_QUERY_ID
Compatibele id's — uit IRP_MN_QUERY_ID
ContainerID- — uit IRP_MN_QUERY_ID
LogConf\BootConfig — vanuit IRP_MN_QUERY_RESOURCES
LogConf\BasicConfigVector — uit IRP_MN_QUERY_RESOURCE_REQUIREMENTS
Op dit moment is de PnP-manager klaar om het functiestuurprogramma te vinden en stuurprogramma's voor het apparaat te filteren, indien van toepassing. (Zie de volgende afbeelding.)
De volgende opmerkingen komen overeen met de genummerde cirkels in de vorige afbeelding:
De kernelmodus PnP-beheerder coördineert met de gebruikersmodus PnP-beheerder en installatiecomponenten van de gebruikersmodus om de functie- en filterstuurprogramma's voor het apparaat te vinden, indien aanwezig.
PnP-beheer in de kernelmodus zet een gebeurtenis in de wachtrij voor PnP-beheer in de gebruikersmodus, waarbij een apparaat wordt geïdentificeerd dat moet worden geïnstalleerd. Zodra een bevoegde gebruiker zich aanmeldt, gaan de onderdelen van de gebruikersmodus verder met het vinden van stuurprogramma's. Zie het overzicht apparaatinstallatie Voor informatie over installatieonderdelen en hun rol bij het installeren van een apparaat.
De installatieonderdelen van de gebruikersmodus sturen de PnP-beheerder van de kernelmodus aan om de functie- en filterstuurprogramma's te laden.
De onderdelen van de gebruikersmodus roepen terug naar de kernelmodus om de stuurprogramma's geladen te krijgen, waardoor hun AddDevice- routines worden aangeroepen.
In de volgende afbeelding ziet u de PnP-manager die de stuurprogramma's laadt (indien van toepassing), het aanroepen van hun AddDevice routines en het doorsturen van de stuurprogramma's om het apparaat te starten.
De volgende opmerkingen komen overeen met de genummerde cirkels in de vorige afbeelding:
Stuurprogramma's voor lager filter
Voordat het functiestuurprogramma aan de apparaatstack wordt gekoppeld, verwerkt de PnP-manager eventuele stuurprogramma's met een lager filter. Voor elk stuurprogramma met een lager filter roept de PnP-manager de DriverEntry- routine aan als het stuurprogramma nog niet is geladen. Vervolgens roept de PnP-manager de AddDevice- routine van het stuurprogramma aan. In de routine AddDevice maakt het filterstuurprogramma een filterapparaatobject (filter DO) en koppelt het aan de apparaatstack (IoAttachDeviceToDeviceStack). Zodra het apparaatobject aan de apparaatstack is gekoppeld, wordt het stuurprogramma ingeschakeld als een stuurprogramma voor het apparaat.
In het USB-stickvoorbeeld is er één lager filterstuurprogramma voor het apparaat.
Functiestuurprogramma
Nadat er lagere filters zijn gekoppeld, verwerkt de PnP-manager het functiestuurprogramma. De PnP-manager roept de DriverEntry- routine van het functiestuurprogramma aan als het stuurprogramma nog niet is geladen en roept de AddDevice- routine van het functiestuurprogramma aan. Het functiestuurprogramma maakt een functieapparaatobject (FDO) en koppelt het aan de apparaatstack.
In dit voorbeeld is het functiestuurprogramma voor de USB-stick eigenlijk een paar stuurprogramma's: het HID-klassestuurprogramma en het HID miniklassestuurprogramma. De twee stuurprogramma's werken samen om te fungeren als het functiestuurprogramma. Het stuurprogrammapaar maakt slechts één FDO en koppelt deze aan de apparaatstack.
Stuurprogramma's voor bovenfilters
Nadat het functiestuurprogramma is gekoppeld, verwerkt de PnP-manager alle stuurprogramma's voor het bovenste filter.
In dit voorbeeld is er één stuurprogramma voor het bovenste filter voor het apparaat.
Resources toewijzen en het apparaat starten
De PnP-manager wijst resources toe aan het apparaat, indien nodig, en geeft een IRP uit om het apparaat te starten.
Middelen toewijzen
Eerder in het configuratieproces verzamelde de PnP-manager de hardwareresourcevereisten voor het apparaat van de bovenliggende busdriver van het apparaat. Nadat de volledige set stuurprogramma's voor het apparaat is geladen, verzendt de PnP-manager een IRP_MN_FILTER_RESOURCE_REQUIREMENTS aanvraag naar de apparaatstack. Alle stuurprogramma's in de stack hebben de mogelijkheid om deze IRP te verwerken en zo nodig de lijst met resourcevereisten van het apparaat te wijzigen.
De PnP-manager wijst resources toe aan het apparaat, als dat nodig is, op basis van de vereisten van het apparaat en de resources die momenteel beschikbaar zijn.
De PnP-manager moet mogelijk de resourcetoewijzingen van bestaande apparaten opnieuw rangschikken om te voldoen aan de behoeften van het nieuwe apparaat. Deze hertoewijzing van resources wordt 'herverdeling' genoemd. De stuurprogramma's voor de bestaande apparaten ontvangen een reeks stop- en start-IRP's tijdens een herverdeling, maar deze herverdeling moet transparant zijn voor gebruikers.
In het voorbeeld van de USB-stick hebben USB-apparaten geen hardwareresources nodig, zodat de PnP-manager de lijst met resources instelt op NULL-.
Het apparaat starten (IRP_MN_START_DEVICE)
Zodra de PnP-manager resources aan het apparaat toewijst, wordt er een IRP_MN_START_DEVICE IRP naar de apparaatstack verzonden om de stuurprogramma's aan te geven het apparaat te starten.
Nadat het apparaat is gestart, verzendt de PnP-manager nog drie EXTRA IR's naar de stuurprogramma's voor het apparaat:
-
Nadat de start-IRP succesvol is voltooid, stuurt de PnP-manager een andere IRP_MN_QUERY_CAPABILITIES IRP naar de apparaatstack. Alle stuurprogramma's voor het apparaat hebben de mogelijkheid om de IRP te verwerken. De PnP-manager verzendt deze IRP op dit moment, nadat alle stuurprogramma's zijn gekoppeld en het apparaat is gestart, omdat de functie- of filterstuurprogramma's mogelijk toegang nodig hebben tot het apparaat om capaciteitsgegevens te verzamelen.
-
Deze IRP biedt een stuurprogramma de mogelijkheid om bijvoorbeeld te rapporteren dat het apparaat niet mag worden weergegeven in gebruikersinterfaces zoals Apparaatbeheer en het Hotplug-programma. Dit is handig voor apparaten die aanwezig zijn op een systeem, maar niet bruikbaar zijn in de huidige configuratie, zoals een gamepoort op een laptop die niet bruikbaar is wanneer de laptop losgekoppeld is.
IRP_MN_QUERY_DEVICE_RELATIONS voor busrelaties
De PnP-manager verzendt dit IRP om te bepalen of het apparaat ondergeschikte apparaten heeft. Zo ja, dan configureert de PnP-manager elk dochterapparaat.
GUID_PNP_LOCATION_INTERFACE gebruiken
De GUID_PNP_LOCATION_INTERFACE-interface levert de SPDRP_LOCATION_PATHS PnP-apparaateigenschap (Plug and Play) voor een apparaat.
Als u deze interface in uw stuurprogramma wilt implementeren, verwerkt u de IRP_MN_QUERY_INTERFACE IRP met InterfaceType = GUID_PNP_LOCATION_INTERFACE. Uw chauffeur levert een aanwijzer naar een PNP_LOCATION_INTERFACE structuur die aanwijzers bevat naar de afzonderlijke routines van de interface. De PnpGetLocationString-routine biedt het apparaatspecifieke deel van de SPDRP_LOCATION_PATHS eigenschap van het apparaat.