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:
Memanggil WdfDmaEnablerCreate untuk membuat objek pengaktif DMA.
Memanggil WdfCommonBufferCreate atau WdfCommonBufferCreateWithConfig untuk membuat buffer.
Memanggil WdfCommonBufferGetAlignedLogicalAddress untuk mendapatkan alamat logis buffer, yang dapat diakses perangkat.
Memanggil WdfCommonBufferGetAlignedVirtualAddress untuk mendapatkan alamat virtual buffer, yang dapat diakses driver.
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.
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk