Dela via


Exempel på WDM-enhetsstack

I det här avsnittet beskrivs de enhetsobjekt som en uppsättning drivrutiner kan skapa för USB-maskinvara. Den illustrerar WDM-enhetsobjekt och hur de lagras.

Följande bild visar de enhetsobjekt som exempeldrivrutinerna skapar. Mer information finns i WDM-drivrutinslager: Ett exempel.

diagram som illustrerar exempel på wdm-enhetsobjektskikt för en usb-joystick.

Längst ned i den här bilden finns enhetsobjekten i exempelenhetsstackarna:

  1. En PDO och en FDO för PCI-bussen.

    Rotbussdrivrutinen räknar upp den interna systembussen (rotbussen) och skapar en PDO för varje enhet som hittas. En av dessa PDOs är för PCI-bussen. (Bilden visar inte PDO och FDO för rotbussen.)

    PnP-hanteraren identifierar PCI-drivrutinen som funktionsdrivrutin för PCI-bussen, läser in drivrutinen (om den inte redan är inläst) och skickar PDO:en till PCI-drivrutinen. I sin AddDevice-rutin skapar PCI-drivrutinen en FDO för PCI-bussen (IoCreateDevice) och kopplar FDO:n till enhetsstacken (IoAttachDeviceToDeviceStack) för PCI-bussen. PCI-drivrutinen skapar och kopplar den här FDO:n som en del av sitt ansvar som funktionsdrivrutin för PCI-bussen.

    Det här exemplet innehåller inte filterdrivrutiner för PCI-bussen.

  2. En PDO och en FDO för USB-värdstyrenheten.

    PnP-hanteraren instruerar PCI-drivrutinen att starta dess enhet (IRP_MN_START_DEVICE) och frågar sedan PCI-drivrutinen om dess barn (IRP_MN_QUERY_DEVICE_RELATIONS med relationstypen BusRelations). Som svar identifierar PCI-drivrutinen enheterna på sin buss. I det här exemplet hittar PCI-drivrutinen en USB-värdstyrenhet och skapar en PDO för den. Den breda pilen i figuren anger att USB-värdstyrenheten är ett barn (child) av PCI-bussen. PCI-drivrutinen skapar PDOs för sina underordnade enheter som en del av sitt ansvar som bussdrivrutin för PCI-bussen.

    PnP-hanteraren identifierar usb-värdstyrenhetens miniklass/klassdrivrutinspar som funktionsdrivrutinen för USB-värdstyrenheten och laddar drivrutinsparet. PnP-chefen anropar drivrutinsparet vid lämplig tidpunkt för att skapa och ansluta en FDO för USB-värdstyrenheten.

    Det här exemplet innehåller inte filterdrivrutiner för USB-värdstyrenheten.

  3. En PDO och en FDO för USB-hubben.

    USB-värdstyrenheten räknar upp sin buss, letar upp USB-hubben i den enda porten och skapar en PDO för hubben. USB-hubbens drivrutin skapar och ansluter en FDO för hubben.

    Det här exemplet innehåller inte filterdrivrutiner för USB-hubben.

  4. En PDO, en FDO och två filter-DO för joystickenheten.

    USB-hubbens drivrutin räknar upp sin buss, letar upp en HID-enhet (joysticken) och skapar en PDO för joysticken.

    I det här exemplet konfigureras en filterdrivrutin på lägre nivå i registret för joystick-enheter, så PnP-hanteraren läser in filterdrivrutinen. Filterdrivrutinen avgör att den är relevant för enheten och skapar och kopplar ett filter-DO till enhetsstacken.

    PnP-chefen fastställer att funktionsdrivrutinen för joystickenheten är drivrutinsparet HID-klass/miniklass och läser in dessa drivrutiner. Drivrutinsparet består av en miniklassdrivrutin som är länkad till en klassdrivrutins-DLL. Tillsammans fungerar de som en funktionsdrivrutin för enheten. Drivrutinsparet klass/miniklass skapar ett enhetsobjekt, FDO: n, och kopplar det till enhetsstacken.

    En filterdrivrutin på den övre nivån skapar och kopplar ett filter-DO till enhetsstacken på ett sätt som liknar filtret på lägre nivå.

Den överordnade bussdrivrutinen skapar alltid PDO:n längst ned i enhetsstacken för en viss enhet. När drivrutiner hanterar PnP eller power-IRP:er måste de skicka varje IRP hela vägen ner i enhetsstacken till PDO och dess associerade bussdrivrutin.

Följande bild visar samma enhetsstackar som föregående bild, men framhäver vilka enhetsobjekt varje drivrutin skapar och hanterar.

diagram som illustrerar exempel på enhetsobjektskikt ur drivrutinsperspektivet.

En bussdrivrutin omfattar mer än en enhetsstack. En busschaufför skapar FDO:n för sitt busskort eller sin styrenhet och skapar en PDO för var och en av sina underordnade enheter.