Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här artikeln beskriver funktionen för länkade MDLs i USB-drivrutinsstacken och hur en klientdrivrutin kan skicka en överföringsbuffert som en kedja av MDL-strukturer .
De flesta USB-värdstyrenheter kräver att överföringsbufferten är virtuellt sammanhängande. Praktiskt taget sammanhängande innebär att bufferten kan starta och sluta var som helst på en sida, men resten av bufferten måste starta och sluta på en sidgräns. Många USB-klientdrivrutiner kan uppfylla det kravet. För vissa klientdrivrutiner, särskilt de som behöver lägga till eller ta bort ytterligare data till eller från bufferten, är det dock inte att föredra att allokera praktiskt taget sammanhängande minne för överföringsbufferten.
Tänk dig till exempel en nätverksstack med tre drivrutiner, en nätverksprotokolldrivrutin, en mellanliggande drivrutin och en miniportdrivrutin. Protokolldrivrutinen initierar en överföring och skickar ett paket till nästa drivrutin i stacken: den mellanliggande drivrutinen. Den mellanliggande drivrutinen vill lägga till en anpassad rubrik (som finns i ett separat minnesblock) i paketet. Den mellanliggande drivrutinen skickar huvudet och det mottagna paketet till nästa drivrutin i stacken: miniportdrivrutinen. Miniportdrivrutinen interagerar med USB-drivrutinsstacken och måste därför förbereda en praktiskt sammanhängande överföringsbuffert. För att skapa en sådan buffert allokerar miniportdrivrutinen en stor buffert, lägger till en anpassad rubrik och kopierar sedan nyttolasten. Eftersom nyttolasten vanligtvis är stor kan kopiering av hela nyttolasten ha en betydande inverkan på prestandan.
Klientdrivrutinen kan övervinna prestandapåverkan genom att skicka överföringsbufferten som en kedja av minnesbeskrivningslista (MDL). Den nya USB-drivrutinsstacken i Windows 8 kan acceptera en länkad MDL (se MDL) från klientdrivrutinen. Genom att ange en länkad MDL kan klientdrivrutinen referera till sammanhängande sidor i minnet i stället för att utföra onödiga kopieringsåtgärder. Funktionen tar bort begränsningar för antalet, storleken och justeringen av buffertar, vilket gör att överföringsbufferten kan segmenteras i fysiskt minne.
För att kunna använda länkade MDL:er måste klientdrivrutinen identifiera om den underliggande USB-drivrutinsstacken, som läses in av Windows, stöder funktionen och sedan skapar en kedja med MDL:er i rätt ordning.
Innan du börjar
Den länkade MDL-funktionen stöds endast för mass-, isochron- och avbrottsöverföringar. Innan du frågar efter den länkade MDL-funktionen kontrollerar du att klientdrivrutinen har ett USBD-handtag för drivrutinsregistreringen med USB-drivrutinsstacken. Om du vill skapa ett USBD-handtag anropar du USBD_CreateHandle. Vanligtvis skapar klientdrivrutinen USBD-handtaget i sin AddDevice-rutin .
Du kan fråga efter den länkade MDL-funktionen i klientdrivrutinens IRP_MN_START_DEVICE-hanterare eller när som helst senare. Klientdrivrutinen får inte fråga efter den här funktionen i sin AddDevice-rutin .
Instruktion
Anropa den USBD_QueryUsbCapability rutinen för att avgöra om USB-drivrutinsstacken stöder funktionen för länkade MDLs. Om du vill fråga efter den funktionen anger du UsbCapabilityChainedMdls som GUID. Ange parametern OutputBuffer till parametern NULL och OutputBufferSize till 0.
Kontrollera värdet för NTSTATUS som returneras av USBD_QueryUsbCapability och utvärdera resultatet. Om rutinen slutförs framgångsrikt, stöds den länkade MDLs-kapaciteten. Alla andra värden anger att funktionen inte stöds.
Skapa kedjan med MDL:er. Varje MDL har en nästa pekare som pekar på en annan MDL.
Drivrutinen kan skapa en MDL-kedja genom att manuellt ange nästa pekare.
I föregående exempel skickar protokolldrivrutinen paketet som en MDL. Den mellanliggande drivrutinen kan skapa en annan MDL som refererar till minnesblocket med huvuddata. För att skapa en kedja kan den mellanliggande drivrutinen peka huvud-MDL:s nästa pekare mot den MDL som tagits emot från protokolldrivrutinen. Den mellanliggande drivrutinen kan sedan vidarebefordra kedjan med två MDL:er till miniportdrivrutinen, som tillhandahåller en referens till den länkade MDL:n i URB för begäran och skickar begäran till USB-drivrutinsstacken. Mer information finns i Använda MDL:er.
När du skapar en URB för en I/O-begäran som använder länkade MDL:er anger du TransferBufferMDL-medlemmen i den associerade URB-strukturen (till exempel _URB_BULK_OR_INTERRUPT_TRANSFER eller _URB_ISOCH_TRANSFER) till den första MDL:n i kedjan och anger TransferBufferLength till det totala antalet byte som ska överföras. Datan kan sträcka sig över mer än en MDL-post i MDL-kedjan.
I Windows 8 har två nya typer av URB-funktioner lagts till som gör det möjligt för en klientdrivrutin att använda länkade MDL:er för dataöverföringar. Om du vill använda den här funktionen, se till att medlemmen Funktion i URB-huvudet ställs in på en av följande URB-funktioner:
- URB_FUNCTION_BULK_ELLER_AVBROTT_ÖVERFÖRING_MED_KEDJAD_MDL
- URB_FUNCTION_ISOCH_TRANSFER_USING_CHAINED_MDL
Information om dessa URB-funktioner finns i _URB_HEADER.
Anmärkningar
Kodexempel som frågar den underliggande USB-drivrutinsstacken för att avgöra om drivrutinsstacken kan acceptera länkade MDL:er finns i USBD_QueryUsbCapability.