Bagikan melalui


Meneruskan RUNPS ke bawah Tumpukan Driver

Ketika rutinitas pengiriman driver menerima IRP, ia harus memanggil IoGetCurrentIrpStackLocation sehingga dapat memeriksa lokasi tumpukan I/O sendiri dan menentukan bahwa parameter apa pun valid. Jika driver tidak dapat memenuhi dan menyelesaikan permintaan itu sendiri, driver dapat melakukan salah satu hal berikut:

  • Teruskan IRP untuk pemrosesan lebih lanjut oleh driver tingkat bawah.

  • Buat satu atau beberapa RUN baru dan berikan ke driver tingkat bawah.

Driver tingkat yang lebih tinggi harus meneruskan permintaan I/O ke driver berikutnya yang lebih rendah sebagai berikut:

  1. Jika driver akan meneruskan IRP input ke driver tingkat bawah berikutnya, rutinitas pengiriman harus memanggil IoSkipCurrentIrpStackLocation atau IoCopyCurrentIrpStackLocationToNext untuk mengatur lokasi tumpukan I/O driver yang lebih rendah berikutnya.

    Jika driver memanggil IoAllocateIrp untuk mengalokasikan satu atau beberapa IRP tambahan untuk driver yang lebih rendah, rutinitas pengiriman harus menginisialisasi lokasi tumpukan I/O driver berikutnya yang lebih rendah dengan mengikuti langkah-langkah yang dijelaskan dalam Memproses RUNPS di Driver Intermediate-Level.

    Rutinitas pengiriman dapat memodifikasi beberapa parameter di lokasi tumpukan I/O driver berikutnya yang lebih rendah untuk permintaan tertentu. Misalnya, driver tingkat yang lebih tinggi dapat memodifikasi parameter untuk permintaan transfer besar ketika perangkat yang mendasar memiliki batas yang diketahui dalam kapasitas transfer, dan menggunakan kembali IRP untuk mengirim permintaan transfer parsial ke driver perangkat yang mendasar.

  2. Panggil IoSetCompletionRoutine.

    Jika rutinitas pengiriman meneruskan IRP yang diterima ke driver berikutnya yang lebih rendah, mengatur rutinitas IoCompletion bersifat opsional tetapi berguna, karena rutinitas dapat melakukan tugas-tugas seperti menentukan seberapa rendah driver menyelesaikan permintaan, menggunakan kembali IRP untuk transfer parsial, memperbarui status apa pun yang dipertahankan driver jika melacak IRP, dan mencoba kembali permintaan yang dikembalikan dengan kesalahan.

    Jika rutinitas pengiriman telah mengalokasikan IRP baru, mengatur rutinitas IoCompletion diperlukan karena rutinitas harus melepaskan setiap IRP setelah driver yang lebih rendah menyelesaikannya.

    Untuk informasi selengkapnya tentang rutinitas IoCompletion , lihat Menyelesaikan RUNPS.

  3. Panggil IoCallDriver dengan setiap IRP untuk diproses oleh driver yang lebih rendah.

  4. Mengembalikan nilai NTSTATUS yang sesuai, seperti:

    • STATUS_PENDING

      Driver biasanya mengembalikan STATUS_PENDING jika IRP input adalah permintaan asinkron, seperti IRP_MJ_READ atau IRP_MJ_WRITE.

    • Hasil panggilan ke IoCallDriver

      Driver sering mengembalikan hasil panggilan ke IoCallDriver jika IRP input adalah permintaan sinkron, seperti IRP_MJ_CREATE.

Driver perangkat tingkat terendah melewati IRP apa pun yang tidak dapat diselesaikan dalam rutinitas pengirimannya ke rutinitas driver lain sebagai berikut:

  1. Panggil IoMarkIrpPending dengan IRP input.

  2. Panggil IoStartPacket untuk meneruskan atau mengantrekan IRP ke rutinitas StartIo driver, kecuali driver mengelola antrean IRP internalnya sendiri, seperti yang dijelaskan dalam Antrean IRP yang Dikelola Driver.

    Jika driver tidak memiliki startIo rutin tetapi menangani IRP yang dapat dibatalkan, driver harus mendaftarkan rutinItas Batal atau menerapkan antrean IRP yang batal aman. Untuk informasi selengkapnya tentang Membatalkan rutinitas, lihat Membatalkan RUNTIME.

  3. Mengembalikan STATUS_PENDING.