Bagikan melalui


Meneruskan IRP PnP Ke Bawah Tumpukan Perangkat

Manajer PnP menggunakan IRP untuk mengarahkan driver untuk memulai, menghentikan, dan menghapus perangkat dan untuk meminta informasi dari 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 IRP minor Plug and Play, lihat Plug and Play Minor IRPs.

Semua driver untuk perangkat harus memiliki kesempatan untuk menanggapi IRP PnP, kecuali jika ada driver dalam tumpukan yang gagal memproses IRP. (Lihat gambar berikut.)

diagram yang mengilustrasikan mengirim Plug and Play IRP ke susunan 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 tingkat bawah, seperti ID instance unik atau kemampuan manajemen daya yang didukung oleh driver bus induk, yang dilaporkan.

IRP PnP bergerak kembali ke atas stack 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 cocok untuk IRP.
    3. Siapkan lokasi tumpukan berikutnya dengan IoSkipCurrentIrpStackLocation atau IoCopyCurrentIrpStackLocationToNext. Panggil rutinitas terakhir jika Anda mengatur rutinitas IoCompletion .
    4. Atur rutinitas IoCompletion , jika perlu.
    5. Jangan selesaikan IRP. (Jangan panggil IoCompleteRequest.) Sopir bus induk akan menyelesaikan IRP.
  • Jika driver tidak melakukan tindakan untuk IRP ini, driver 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 tetapkan rutinitas IoCompletion.
    4. Jangan selesaikan IRP. (Jangan panggil IoCompleteRequest.) Sopir bus induk akan menyelesaikan IRP.

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

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