Bagikan melalui


Menggunakan Buffer Umum

[Hanya berlaku untuk KMDF]

Driver untuk perangkat DMA terkadang harus mengalokasikan ruang buffer yang dapat diakses oleh perangkat dan driver. Misalnya, perangkat mungkin menulis informasi transfer, seperti jumlah byte, ke ruang buffer ini dan driver dapat membacanya untuk menentukan jumlah byte yang ditransfer. Jenis ruang buffer ini disebut buffer umum.

Untuk mengalokasikan buffer umum, fungsi panggilan balik EvtDriverDeviceAdd driver Anda:

Contoh kode berikut diambil dari file Init.c dari sampel PLX9x5x . Kode ini menunjukkan bagaimana driver KMDF mengalokasikan ruang buffer umum.

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

Jika driver Anda memanggil WdfDeviceSetAlignmentRequirement sebelum memanggil WdfDmaEnablerCreate, buffer yang dibuat WdfDmaEnablerCreate selaras dengan batas alamat memori yang ditentukan driver ke WdfDeviceSetAlignmentRequirement. Jika tidak, buffer umum diselaraskan dengan batas alamat kata. Atau, driver dapat memanggil WdfCommonBufferCreateWithConfig untuk menentukan penyelarasan untuk satu buffer.

Untuk mendapatkan panjang buffer umum yang telah dialokasikan driver Anda, driver dapat memanggil WdfCommonBufferGetLength.

Ketika driver selesai menggunakan buffer umum, driver memanggil WdfObjectDelete.