Delen via


Algemene buffers gebruiken

[Alleen van toepassing op KMDF]

Stuurprogramma's voor DMA-apparaten moeten soms bufferruimte toewijzen waartoe zowel een apparaat als het stuurprogramma toegang heeft. Een apparaat kan bijvoorbeeld overdrachtsgegevens schrijven, zoals byteaantallen, in deze bufferruimte en het stuurprogramma kan deze lezen om het aantal overgedragen bytes te bepalen. Dit type bufferruimte wordt een gemeenschappelijke buffer genoemd.

Als u een gemeenschappelijke buffer wilt toewijzen, gebruikt u de callback-functie EvtDriverDeviceAdd van uw stuurprogramma:

Het volgende codevoorbeeld is afkomstig uit het bestand Init.c van het PLX9x5x-voorbeeld . Deze code laat zien hoe een KMDF-stuurprogramma algemene bufferruimte toewijst.

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

Als uw stuurprogramma WdfDeviceSetAlignmentRequirement aanroept voordat u WdfDmaEnablerCreate aanroept, worden de buffers die WdfDmaEnablerCreate maakt, afgestemd op de grens van het geheugenadres dat het stuurprogramma heeft opgegeven bij WdfDeviceSetAlignmentRequirement. Anders worden gemeenschappelijke buffers uitgelijnd op woordadresgrenzen. Alternatief kan het stuurprogramma WdfCommonBufferCreateWithConfig aanroepen om een uitlijning voor één buffer op te geven.

Om de lengte te verkrijgen van een gemeenschappelijke buffer die uw stuurprogramma heeft toegewezen, kan het stuurprogramma WdfCommonBufferGetLength aanroepen.

Wanneer het stuurprogramma klaar is met een gemeenschappelijke buffer, roept het stuurprogramma WdfObjectDelete aan.