Menggunakan Buffer Memori

Driver biasanya menggunakan buffer memori untuk meneruskan data ke dan dari kerangka kerja dan driver lain atau untuk menyimpan informasi secara lokal. Topik ini menjelaskan objek memori kerangka kerja, daftar lookaside, MDLs, dan buffer lokal.

Menggunakan Objek Memori Kerangka Kerja

Kerangka kerja menggunakan objek memori untuk menggambarkan buffer memori yang diterima driver dan diteruskan ke kerangka kerja. Setiap objek memori kerangka mewakili satu buffer.

Untuk membuat objek memori, driver Anda memanggil salah satu metode objek berikut:

Untuk mendapatkan objek memori yang mewakili buffer permintaan I/O yang diterima, pengemudi Anda memanggil WdfRequestRetrieveInputMemory dan WdfRequestRetrieveOutputMemory. Untuk informasi selengkapnya tentang mengambil buffer permintaan I/O, lihat Mengakses Buffer Data di Driver Framework-Based.

Untuk mendapatkan alamat dan ukuran buffer objek memori, driver Anda memanggil WdfMemoryGetBuffer.

Untuk memindahkan data ke dalam atau keluar dari buffer objek memori, driver Anda memanggil WdfMemoryCopyFromBuffer atau WdfMemoryCopyToBuffer. Metode objek ini memeriksa ukuran sumber dan tujuan dan mencegah kesalahan buffer overrun.

Jika driver Anda membuat objek memori dengan memanggil WdfMemoryCreatePreallocated, kemudian dapat menetapkan buffer yang berbeda ke objek memori dengan memanggil WdfMemoryAssignBuffer.

Ketika driver mengirimkan permintaan I /O ke target I/O, biasanya melewati buffer input atau output ke metode objek target I/O framework. Driver menentukan buffer dengan melewati struktur WDF_MEMORY_DESCRIPTOR yang menggambarkan buffer atau dengan melewati pegangan objek memori. (Metode objek target I/O yang mengirim permintaan I/O secara sinkron memerlukan struktur WDF_MEMORY_DESCRIPTOR , dan metode yang mengirim permintaan I/O secara asinkron memerlukan gagang objek memori.)

Untuk informasi tentang kapan buffer memori valid, lihat Siklus Hidup Buffer Memori.

Menggunakan Daftar Lookaside

Jika driver Anda akan membutuhkan banyak buffer dengan ukuran yang kira-kira sama, itu harus mengalokasikannya dari daftar lookaside. Pengemudi membuat daftar lookaside dengan memanggil WdfLookasideListCreate. Selanjutnya, pengemudi dapat memperoleh buffer dari daftar lookaside dengan memanggil WdfMemoryCreateFromLookaside.

Setiap kali driver memanggil WdfMemoryCreateFromLookaside, framework membuat objek memori, memperoleh buffer dari daftar lookaside, dan menetapkan buffer ke objek. Ketika driver telah selesai menggunakan salah satu objek memori ini, ia memanggil WdfObjectDelete, yang menghapus objek memori dan mengembalikan ruang buffer ke daftar lookaside.

Sistem operasi mengelola sumber daya memori yang ditetapkan ke daftar lookaside. Jika driver meminta buffer dari daftar lookaside ketika tidak ada yang tersedia, seperti pertama kali driver memanggil WdfMemoryCreateFromLookaside, sistem mengalokasikan buffer dan menetapkannya ke daftar. Ketika pengemudi memanggil WdfObjectDelete (dan ruang buffer dikembalikan ke daftar lookaside), sistem menyimpan buffer yang sekarang tidak ditetapkan dalam daftar sampai pengemudi membutuhkannya lagi. Sistem meningkatkan ukuran daftar seperlunya; misalnya, driver yang lebih sering meminta buffer menerima daftar lookaside yang lebih besar. Di sisi lain, sistem mungkin mengurangi jumlah buffer dalam daftar jika driver tidak menggunakan semuanya.

Menggunakan ADL

Beberapa driver menggunakan daftar deskriptor memori (MDLs) untuk menggambarkan buffer. Misalnya, driver untuk perangkat akses memori langsung (DMA) harus meneruskan MDL ke metode WdfDmaTransactionInitialize , jika menyebut metode itu.

Pengemudi yang menggunakan MDL dapat memperoleh MDL yang mewakili buffer permintaan I/O yang diterima dengan menghubungi WdfRequestRetrieveInputWdmMdl dan WdfRequestRetrieveOutputWdmMdl.

Sebagian besar driver berbasis kerangka kerja tidak menggunakan MDLs.

Mengalokasikan Buffer Lokal

Driver yang membutuhkan ruang penyangga internal lokal yang tidak akan diteruskan ke kerangka kerja tidak harus membuat objek memori untuk mewakili buffer. Driver dapat memanggil ExAllocatePoolWithTag untuk mengalokasikan buffer internal. Ketika driver telah selesai menggunakan buffer, ia harus memanggil ExFreePoolWithTag.

Namun, driver juga dapat menggunakan objek memori untuk buffer lokal. Keuntungan menggunakan buffer memori, alih-alih memanggil ExAllocatePoolWithTag, adalah bahwa kerangka kerja secara otomatis menghapus objek memori dan buffer mereka ketika objek induk masing-masing objek dihapus.

Penting

DDI ExAllocatePool yang dibahas dalam topik ini telah usang di Windows 10, versi 2004 dan telah digantikan oleh ExAllocatePool2 dan ExAllocatePool3. Untuk informasi selengkapnya, lihat Memperbarui panggilan ExAllocatePool yang tidak digunakan lagi ke ExAllocatePool2 dan ExAllocatePool3.

Menyelaraskan Buffer

Driver Anda dapat menggunakan fungsi WDF_ALIGN_SIZE_UP atau WDF_ALIGN_SIZE_DOWN untuk menghitung ukuran buffer yang disejajarkan ke offset perataan tertentu. Perhitungan ini berguna jika driver Anda harus mengalokasikan beberapa buffer yang berdekatan, jika setiap buffer harus dimulai pada batas perataan alamat.