IRP_MN_QUERY_ID

Driver bus harus menangani permintaan BusQueryDeviceID untuk perangkat anak mereka (PDO anak). Driver bus dapat menangani permintaan untuk BusQueryHardwareIDs, BusQueryCompatibleIDs, dan BusQueryInstanceID untuk perangkat anak mereka.

Dimulai dengan Windows 7, driver bus juga harus menangani permintaan BusQueryContainerID untuk PDO anak mereka.

Untuk informasi selengkapnya tentang pengidentifikasi (ID) ini, lihat String Identifikasi Perangkat.

Catatan Driver fungsi dan driver filter tidak menangani IRP ini.

Nilai

0x13

Kode Utama

IRP_MJ_PNP

Ketika Dikirim

Manajer PnP mengirimkan IRP ini ketika perangkat dijumlahkan. Driver mungkin mengirim IRP ini untuk mengambil ID instans untuk salah satu perangkatnya.

Manajer dan driver PnP mengirim IRP ini di IRQL PASSIVE_LEVEL dalam konteks utas arbitrer.

Parameter Input

Anggota Parameters.QueryId.IdType dari struktur IO_STACK_LOCATION menentukan jenis ID yang diminta. Nilai yang mungkin termasuk BusQueryDeviceID, BusQueryHardwareIDs, BusQueryCompatibleIDs, BusQueryInstanceID, dan BusQueryContainerID. Jenis ID berikut dicadangkan: BusQueryDeviceSerialNumber.

Parameter Output

Dikembalikan di blok status I/O.

Blok Status I/O

Driver mengatur Irp-IoStatus.Status> ke STATUS_SUCCESS atau ke status kesalahan yang sesuai.

Setelah berhasil, driver mengatur Irp-IoStatus.Information> ke pointer WCHAR yang menunjuk ke informasi yang diminta. Jika terjadi kesalahan, driver mengatur Irp-IoStatus.Information> ke nol.

Operasi

Jika driver mengembalikan ID sebagai respons terhadap IRP ini, driver mengalokasikan struktur WCHAR dari kumpulan halaman untuk berisi ID. Manajer PnP membebaskan struktur ketika tidak lagi diperlukan.

Driver mengembalikan salah satu hal berikut ini:

  • String REG_SZ sebagai respons terhadap permintaan BusQueryDeviceID, BusQueryInstanceID, atau, BusQueryContainerID.

  • String REG_MULTI_SZ sebagai respons terhadap permintaan BusQueryHardwareIDs atau BusQueryCompatibleIDs.

Jika driver mengembalikan ID dengan karakter ilegal, sistem akan memeriksa bug. Karakter dengan nilai berikut ilegal dalam ID untuk IRP ini:

  • Kurang dari atau sama dengan 0x20 (' ')

  • Lebih besar dari 0x7F

  • Sama dengan 0x2C (',')

Driver harus sesuai dengan batasan panjang berikut untuk ID:

  • Setiap ID perangkat keras atau ID kompatibel yang dikembalikan driver dalam IRP ini harus kurang dari MAX_DEVICE_ID_LEN karakter. Konstanta ini saat ini memiliki nilai 200 seperti yang didefinisikan dalam sdk\inc\cfgmgr32.h.

  • ID kontainer yang dikembalikan driver dalam IRP ini harus diformat sebagai pengidentifikasi unik global (GUID), dan harus MAX_GUID_STRING_LEN karakter, yang mencakup terminator null.

  • Jika driver bus menyediakan ID instans yang unik secara global untuk perangkat turunannya (artinya, driver mengatur DEVICE_CAPABILITIES. UniqueID untuk perangkat), maka kombinasi ID perangkat ditambah ID instans harus kurang dari (MAX_DEVICE_ID_LEN - 1) karakter. Sistem operasi memerlukan karakter tambahan untuk pemisah jalur.

  • Jika driver bus tidak menyediakan ID instans yang unik secara global untuk perangkat turunannya, maka kombinasi ID perangkat ditambah ID instans harus kurang dari (MAX_DEVICE_ID_LEN - 28). Nilai persamaan ini saat ini adalah 172.

Driver bus harus siap untuk menangani IRP ini untuk perangkat anak segera setelah perangkat dijumlahkan.

Menentukan BusQueryDeviceID dan BusQueryInstanceID

Nilai yang disediakan driver bus untuk BusQueryDeviceID dan BusQueryInstanceID memungkinkan sistem operasi membedakan perangkat dari perangkat lain di komputer. Sistem operasi menggunakan ID perangkat dan ID instans yang dikembalikan di IRP IRP_MN_QUERY_ID dan bidang ID unik yang dikembalikan dalam IRP IRP_MN_QUERY_CAPABILITIES untuk menemukan informasi registri untuk perangkat.

Untuk BusQueryDeviceID, driver bus menyediakan ID perangkat perangkat. ID perangkat harus berisi deskripsi perangkat yang paling spesifik, yang menggabungkan nama enumerator dan string yang mengidentifikasi produsen, perangkat, revisi, packager, dan produk kemasan, jika memungkinkan. Misalnya, driver bus PCI merespons dengan ID perangkat dari bentuk PCI\VEN_xxxx&DEV_xxxx&SUBSYS_xxxxxxxx&REV_xx, mengodekan kelima item yang disebutkan di atas. Namun, ID perangkat tidak boleh berisi informasi yang cukup untuk membedakan antara dua perangkat yang identik. Informasi ini harus dikodekan dalam ID instans.

Untuk BusQueryInstanceID, driver bus harus menyediakan string yang berisi ID instans untuk perangkat. Penyiapan dan driver bus menggunakan ID instans, dengan informasi lain, untuk membedakan antara dua perangkat yang identik di komputer. ID instans unik di seluruh komputer atau hanya unik pada bus induk perangkat.

Jika ID instans hanya unik di bus, driver bus menentukan string tersebut untuk BusQueryInstanceID tetapi juga menentukan nilai UniqueIDFALSE sebagai respons terhadap permintaan IRP_MN_QUERY_CAPABILITIES untuk perangkat. Jika UniqueIDFALSE, manajer PnP meningkatkan ID instans dengan menambahkan informasi tentang induk perangkat dan dengan demikian membuat ID unik di komputer. Dalam hal ini pengemudi bus tidak boleh mengambil langkah tambahan untuk membuat ID instans perangkatnya unik secara global; cukup kembalikan informasi kemampuan yang sesuai dan sistem operasi mengurusnya.

Jika driver bus dapat menyediakan ID unik global untuk setiap perangkat anak, seperti nomor seri, driver bus menentukan string tersebut untuk BusQueryInstanceID dan menentukan nilai UniqueIDTRUE sebagai respons terhadap permintaan IRP_MN_QUERY_CAPABILITIES untuk setiap perangkat.

Menentukan BusQueryHardwareIDs dan BusQueryCompatibleIDs

Nilai yang disediakan driver bus untuk BusQueryHardwareIDs dan BusQueryCompatibleIDs memungkinkan Penyiapan untuk menemukan driver yang sesuai untuk perangkat anak bus.

Pengemudi bus menanggapi setiap permintaan ini dengan daftar ID REG_MULTI_SZ yang menjelaskan perangkat. Panjang maksimum, dalam karakter, dari daftar ID, termasuk dua karakter NULL yang mengakhiri daftar, REGSTR_VAL_MAX_HCID_LEN.

Saat mengembalikan lebih dari satu ID perangkat keras dan/atau lebih dari satu ID yang kompatibel, driver bus harus mencantumkan ID dalam urutan yang paling spesifik bagi yang paling umum untuk memfasilitasi pemilihan kecocokan driver terbaik untuk perangkat. Entri pertama dalam daftar ID perangkat keras adalah deskripsi perangkat yang paling spesifik dan, dengan demikian, biasanya identik dengan ID perangkat.

Penyiapan memeriksa ID terhadap ID yang tercantum dalam file INF untuk kemungkinan kecocokan. Penyetelan pertama-tama memindai daftar ID perangkat keras, lalu daftar ID yang kompatibel. Entri sebelumnya diperlakukan sebagai deskripsi perangkat yang lebih spesifik, dan entri selanjutnya sebagai kecocokan yang lebih umum (dan dengan demikian kurang optimal) untuk perangkat. Jika tidak ada kecocokan yang ditemukan dalam daftar ID perangkat keras, Penyetelan mungkin meminta media penginstalan kepada pengguna sebelum beralih ke daftar ID yang kompatibel.

Lihat Plug and Play aturan umum untuk menangani Plug and Play runtime integrasi kecil.

Menentukan BusQueryContainerIDs

Dimulai dengan Windows 7, driver bus harus menyediakan string untuk BusQueryContainerID yang berisi ID kontainer untuk perangkat. ID kontainer memungkinkan sistem operasi untuk mengelompokkan semua perangkat fungsional dari satu perangkat fisik yang dapat dilepas. Misalnya, semua perangkat fungsional dari perangkat multifungsi yang dapat dilepas memiliki ID kontainer yang sama. Untuk informasi selengkapnya tentang melaporkan ID kontainer dalam kasus khusus, seperti perangkat volume yang dapat mencakup beberapa disk dalam beberapa kontainer tetapi bukan milik kontainer apa pun, lihat Gambaran Umum ID Kontainer.

Perangkat fisik yang dapat dilepas didefinisikan sebagai perangkat anak bahwa driver bus menentukan kemampuan TRUEyang dapat dilepas sebagai respons terhadap permintaan IRP_MN_QUERY_CAPABILITIES. Untuk informasi selengkapnya tentang nilai Dapat Dilepas , lihat DEVICE_CAPABILITIES.

Driver bus membuat ID kontainer berdasarkan ID unik khusus bus yang disediakan perangkat. Untuk informasi selengkapnya, lihat Bagaimana ID Kontainer Dihasilkan.

Driver harus gagal dalam permintaan IRP dan mengatur IoStatus.Status ke STATUS_NOT_SUPPORTED jika salah satu hal berikut ini benar:

  • Perangkat tidak mendukung ID unik khusus bus yang dapat digunakan driver bus untuk menghasilkan ID kontainer.

  • Driver bus sebelumnya telah menentukan kemampuan False yang dapat dilepas sebagai respons terhadap permintaan IRP_MN_QUERY_CAPABILITIES untuk perangkat.

Mengirim IRP ini

Biasanya, hanya manajer PnP yang mengirim IRP ini.

Untuk mendapatkan ID perangkat keras atau ID yang kompatibel untuk perangkat, panggil IoGetDeviceProperty alih-alih mengirim IRP ini.

Driver mungkin mengirim IRP ini untuk mengambil ID instans untuk salah satu perangkatnya. Misalnya, pertimbangkan perangkat ISA PnP multifungsi yang fungsinya tidak beroperasi secara independen. Manajer PnP menghitung fungsi sebagai perangkat terpisah, tetapi driver untuk perangkat tersebut mungkin diperlukan untuk mengaitkan satu atau beberapa fungsi. Karena PnP ISA menjamin ID instans unik, driver untuk perangkat multifungsi tersebut dapat menggunakan ID instans untuk menemukan fungsi yang berada di perangkat yang sama. Driver untuk perangkat tersebut juga harus mendapatkan nama enumerator perangkat dengan memanggil IoGetDeviceProperty, untuk mengonfirmasi bahwa perangkat tersebut adalah perangkat PnP ISA.

Lihat Menangani IRP untuk informasi tentang pengiriman RUNPS. Langkah-langkah berikut berlaku khusus untuk IRP ini:

  • Atur nilai di lokasi tumpukan I/O berikutnya dari IRP: atur MajorFunction ke IRP_MJ_PNP, atur MinorFunction ke IRP_MN_QUERY_ID, dan atur Parameters.QueryId.IdType ke BusQueryInstanceID.

  • Atur IoStatus.Status ke STATUS_NOT_SUPPORTED.

Selain mengirim IRP ID kueri, driver harus memanggil IoGetDeviceProperty untuk mendapatkan DevicePropertyEnumeratorName untuk perangkat.

Setelah IRP selesai dan driver selesai dengan ID, driver harus membebaskan struktur ID yang dikembalikan oleh driver yang menangani IRP kueri.

Persyaratan

Header

Wdm.h (termasuk Wdm.h, Ntddk.h, atau Ntifs.h)

Lihat juga

String Identifikasi Perangkat

IoGetDeviceProperty