Condividi tramite


Come inviare strutture MDL concatenati

Questo articolo descrive la funzionalità MDLs concatenata nello stack di driver USB e il modo in cui un driver client può inviare un buffer di trasferimento come catena di strutture MDL .

La maggior parte dei controller host USB richiede che il buffer di trasferimento sia virtualmente contiguo. Virtualmente contiguo significa che il buffer può iniziare e terminare ovunque in una pagina, ma il resto del buffer deve iniziare e terminare su un limite di pagina. Molti driver client USB sono in grado di soddisfare tale requisito. Tuttavia, per determinati driver client, in particolare quelli che devono aggiungere o rimuovere dati aggiuntivi al buffer, l'allocazione della memoria virtualmente contigua per il buffer di trasferimento non è preferibile.

Si consideri ad esempio uno stack di rete di tre driver, un driver di protocollo di rete, un driver intermedio e un driver miniport. Il driver del protocollo avvia un trasferimento e invia un pacchetto al driver successivo nello stack: il driver intermedio. Il driver intermedio vuole aggiungere un'intestazione personalizzata (contenuta in un blocco separato di memoria) al pacchetto. Il driver intermedio invia l'intestazione e il pacchetto ricevuto, al driver successivo nello stack: il driver miniport. Le interfacce del driver miniport con lo stack di driver USB e quindi devono preparare un buffer di trasferimento virtualmente contiguo. Per creare un buffer di questo tipo, il driver miniport alloca un buffer di grandi dimensioni, aggiunge l'intestazione personalizzata e quindi copia il payload. Poiché il payload è in genere di grandi dimensioni, la copia dell'intero payload può avere un impatto significativo sulle prestazioni.

Il driver client può superare tale impatto sulle prestazioni inviando il buffer di trasferimento come catena di descrittori di memoria (MDLs). Il nuovo stack di driver USB in Windows 8 è in grado di accettare un MDL concatenato (vedere MDL) dal driver client. Fornendo un MDL concatenato, il driver client può fare riferimento a pagine discontigue in memoria anziché eseguire operazioni di copia extranee. La funzionalità rimuove le restrizioni relative al numero, alle dimensioni e all'allineamento dei buffer, consentendo la segmentazione del buffer di trasferimento nella memoria fisica.

Per usare gli MDL concatenati, il driver client deve rilevare se lo stack di driver USB sottostante, caricato da Windows, supporta la funzionalità e quindi compila una catena di MDLs in un ordine appropriato.

Prima di iniziare

La funzionalità MDL concatenata è supportata solo per i trasferimenti bulk, isochronous e interrupt. Prima di eseguire una query sulla funzionalità MDL concatenata, assicurarsi che il driver client disponga di un handle USBD per la registrazione del driver con lo stack di driver USB. Per creare un handle USBD, chiamare USBD_CreateHandle. In genere, il driver client crea l'handle USBD nella routine AddDevice .

È possibile eseguire una query per la funzionalità MDL concatenata nel gestore IRP_MN_START_DEVICE del driver client o in qualsiasi momento successivo. Il driver client non deve eseguire query per questa funzionalità nella routine AddDevice .

Istruzioni

  1. Chiamare la routine USBD_QueryUsbCapability per determinare se lo stack di driver USB supporta la funzionalità MDLs concatenata. Per eseguire una query per tale funzionalità, specificare UsbCapabilityChainedMdls come GUID. Impostare il parametro OutputBuffer su NULL e OutputBufferSize su 0.

  2. Controllare il valore NTSTATUS restituito da USBD_QueryUsbCapability e valutare il risultato. Se la routine viene completata correttamente, è supportata la funzionalità MDLs concatenata. Qualsiasi altro valore indica che la funzionalità non è supportata.

  3. Creare la catena di MDLs. Ogni MDL ha un puntatore Avanti che punta a un altro MDL.

    Il driver può creare una catena MDL impostando manualmente il puntatore Avanti .

    Nell'esempio precedente, il driver del protocollo invia il pacchetto come MDL. Il driver intermedio può creare un'altra MDL che fa riferimento al blocco di memoria con i dati dell'intestazione. Per creare una catena, il driver intermedio può puntare il puntatore successivo dell'intestazione MDL al MDL ricevuto dal driver del protocollo. Il driver intermedio può quindi inoltrare la catena di due MDL al driver miniport, che fornisce un riferimento all'MDL concatenato nell'ISTANZA per la richiesta e invia la richiesta allo stack di driver USB. Per altre informazioni, vedere Uso di MDLs.

  4. Durante la compilazione di una richiesta di I/O che usa mdls concatenata, impostare il membro TransferBufferMDLdella struttura DI GESTIONE associata (ad esempio _URB_BULK_OR_INTERRUPT_TRANSFER o _URB_ISOCH_TRANSFER) sul primo MDL della catena e impostare TransferBufferLength sul numero totale di byte da trasferire. I dati possono estendersi su più di una voce MDL nella catena MDL.

    In Windows 8 sono stati aggiunti due nuovi tipi di funzioni ODBC che consentono a un driver client di usare mdls concatenati per i trasferimenti di dati. Se si vuole usare questa funzionalità, assicurarsi di impostare il membro della funzione dell'intestazione URB su una delle funzioni SEGUENTI:

    • URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER_USING_CHAINED_MDL
    • URB_FUNCTION_ISOCH_TRANSFER_USING_CHAINED_MDL

    Per informazioni su tali funzioni DI GESTIONE, vedere _URB_HEADER.

Commenti

Per esempio di codice che esegue una query sullo stack di driver USB sottostante per determinare se lo stack di driver può accettare gli MDL concatenati, vedere USBD_QueryUsbCapability.