Rutinitas DispatchPnP

Rutinitas DispatchPnP driver mendukung Plug and Play dengan menangani RUNPS untuk kode fungsi I/O IRP_MJ_PNP. Terkait dengan kode fungsi IRP_MJ_PNP adalah beberapa kode fungsi I/O kecil (lihat Plug and Play Runtime integrasi Minor), beberapa di antaranya harus ditangani oleh semua driver dan beberapa di antaranya dapat ditangani secara opsional. Manajer PnP menggunakan kode fungsi kecil ini untuk mengarahkan driver untuk memulai, menghentikan, dan menghapus perangkat dan untuk mengkueri driver tentang perangkat mereka.

Semua driver untuk perangkat harus memiliki kesempatan untuk menangani IRP PnP untuk perangkat, kecuali dalam beberapa kasus di mana fungsi atau driver filter diizinkan untuk gagal IRP.

Rutinitas DispatchPnP setiap driver harus mengikuti aturan berikut:

  • Fungsi atau driver filter harus meneruskan IRP PnP ke driver berikutnya di tumpukan perangkat, kecuali fungsi atau driver filter menangani IRP dan mengalami kegagalan (karena sumber daya yang tidak mencukupi, misalnya).

    Semua driver untuk perangkat harus memiliki kesempatan untuk menangani IRP PnP untuk perangkat kecuali salah satu driver mengalami kesalahan. Manajer PnP mengirim IRP ke driver teratas dalam tumpukan perangkat. Driver fungsi dan filter meneruskan IRP ke driver berikutnya, dan driver bus induk menyelesaikan IRP. Lihat Meneruskan RUNTIME PnP Ke Bawah Tumpukan Perangkat untuk informasi selengkapnya.

    Driver dapat gagal dalam IRP jika mencoba menangani IRP dan mengalami kesalahan (seperti sumber daya yang tidak mencukupi). Jika driver menerima IRP dengan kode yang tidak ditanganinya, driver tidak boleh gagal IRP. Ini harus meneruskan IRP seperti itu ke driver berikutnya tanpa memodifikasi status IRP.

  • Driver harus menangani IRP PnP tertentu dan dapat secara opsional menangani orang lain.

    Setiap driver PnP diperlukan untuk menangani runtime integrasi tertentu, seperti IRP_MN_REMOVE_DEVICE, dan dapat menangani orang lain secara opsional. Lihat Plug and Play IRP Minor untuk informasi tentang IRP mana yang diperlukan dan opsional untuk setiap jenis driver (driver fungsi, driver filter, dan driver bus).

    Driver dapat gagal IRP PnP yang diperlukan dengan status kesalahan yang sesuai, tetapi driver tidak boleh mengembalikan STATUS_NOT_SUPPORTED untuk IRP tersebut.

  • Jika driver berhasil menangani IRP PnP, driver menetapkan status IRP ke sukses. Ini tidak bergantung pada driver lain dalam tumpukan untuk mengatur status.

    Driver menetapkan Irp-IoStatus.Status> ke STATUS_SUCCESS untuk memberi tahu manajer PnP bahwa driver berhasil menangani IRP. Untuk beberapa IRP, pengemudi non-bus mungkin dapat mengandalkan pengemudi bus induknya untuk mengatur status menjadi sukses. Namun, ini adalah praktik berisiko. Untuk konsistensi dan ketahanan, driver harus menetapkan status IRP ke sukses untuk setiap IRP PnP yang berhasil ditanganinya.

  • Jika driver gagal dalam IRP, driver menyelesaikan IRP dengan status kesalahan dan tidak meneruskan IRP ke driver berikutnya.

    Untuk gagal dalam IRP seperti IRP_MN_QUERY_STOP_DEVICE, driver mengatur Irp-IoStatus.Status> ke STATUS_UNSUCCESSFUL. Nilai status kesalahan tambahan untuk runtime integrasi lainnya termasuk STATUS_INSUFFICIENT_RESOURCES dan STATUS_INVALID_DEVICE_STATE.

    Driver tidak mengatur STATUS_NOT_SUPPORTED untuk IRP yang mereka tangani. Ini adalah status awal yang ditetapkan oleh manajer PnP. Jika IRP selesai dengan status ini, itu berarti bahwa tidak ada driver di tumpukan yang menangani IRP; semua driver baru saja melewati IRP ke driver berikutnya.

  • Driver harus menangani IRP PnP dalam rutinitas pengirimannya (pada cara IRP menuruni tumpukan perangkat), dalam rutinitas IoCompletion (dengan cara IRP mencadangkan tumpukan perangkat), atau keduanya, seperti yang ditentukan di halaman referensi untuk IRP.

    Beberapa IRP PnP, seperti IRP_MN_REMOVE_DEVICE, harus ditangani terlebih dahulu oleh driver di bagian atas tumpukan perangkat dan kemudian oleh setiap driver berikutnya yang lebih rendah. Lainnya, seperti IRP_MN_START_DEVICE, harus ditangani terlebih dahulu oleh sopir bus induk. Masih yang lain, seperti IRP_MN_QUERY_CAPABILITIES, dapat ditangani baik dalam perjalanan turun tumpukan perangkat dan jalan kembali ke atas. Lihat Plug and Play Runtime integrasi Minor untuk aturan yang berlaku untuk setiap IRP PnP. Lihat Menunda Pemrosesan IRP PnP Hingga Driver Yang Lebih Rendah Selesai Untuk informasi tentang penanganan runtime integrasi PnP yang harus diproses terlebih dahulu oleh pengemudi bus induk.

  • Driver harus menambahkan informasi ke IRP pada cara IRP menumpuk perangkat dan memodifikasi atau menghapus informasi tentang cara IRP mencadangkan.

    Saat mengembalikan informasi sebagai respons terhadap IRP kueri PnP, driver harus mengikuti konvensi ini untuk mengaktifkan informasi tertib yang diteruskan oleh driver berlapis untuk perangkat.

  • Kecuali jika didokumenkan secara eksplisit, driver tidak boleh bergantung pada RUNTIME PnP yang dikirim dalam urutan tertentu.

  • Ketika driver mengirim IRP PnP, driver harus mengirim IRP ke driver teratas di tumpukan perangkat.

    Sebagian besar IRP PnP dikirim oleh manajer PnP, tetapi beberapa dapat dikirim oleh driver (misalnya, IRP_MN_QUERY_INTERFACE). Driver harus mengirim IRP PnP ke driver di bagian atas tumpukan perangkat. Panggil IoGetAttachedDeviceReference untuk mendapatkan penunjuk ke objek perangkat untuk driver di bagian atas tumpukan perangkat.