Meneruskan IRP PnP Ke Bawah Tumpukan Perangkat

Manajer PnP menggunakan IRP untuk mengarahkan driver untuk memulai, menghentikan, dan menghapus perangkat dan untuk mengkueri driver tentang perangkat mereka. Semua IRP PnP memiliki kode fungsi utama IRP_MJ_PNP, dan semua driver PnP harus menyediakan rutinitas DispatchPnP untuk melayani kode fungsi ini. Manajer PnP menginisialisasi Irp-IoStatus.Status> ke STATUS_NOT_SUPPORTED saat mengirim IRP. Untuk informasi selengkapnya, lihat Rutinitas DispatchPnP.

Untuk daftar RUNP minor PnP, lihat Plug and Play Runtime integrasi Minor.

Semua driver untuk perangkat harus memiliki kesempatan untuk menanggapi IRP PnP kecuali driver di tumpukan gagal IRP. (Lihat gambar berikut.)

diagram yang mengilustrasikan melewati plug and play irp ke tumpukan perangkat.

Tidak ada driver tunggal untuk perangkat yang dapat mengasumsikan bahwa itu adalah satu-satunya driver yang akan merespons IRP PnP. Pertimbangkan, misalnya, driver fungsi yang merespons permintaan IRP_MN_QUERY_CAPABILITIES dan menyelesaikan IRP tanpa meneruskannya ke driver berikutnya yang lebih rendah. Tidak ada kemampuan yang didukung oleh driver yang lebih rendah, seperti ID instans unik atau kemampuan manajemen daya yang didukung oleh pengemudi bus induk, dilaporkan.

IRP PnP melakukan perjalanan mencadangkan tumpukan perangkat ketika driver bus induk memanggil IoCompleteRequest dan manajer I/O memanggil rutinitas IoCompletion apa pun yang didaftarkan oleh driver fungsi atau driver filter.

Fungsi atau driver filter harus melakukan hal berikut saat menerima IRP PnP:

  • Jika driver melakukan tindakan sebagai respons terhadap IRP:
    1. Lakukan tindakan yang sesuai.
    2. Atur Irp-IoStatus.Status> ke status yang sesuai, seperti STATUS_SUCCESS. Atur Irp-IoStatus.Information>, jika sesuai untuk IRP.
    3. Siapkan lokasi tumpukan berikutnya dengan IoSkipCurrentIrpStackLocation atau IoCopyCurrentIrpStackLocationToNext. Panggil rutinitas terakhir jika Anda menetapkan rutinitas IoCompletion .
    4. Atur rutinitas IoCompletion , jika perlu.
    5. Jangan selesaikan IRP. (Jangan panggil IoCompleteRequest.) Pengemudi bus induk akan menyelesaikan IRP.
  • Jika driver tidak melakukan tindakan untuk IRP ini, itu hanya bersiap untuk meneruskan IRP ke driver berikutnya:
    1. Panggil IoSkipCurrentIrpStackLocation untuk menghapus lokasi tumpukannya dari IRP.
    2. Jangan atur bidang apa pun di Irp-IoStatus>.
    3. Jangan atur rutinitas IoCompletion .
    4. Jangan selesaikan IRP. (Jangan panggil IoCompleteRequest.) Pengemudi bus induk akan menyelesaikan IRP.

Jika fungsi atau driver filter tidak gagal dalam IRP, itu meneruskan IRP ke driver berikutnya yang lebih rendah dengan IoCallDriver. Pengemudi memiliki penunjuk ke pengemudi yang lebih rendah berikutnya; pointer tersebut dikembalikan dari panggilan IoAttachDeviceToDeviceStack dalam rutinitas AddDevice driver yang lebih tinggi.

Pengemudi bus induk menyelesaikan IRP setelah melakukan tugas apa pun untuk merespons IRP. Setelah driver bus memanggil IoCompleteRequest, manajer I/O memanggil rutinitas IoCompletion apa pun yang didaftarkan oleh fungsi atau driver filter untuk perangkat.