Bagikan melalui


Penggunaan DispatchReadWrite dengan I/O Terbuffer

Setiap driver perangkat tingkat terendah yang mengatur objek perangkatnya untuk I/O buffer memenuhi permintaan baca dengan mengembalikan data yang ditransfer dari perangkatnya ke buffer ruang sistem yang terkunci di Irp-AssociatedIrp.SystemBuffer>. Ini memenuhi permintaan tulis dengan mentransfer data dari buffer yang sama ke perangkatnya.

Akibatnya, rutinitas DispatchReadWrite dari driver perangkat tersebut biasanya melakukan hal berikut pada penerimaan permintaan transfer:

  1. Memanggil IoGetCurrentIrpStackLocation dan menentukan arah permintaan transfer.

  2. Memeriksa validitas parameter untuk permintaan.

    • Untuk permintaan baca, rutinitas biasanya memeriksa nilai IoStackLocation-Parameters.Read.Length> driver untuk menentukan apakah buffer cukup besar untuk menerima data yang ditransfer dari perangkat.

      Misalnya, driver kelas keyboard sistem memproses permintaan baca yang hanya berasal dari thread input pengguna Win32. Driver ini mendefinisikan struktur, KEYBOARD_INPUT_DATA, untuk menyimpan penekanan kunci dari perangkat dan, pada saat tertentu, menyimpan beberapa struktur ini dalam buffer cincin internal untuk memenuhi permintaan baca saat mereka masuk.

    • Untuk permintaan tulis, rutinitas biasanya memeriksa nilai di Parameters.Write.Length, dan memeriksa data di Irp-AssociatedIrp.SystemBuffer> untuk validitas jika perlu: yaitu, jika perangkatnya hanya menerima paket data terstruktur yang berisi anggota dengan rentang nilai yang ditentukan.

  3. Jika ada parameter yang tidak valid, rutinitas DispatchReadWrite segera menyelesaikan IRP, seperti yang sudah dijelaskan dalam Menyelesaikan IRP. Jika tidak, rutinitas melewati IRP untuk diproses lebih lanjut oleh rutinitas driver lain, seperti yang dijelaskan dalam Meneruskan IRP ke Bawah Driver Stack.

Driver perangkat tingkat terendah yang menggunakan I/O buffer biasanya harus memenuhi permintaan transfer dengan membaca atau menulis data dengan ukuran yang ditentukan oleh pencetus permintaan. Driver seperti itu kemungkinan akan menentukan struktur untuk data yang masuk dari atau dikirim ke perangkatnya dan kemungkinan akan menyangga data terstruktur secara internal, seperti yang dilakukan driver kelas keyboard sistem.

Driver yang menyangga data secara internal harus mendukung permintaan IRP_MJ_FLUSH_BUFFERS , dan juga dapat mendukung permintaan IRP_MJ_SHUTDOWN .

Driver tingkat tertinggi dalam rantai biasanya bertanggung jawab untuk memeriksa parameter IRP input sebelum meneruskan permintaan baca/tulis ke driver yang lebih rendah. Akibatnya, banyak driver tingkat bawah dapat mengasumsikan bahwa lokasi tumpukan I/O mereka dalam IRP baca/tulis memiliki parameter yang valid. Jika driver tingkat terendah dalam rantai mengetahui batasan khusus perangkat pada transfer data, driver tersebut diperlukan untuk memeriksa validitas parameter di lokasi tumpukan I/O-nya.