Dela via


USB-drivrutiner på värdsidan i Windows

Den här artikeln innehåller en översikt över arkitekturen för USB-drivrutinsstacken (Universal Serial Bus).

Följande bild visar arkitekturblockdiagrammet för USB-drivrutinsstacken för Windows. Diagrammet visar separata USB-drivrutinsstackar för USB 2.0 och USB 3.0. Windows läser in USB 3.0-drivrutinsstacken när en enhet är ansluten till en xHCI-styrenhet.

Arkitekturblockdiagram för USB 2.0- och 3.0-drivrutinsstackar.

Windows läser in USB 2.0-drivrutinsstacken för enheter som är anslutna till eHCI-, oHCI- eller uHCI-styrenheter. USB 2.0-drivrutinsstacken levereras i Windows XP med Service Pack 1 (SP1) och senare versioner av Windows-operativsystemet.

USB 3.0-drivrutins-stacken

Microsoft skapade USB 3.0-drivrutinerna med hjälp av KMDF-gränssnitt (Kernel Mode Driver Framework). KMDF-drivrutinsmodellen minskar komplexiteten och förbättrar stabiliteten.

USB 3.0-värdstyrenhetsdrivrutin (Usbxhci.sys)

XHCI-drivrutinen är USB 3.0-värdstyrenhetsdrivrutinen. Ansvaret för xHCI-drivrutinen omfattar initiering av MMIO-register och värdminnesbaserade datastrukturer för xHCI-styrenhetsmaskinvara, mappning av överföringsbegäranden från övre lagerdrivrutiner till Överföringsförfrågningsblock och sändning av begäranden till maskinvaran. När en överföring har slutförts hanterar drivrutinen överföringshändelser från maskinvaran och sprider händelserna uppåt i drivrutinsstacken. Den styr även xHCI-styrenhetens enhetsfack och slutpunktskontexter.

Windows läser in xHCI-drivrutinen som funktionsenhetsobjekt (FDO) i enhetsstacken för värdstyrenheten.

USB-värdstyrenhetstillägg (Ucx01000.sys)

USB-värdstyrenhetstilläggsdrivrutinen (ett tillägg till KMDF) är det nya tillägget till den underliggande klassspecifika värdstyrenhetsdrivrutinen, till exempel xHCI-drivrutinen. Den nya drivrutinen är utökningsbar och är utformad för att stödja andra typer av värdstyrenhetsdrivrutiner som förväntas utvecklas i framtiden. USB-värdstyrenhetstillägget fungerar som ett gemensamt abstrakt gränssnitt till hubbdrivrutinen, tillhandahåller en allmän mekanism för köbegäranden till värdstyrenhetsdrivrutinen och åsidosätter vissa valda funktioner. Alla I/O-begäranden som initieras av de övre drivrutinerna når drivrutinen för värdstyrenhetstillägget före xHCI-drivrutinen. När du tar emot en I/O-begäran validerar värdstyrenhetstillägget begäran och vidarebefordrar sedan begäran till rätt KMDF-kö som är associerad med målslutpunkten. XHCI-drivrutinen hämtar begäran från kön när den är klar för bearbetning. Ansvaret för USB-värdstyrenhetens tilläggsdrivrutin är:

  • Tillhandahåller USB-specifika objekt till xHCI-drivrutinen.
  • Tillhandahåller KMDF-händelseåteranropsrutiner till xHCI-drivrutinen.
  • Hanterar och styr driften av rothubben som är associerad med värdstyrenheten.
  • Implementerar funktioner som kan konfigureras av klientdrivrutinen, till exempel länkade MDL:er, strömmar och så vidare.

USB-hubbdrivrutin (Usbhub3.sys)

Den nya hubbdrivrutinen i USB-drivrutinsstacken för 3.0-enheter använder KMDF-drivrutinsmodellen. Hubbdrivrutinen utför främst följande uppgifter:

  • Hanterar USB-hubbar och deras portar.
  • Räknar upp enheter och andra hubbar som är anslutna till deras underordnade portar.
  • Skapar fysiska enhetsobjekt (PDOs) för uppräknade enheter och hubbar.

Windows laddar hubbdrivrutinen som FDO i hubbens enhetsstack. Enhetsuppräkning och hubbhantering i den nya drivrutinen implementeras via en uppsättning tillståndsdatorer. Hub-drivrutinen förlitar sig på KMDF för energisparfunktioner och PnP-funktioner. Utöver hubbhantering utför hubbdrivrutinen även preliminära kontroller och bearbetning av vissa begäranden som skickas av USB-klientdrivrutinsskiktet. Hub-drivrutinen parsar till exempel en select-configuration-begäran för att avgöra vilka slutpunkter som ska konfigureras av begäran. Efter att ha analyserat informationen skickar hubbdrivrutinen begäran till USB-värdstyrenhetstillägget för vidare bearbetning.

USB 2.0-drivrutins-stacken

Windows läser in USB 2.0-drivrutinsstacken för enheter som är anslutna till eHCI-, oHCI- eller uHCI-styrenheter. Drivrutinerna i USB 2.0-drivrutinsstacken levereras i Windows XP med SP1 och senare versioner av Windows-operativsystemet. USB 2.0-drivrutinsstacken är utformad för att underlätta höghastighets-USB-enheter enligt definitionen i USB 2.0-specifikationen.

Längst ned i USB-drivrutinsstacken finns värdstyrenhetsdrivrutinen. Den består av portdrivrutinen Usbport.sysoch en eller flera av tre miniportdrivrutiner som körs samtidigt. När systemet identifierar värdstyrenhetsmaskinvara läser det in en av dessa miniportdrivrutiner. Miniportdrivrutinen laddar portdrivrutinen Usbport.sysefter att den har laddats in. Portdrivrutinen hanterar de aspekter av värdstyrenhetsdrivrutinens uppgifter som är oberoende av det specifika protokollet.

Miniportdrivrutinen Usbuhci.sys (universellt värdstyrenhetsgränssnitt) ersätter den Uhcd.sys miniklassdrivrutin som levererades med Windows 2000. Miniportdrivrutinen Usbohci.sys (öppna värdstyrenhetsgränssnittet) ersätter Openhci.sys. Den Usbehci.sys-miniportdrivrutinen stöder höghastighets-USB-enheter och introducerades i Windows XP med SP1 samt i senare versioner och i Windows Server 2003 och senare operativsystem.

I alla versioner av Windows som stöder USB 2.0 kan operativsystemet hantera USB 1.1- och USB 2.0-värdstyrenheter samtidigt. När operativsystemet upptäcker att båda typerna av styrenhet finns skapar det två separata enhetsnoder, en för varje värdstyrenhet. Windows läser därefter in Usbehci.sys miniportdrivrutin för USB 2.0-kompatibel värdstyrenhetsmaskinvara och antingen Usbohci.sys eller Openhci.sys för USB 1.1-kompatibel maskinvara, beroende på systemkonfigurationen.

Ovanför portdrivrutinen finns USB-bussdrivrutinen, Usbhub.sys, även känd som hubbdrivrutinen. Det här är enhetsdrivrutinen för varje hubb i systemet.

Allmän generisk USB-klassföräldradrivrutin (Usbccgp.sys)

Den allmänna överordnade drivrutinen för USB-klassen är den överordnade drivrutinen som tillhandahålls av Microsoft för sammansatta enheter. Hubbens drivrutin räknar upp och läser in den överordnade sammansatta drivrutinen om deviceClass är 0 eller 0xef och numInterfaces är större än 1 i enhetsbeskrivningen. Hubbdrivrutinen genererar det kompatibla ID:t för den överordnade sammansatta drivrutinen som "USB\COMPOSITE". Usbccgp.sys använder WDM-rutiner (Windows Driver Model).

Den överordnade sammansatta drivrutinen räknar upp alla funktioner i en sammansatt enhet och skapar en PDO för var och en. Detta gör att lämplig klass- eller klientdrivrutin läses in för varje funktion på enheten. Varje funktionsdrivrutin (underordnad PDO) skickar begäranden till den överordnade drivrutinen, som skickar dem till USB-hubbens drivrutin.

Usbccgp.sys ingår i Windows XP med SP1 och senare versioner av Windows-operativsystemet. I Windows 8 har drivrutinen uppdaterats för att implementera funktionsupphängnings- och fjärraktiveringsfunktioner enligt definitionen i USB 3.0-specifikationen.

Mer information finns i Allmän överordnad USB-drivrutin (Usbccgp.sys).

WinUSB (Winusb.sys)

Windows USB (WinUSB) är en allmän drivrutin som tillhandahålls av Microsoft för USB-enheter. WinUSB-arkitekturen består av en drivrutin i kernelläge (Winusb.sys) och ett dynamiskt länkbibliotek i användarläge (Winusb.dll). För enheter som inte kräver en anpassad funktionsdrivrutin kan Winusb.sys installeras i enhetens kernellägesstacken som funktionsdrivrutin. Processer i användarläge kan sedan kommunicera med Winusb.sys med hjälp av en uppsättning enhets-I/O-kontrollbegäranden eller genom att anropa WinUsb_Xxx funktioner. Mer information finns i Introduktion till WinUSB för utvecklare.

I Windows 8 innehåller INF-filen (Microsoft-provided information) för WinUSB, Winusb.inf, USB\MS_COMP_WINUSB som en enhetsidentifierarsträng. På så sätt kan Winusb.sys automatiskt läsas in som funktionsdrivrutin för de enheter som har ett matchande WinUSB-kompatibelt ID i MS OS-beskrivningen. Sådana enheter kallas WinUSB-enheter. Maskinvarutillverkare behöver inte distribuera en INF-fil för sin WinUSB-enhet, vilket gör drivrutinsinstallationsprocessen enklare för slutanvändaren. Mer information finns i WinUSB-enhet.

USB-klientdrivrutin

Varje USB-enhet, sammansatt eller icke-sammansatt, hanteras av en klientdrivrutin. En USB-klientdrivrutin är en klass- eller enhetsdrivrutin som är en klient för USB-drivrutinsstacken. Sådana drivrutiner omfattar klass- och enhetsspecifika drivrutiner från Microsoft eller en tredjepartsleverantör. En lista över klassdrivrutiner som tillhandahålls av Microsoft finns i Drivrutiner för USB-enhetsklasser som stöds. En klientdrivrutin skapar begäranden om att kommunicera med enheten genom att anropa offentliga gränssnitt som exponeras av USB-drivrutinsstacken.

En klientdrivrutin för en sammansatt enhet skiljer sig inte från en klientdrivrutin för en icke-sammansatt enhet, förutom dess plats i drivrutinsstacken.

En klientdrivrutin för en icke-sammansatt enhet läggs direkt ovanför hubbdrivrutinen.

För en sammansatt USB-enhet som exponerar flera funktioner och inte har en överordnad klassdrivrutin läser Windows in den allmänna USB-drivrutinen (Usbccgp.sys) mellan hubbdrivrutinen och klientdrivrutinsskiktet. Den överordnade drivrutinen skapar en separat PDO för varje funktion i en sammansatt enhet. Klientdrivrutiner (FDO:er för funktioner) läses in ovanför den allmänna överordnade drivrutinen. Leverantörer kan välja att ange en separat klientdrivrutin för varje funktion.

En USB-klientdrivrutin kan köras i antingen användarläge eller kernelläge, beroende på drivrutinens krav. USB-klientdrivrutiner kan skrivas med hjälp av KMDF-, UMDF- eller WDM-rutiner.

Hjälpbibliotek för klientdrivrutiner

Microsoft tillhandahåller följande hjälpbibliotek för att hjälpa drivrutiner och program i kernelläge att kommunicera med USB-drivrutinsstacken:

  • Usbd.sys

    Microsoft tillhandahåller det Usbd.sys bibliotek som exporterar rutiner för USB-klientdrivrutiner. Hjälprutinerna förenklar driftuppgifterna för en klientdrivrutin. Genom att till exempel använda hjälprutinerna kan en USB-klientdrivrutin skapa USB-begärandeblock (URL:er) för vissa specifika åtgärder, till exempel välja en konfiguration, och skicka dessa URL:er till USB-drivrutinsstacken.

  • Usbdex.lib

    Det här hjälpbiblioteket är nytt för Windows 8. Biblioteket exporterar rutiner främst för allokering och skapande av URL:er. Dessa rutiner ersätter några av de äldre rutiner som exporteras av Usbd.sys. De nya rutinerna kräver att klientdrivrutinen registrerar sig med USB-drivrutinsstacken, som underhåller handtaget för registrering. Handtaget används för anrop till andra Usbdex.lib-rutiner. Vissa URL:er som allokeras av de nya rutinerna har en URB-kontext som USB-drivrutinen använder för bättre spårning och bearbetning. Mer information finns i Allokera och skapa URL:er.

  • Winusb.dll

    Winusb.dll är en DLL i användarläge som exponerar WinUSB-funktioner för kommunikation med Winusb.sys, som läses in som en enhets funktionsdrivrutin i kernelläge. Program använder dessa funktioner för att konfigurera enheten, hämta information om enheten och utföra I/O-åtgärder. Information om hur du använder de här funktionerna finns i Komma åt en USB-enhet med Hjälp av WinUSB Functions.