Condividi tramite


Funzione WdfDmaEnablerGetFragmentLength (wdfdmaenabler.h)

[Si applica solo a KMDF]

Il metodo WdfDmaEnablerGetFragmentLength restituisce la lunghezza massima di trasferimento supportata dal sistema operativo per un singolo trasferimento DMA .

Sintassi

size_t WdfDmaEnablerGetFragmentLength(
  [in] WDFDMAENABLER     DmaEnabler,
  [in] WDF_DMA_DIRECTION DmaDirection
);

Parametri

[in] DmaEnabler

Handle per un oggetto enabler DMA ottenuto dal driver da una chiamata precedente a WdfDmaEnablerCrea.

[in] DmaDirection

Valore WDF_DMA_DIRECTIONtipizzato che specifica la direzione dell'operazione di trasferimento DMA. Per altre informazioni, vedere la sezione Osservazioni seguente.

Valore restituito

WdfDmaEnablerGetFragmentLength restituisce la lunghezza massima di un trasferimento DMA, in byte, che il sistema operativo può supportare o zero se il valore DmaDirection parametro non è valido.

Se il driver fornisce un handle di oggetto non valido, si verifica un controllo di bug.

Osservazioni:

La lunghezza massima di trasferimento DMA supportata dal sistema operativo dipende dal numero di registri mappa disponibili. Se sono disponibili registri di mapping sufficienti, WdfDmaEnablerGetFragmentLength restituisce lo stesso valore restituito WdfDmaEnablerGetMaximumLength. In caso contrario, il valore restituito WdfDmaEnablerGetFragmentLength sarà minore del valore restituito WdfDmaEnablerGetMaximumLength.

Il driver può determinare il numero di registri mappa disponibili usando la macro BYTE_TO_PAGES, come indicato di seguito:

BYTE_TO_PAGES(WdfDmaEnablerGetFragmentLength()) + 1

Se il driver ha specificato un profilo duplex quando viene chiamato WdfDmaEnablerCreate, il valore del parametro DmaDirection deve essere WdfDmaDirectionReadFromDevice per ottenere la lunghezza massima di trasferimento per le operazioni di lettura e WdfDmaDirectionWriteToDevice per ottenere la lunghezza massima di trasferimento per le operazioni di scrittura. Se il driver non ha specificato un profilo duplex, il driver può specificare WdfDmaDirectionReadFromDevice o WdfDmaDirectionWriteToDevice per DmaDirection.

Si noti che se il dispositivo del driver supporta l'operazione duplex, WdfDmaEnablerGetFragmentLength può restituire valori diversi per le istruzioni di lettura e scrittura specificate dal parametro DmaDirection. Questa differenza è dovuta al fatto che il framework crea un oggetto adattatore separato per ogni direzione e il sistema operativo potrebbe fornire un numero diverso di registri mappa a ogni oggetto adapter.

Esempi

L'esempio di codice seguente determina il numero minimo di registri mappa necessari per gestire le operazioni di lettura di un dispositivo NIC, calcola il numero di registri mappa disponibili e segnala un errore se il numero di registri mappa allocati non è sufficiente.

ULONG  minimumMapRegisters;
ULONG  maxLengthSupported;
ULONG  mapRegistersAllocated;

miniMapRegisters = BYTES_TO_PAGES(NIC_MAX_PACKET_SIZE) + 1;

maxLengthSupported = 
    (ULONG) WdfDmaEnablerGetFragmentLength(
                                           FdoData->WdfDmaEnabler,
                                           WdfDmaDirectionReadFromDevice
                                           );

mapRegistersAllocated = BYTES_TO_PAGES(maxLengthSupported) + 1;

if (mapRegistersAllocated < minimumMapRegisters) {
    status = STATUS_INSUFFICIENT_RESOURCES;
    return status;
}

Requisiti

Requisito Valore
Piattaforma di destinazione Universale
versione minima di KMDF 1.1
intestazione wdfdmaenabler.h (include Wdf.h)
Biblioteca Wdf01000.sys (vedere Controllo delle versioni della libreria framework).
IRQL <=DISPATCH_LEVEL
regole di conformità DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Vedere anche

WDF_DMA_DIRECTION

WdfDmaEnablerCreare

WdfDmaEnablerGetMaximumLength