Meneruskan Permintaan I/O

Ketika driver menerima permintaan I/O yang tidak dapat diproses, driver biasanya melakukan salah satu hal berikut:

  • Ini meneruskan permintaan yang diterima ke driver lain.

  • Ini membuat permintaan tambahan dan mengirimkannya ke driver lain.

Driver berbasis kerangka kerja meneruskan permintaan dengan menggunakan target I/O, yang mewakili driver lain pada sistem. Driver dapat menggunakan salah satu teknik berikut untuk meneruskan permintaan ke target I/O:

  • Driver dapat meneruskan permintaan I/O ke driver yang lebih rendah berikutnya dengan memanggil WdfDeviceGetIoTarget, diikuti oleh WdfRequestFormatRequestUsingCurrentType, dan akhirnya WdfRequestSend.

    Teknik ini hanya berguna jika driver menerima permintaan yang tidak harus dimodifikasi sebelum diteruskan.

  • Driver dapat memanggil WdfFdoInitSetFilter untuk mendaftarkan dirinya sebagai driver filter.

    Jika driver filter tidak menyediakan antrean I/O untuk jenis permintaan I/O tertentu, kerangka kerja secara otomatis meneruskan permintaan jenis tersebut ke driver yang lebih rendah berikutnya.

  • Biasanya, driver fungsi memeriksa setiap konten permintaan I/O. Jika driver fungsi tidak dapat memproses permintaan, driver tersebut dapat mengubah permintaan dan meneruskannya ke target I/O. Atau, ini mungkin membuat satu atau beberapa permintaan baru dan mengirimkannya ke target I/O.

    Objek target I/O kerangka kerja menentukan beberapa metode untuk mengirim permintaan I/O ke driver lain. Misalnya, driver dapat memanggil WdfIoTargetFormatRequestForRead, diikuti oleh WdfRequestSend, untuk mengirim permintaan baca ke target I/O. Untuk informasi selengkapnya tentang target I/O, lihat Menggunakan Target I/O.

    Jarang, penulis driver mungkin ingin menentukan konten lokasi tumpukan I/O WDM yang mendasar permintaan sebelum mengirim permintaan ke target I/O. Untuk kasus tersebut, driver dapat memanggil WdfRequestWdmFormatUsingStackLocation sebelum memanggil WdfRequestSend.

Terkadang, driver harus mengirim permintaan yang sama ke beberapa target I/O, biasanya karena driver harus mengirim satu perintah ke semua perangkatnya. Sebelum mengirim permintaan ke target I/O, driver dapat memanggil WdfRequestChangeTarget untuk memverifikasi bahwa target I/O dapat diakses.

Driver akhirnya harus menyelesaikan setiap permintaan yang diteruskan ke target I/O, kecuali jika menetapkan bendera WDF_REQUEST_SEND_OPTION_SEND_AND_FORGET saat memanggil WdfRequestSend.

Perhatikan bahwa ketika driver meneruskan permintaan, kerangka kerja tidak secara harfiah mentransfer objek permintaan kerangka kerja dari driver pengirim ke driver penerima. Sebaliknya, kerangka kerja membuat objek permintaan baru di driver yang menerima permintaan. Hanya paket permintaan I/O (IRP) yang mendasar permintaan yang ditransfer dari satu driver ke driver lainnya.