Verwenden allgemeiner Puffer

[Gilt nur für KMDF]

Treiber für DMA-Geräte müssen manchmal Pufferspeicher zuordnen, auf den sowohl ein Gerät als auch der Treiber zugreifen können. Ein Gerät kann beispielsweise Übertragungsinformationen, z. B. Byteanzahlen, in diesen Pufferraum schreiben, und der Treiber kann sie lesen, um die Anzahl der übertragenen Bytes zu bestimmen. Dieser Pufferspeichertyp wird als allgemeiner Puffer bezeichnet.

Um einen allgemeinen Puffer zuzuweisen, verwenden Sie die Rückruffunktion EvtDriverDeviceAdd Ihres Treibers:

Das folgende Codebeispiel stammt aus der Datei Init.c des PLX9x5x-Beispiels . Dieser Code zeigt, wie ein KMDF-Treiber allgemeinen Pufferspeicher zuordnet.

// 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);

Wenn Ihr Treiber WdfDeviceSetAlignmentRequirement aufruft, bevor WdfDmaEnablerCreate aufgerufen wird, werden die Puffer, die WdfDmaEnablerCreate erstellt, an der Speicheradressengrenze ausgerichtet, die der Treiber für WdfDeviceSetAlignmentRequirement angegeben hat. Andernfalls werden gängige Puffer an Wortadressgrenzen ausgerichtet. Alternativ kann der Treiber WdfCommonBufferCreateWithConfig aufrufen, um eine Ausrichtung für einen einzelnen Puffer anzugeben.

Um die Länge eines allgemeinen Puffers abzurufen, den Ihr Treiber zugewiesen hat, kann der Treiber WdfCommonBufferGetLength aufrufen.

Wenn der Treiber mit einem gemeinsamen Puffer fertig ist, ruft der Treiber WdfObjectDelete auf.