Uso di buffer comuni

[Si applica solo a KMDF]

I driver per i dispositivi DMA a volte devono allocare spazio buffer che sia un dispositivo che il driver possono accedere. Ad esempio, un dispositivo potrebbe scrivere informazioni di trasferimento, ad esempio conteggi byte, in questo spazio buffer e il driver può leggerlo per determinare il numero di byte trasferiti. Questo tipo di spazio buffer viene chiamato buffer comune.

Per allocare un buffer comune, il driver EvtDriverDeviceAggiungi funzione di callback:

L'esempio di codice seguente viene tratto dal file Init.c dell'esempio PLX9x5x5x . Questo codice illustra come un driver KMDF alloca lo spazio buffer comune.

// Allocate common buffer for building writes
DevExt->WriteCommonBufferSize = 
         sizeof( DMA_TRANSFER_ELEMENT) * DevExt->WriteTransferElements;
status = WdfCommonBufferCreate( DevExt->DmaEnabler,
                                DevExt->WriteCommonBufferSize,
                                WDF_NO_OBJECT_ATTRIBUTES, 
                                &DevExt->WriteCommonBuffer );
if (!NT_SUCCESS(status)) {
    . . . //Error-handling code omitted 
    }
DevExt->WriteCommonBufferBase = 
             WdfCommonBufferGetAlignedVirtualAddress(
                      DevExt->WriteCommonBuffer);
DevExt->WriteCommonBufferBaseLA = 
             WdfCommonBufferGetAlignedLogicalAddress(
                      DevExt->WriteCommonBuffer);
RtlZeroMemory( DevExt->WriteCommonBufferBase, DevExt->WriteCommonBufferSize);

Se il driver chiama WdfDeviceSetAlignmentRequirement prima di chiamare WdfDmaEnablerCreate, i buffer creati da WdfDmaEnablerCreate vengono allineati al limite dell'indirizzo di memoria specificato dal driver specificato in WdfDeviceSetAlignmentRequirement. In caso contrario, i buffer comuni sono allineati ai limiti degli indirizzi di word. In alternativa, il driver può chiamare WdfCommonBufferCreateWithConfig per specificare un allineamento per un singolo buffer.

Per ottenere la lunghezza di un buffer comune allocato dal driver, il driver può chiamare WdfCommonBufferGetLength.

Al termine dell'uso di un buffer comune, il driver chiama WdfObjectDelete.