Menambahkan Perangkat PnP ke Sistem yang Sedang Berjalan

Bagian ini menjelaskan urutan peristiwa yang terjadi ketika sistem mengonfigurasi perangkat PnP yang telah ditambahkan pengguna ke komputer yang sedang berjalan. Diskusi ini menyoroti peran manajer PnP, driver bus, dan driver fungsi dan filter dalam menghitung dan mengonfigurasi perangkat baru.

Sebagian besar diskusi ini juga relevan dengan mengonfigurasi perangkat PnP yang ada saat komputer di-boot. Secara khusus, perangkat yang drivernya ditandai SERVICE_DEMAND_START dalam file INF dikonfigurasi pada dasarnya dengan cara yang sama apakah perangkat ditambahkan secara dinamis atau ada pada waktu boot.

Gambar berikut menunjukkan langkah-langkah pertama dalam mengonfigurasi perangkat, mulai dari ketika pengguna menyambungkan perangkat keras ke komputer.

diagram yang mengilustrasikan menghitung dan melaporkan perangkat plug and play.

Catatan berikut ini sesuai dengan angka yang dilingkari pada gambar sebelumnya:

  1. Pengguna menyambungkan perangkat PnP ke slot gratis pada bus PnP.

    Dalam contoh ini, pengguna menyambungkan joystick USB PnP ke hub pada pengontrol host USB. Hub USB adalah perangkat bus PnP karena perangkat anak dapat dilampirkan ke dalamnya.

  2. Driver fungsi untuk perangkat bus menentukan bahwa perangkat baru berada di busnya.

    Bagaimana pengemudi menentukan hal ini tergantung pada arsitektur bus. Untuk beberapa bus, driver fungsi bus menerima pemberitahuan hot-plug perangkat baru. Jika bus tidak mendukung pemberitahuan hot-plug, pengguna harus mengambil tindakan yang tepat dalam Panel Kontrol menyebabkan bus dijumlahkan.

    Dalam contoh ini, bus USB mendukung pemberitahuan hot-plug sehingga driver fungsi untuk bus USB diberi tahu bahwa anak-anaknya telah berubah.

  3. Driver fungsi untuk perangkat bus memberi tahu manajer PnP bahwa set perangkat anaknya telah berubah.

    Driver fungsi memberi tahu manajer PnP dengan memanggil IoInvalidateDeviceRelations dengan JenisBusRelations.

  4. Manajer PnP meminta driver bus untuk daftar perangkat saat ini di bus.

    Manajer PnP mengirimkan permintaan IRP_MN_QUERY_DEVICE_RELATIONS ke tumpukan perangkat untuk bus. Nilai Parameters.QueryDeviceRelations.Type adalah BusRelations, yang menunjukkan bahwa manajer PnP meminta daftar perangkat saat ini yang ada di bus (hubungan bus).

    Manajer PnP mengirim IRP ke driver teratas di tumpukan perangkat untuk bus. Menurut aturan untuk RUNP PnP, setiap driver di tumpukan menangani IRP, jika sesuai, dan meneruskan IRP ke driver berikutnya.

  5. Driver fungsi untuk perangkat bus menangani IRP.

    Lihat halaman referensi untuk IRP_MN_QUERY_DEVICE_RELATIONS untuk informasi terperinci tentang penanganan IRP ini.

    Dalam contoh ini, driver hub USB menangani IRP ini untuk hub FDO. Driver hub membuat PDO untuk perangkat joystick dan menyertakan penunjuk yang direferensikan ke PDO joystick dalam daftar perangkat anak yang dikembalikan dengan IRP.

    Ketika driver bus induk hub USB (kelas pengontrol host USB/pasangan driver miniclass) menyelesaikan IRP, IRP melakukan pencadangan tumpukan perangkat dengan cara rutinitas IoCompletion apa pun yang didaftarkan oleh driver hub.

Perhatikan bahwa driver fungsi bus melaporkan perubahan dalam daftar anak-anaknya dengan meminta agar kueri manajer PnP untuk daftar perangkat anaknya. Permintaan IRP_MN_QUERY_DEVICE_RELATIONS yang dihasilkan terlihat oleh semua driver untuk perangkat bus. Biasanya, driver fungsi bus adalah satu-satunya pengemudi yang menangani IRP dan melaporkan anak-anak. Di beberapa tumpukan perangkat, sopir filter bus hadir dan berpartisipasi dalam membangun daftar relasi bus. Salah satu contohnya adalah ACPI, yang terpasang sebagai driver filter bus untuk perangkat ACPI. Di beberapa tumpukan perangkat, driver filter nonbus menangani permintaan IRP_MN_QUERY_DEVICE_RELATIONS , tetapi ini tidak umum.

Pada titik ini, manajer PnP memiliki daftar perangkat saat ini di bus. Manajer PnP kemudian menentukan apakah perangkat apa pun baru tiba atau telah dihapus. Dalam contoh ini, ada satu perangkat baru. Gambar berikut menunjukkan manajer PnP membuat devnode untuk perangkat baru dan mulai mengonfigurasi perangkat.

diagram yang mengilustrasikan pembuatan devnode untuk perangkat plug and play baru.

Catatan berikut ini sesuai dengan angka yang dilingkari pada gambar sebelumnya:

  1. Manajer PnP membuat devnodes untuk perangkat anak baru di bus.

    Manajer PnP membandingkan daftar relasi bus yang dikembalikan dalam IRP_MN_QUERY_DEVICE_RELATIONS IRP dengan daftar anak-anak untuk bus yang saat ini dicatat di pohon perangkat PnP. Manajer PnP membuat devnode untuk setiap perangkat baru dan memulai pemrosesan penghapusan untuk perangkat apa pun yang telah dihapus.

    Dalam contoh ini, ada satu perangkat baru (joystick), sehingga manajer PnP membuat devnode untuk joystick. Pada titik ini, satu-satunya driver yang dikonfigurasi untuk joystick adalah driver bus hub USB induk, yang membuat PDO joystick. Setiap driver filter bus opsional juga akan ada di tumpukan perangkat, tetapi contohnya menghilangkan driver filter bus untuk kesederhanaan.

    Panah lebar antara dua devnode pada gambar sebelumnya menunjukkan bahwa joystick devnode adalah anak dari devnode hub USB.

  2. Manajer PnP mengumpulkan informasi tentang perangkat baru dan mulai mengonfigurasi perangkat.

    Manajer PnP mengirimkan urutan RUN ke tumpukan perangkat untuk mengumpulkan informasi tentang perangkat. Pada titik ini, tumpukan perangkat hanya terdiri dari PDO yang dibuat oleh driver bus induk perangkat dan filter DO untuk setiap driver filter bus opsional. Oleh karena itu, sopir bus dan sopir filter bus adalah satu-satunya pengemudi yang merespons IRP ini. Dalam contoh ini, satu-satunya driver di tumpukan perangkat joystick adalah driver bus induk, driver hub USB.

    Manajer PnP mengumpulkan informasi tentang perangkat baru dengan mengirim RUN ke tumpukan perangkat. RUNP ini mencakup hal-hal berikut:

    Manajer PnP mengirim IRP yang tercantum di atas pada tahap pemrosesan perangkat PnP baru ini, tetapi belum tentu dalam urutan yang tercantum, jadi Anda tidak boleh membuat asumsi tentang urutan pengiriman IRP. Selain itu, Anda tidak boleh berasumsi bahwa manajer PnP hanya mengirim RUNP yang tercantum di atas.

    Manajer PnP memeriksa registri untuk menentukan apakah perangkat telah diinstal pada komputer ini sebelumnya. Manajer PnP memeriksa < subkunci enumerator>\<deviceID> untuk perangkat di bawah cabang Enum. Dalam contoh ini, perangkat baru dan harus dikonfigurasi "dari awal."

  3. Manajer PnP menyimpan informasi tentang perangkat di registri.

    Cabang Enum registri dicadangkan untuk digunakan oleh komponen sistem operasi dan tata letaknya dapat berubah. Penulis driver harus menggunakan rutinitas sistem untuk mengekstrak informasi yang terkait dengan driver. Jangan mengakses cabang Enum langsung dari driver. Informasi Enum berikut ini hanya tercantum untuk tujuan penelusuran kesalahan.

    • Manajer PnP membuat subkunci untuk perangkat di bawah kunci untuk enumerator perangkat.

      Manajer PnP membuat subkunci bernama HKLM\System\CurrentControlSet\Enum\<enumerator>\<deviceID>. Ini membuat < subkunci enumerator> jika belum ada.

      Enumerator adalah komponen yang menemukan perangkat PnP berdasarkan standar perangkat keras PnP. Tugas-tugas enumerator dilakukan oleh sopir bus PnP yang bermitra dengan manajer PnP. Perangkat biasanya dijumlahkan oleh pengemudi bus induknya, seperti PCI atau PCMCIA. Beberapa perangkat dijumlahkan oleh sopir filter bus, seperti ACPI.

    • Manajer PnP membuat subkunci untuk instans perangkat ini.

      Jika Capabilities.UniqueID dikembalikan sebagai TRUE untuk IRP_MN_QUERY_CAPABILITIES, ID unik perangkat unik di seluruh sistem. Jika tidak, manajer PnP memodifikasi ID sehingga unik di seluruh sistem.

      Manajer PnP membuat subkunci bernama HKLM\System\CurrentControlSet\Enum\<enumerator>\<deviceID instanceID>.>\<

    • Manajer PnP menulis informasi tentang perangkat ke subkuntus untuk instans perangkat.

      Manajer PnP menyimpan informasi, termasuk yang berikut ini, jika disediakan untuk perangkat:

      DeviceDesc — dari IRP_MN_QUERY_DEVICE_TEXT

      Lokasi — dari IRP_MN_QUERY_DEVICE_TEXT

      Kemampuan — bendera dari IRP_MN_QUERY_CAPABILITIES

      UINumber — dari IRP_MN_QUERY_CAPABILITIES

      HardwareID — dari IRP_MN_QUERY_ID

      CompatibleIDs — dari IRP_MN_QUERY_ID

      ContainerID — dari IRP_MN_QUERY_ID

      LogConf\BootConfig — dari IRP_MN_QUERY_RESOURCES

      LogConf\BasicConfigVector — dari IRP_MN_QUERY_RESOURCE_REQUIREMENTS

Pada titik ini, manajer PnP siap untuk menemukan driver fungsi dan driver filter untuk perangkat, jika ada. (Lihat gambar berikut.)

diagram yang mengilustrasikan fungsi penemuan dan driver filter.

Catatan berikut ini sesuai dengan lingkaran bernomor di gambar sebelumnya:

  1. Manajer PnP mode kernel berkoordinasi dengan manajer PnP mode pengguna dan komponen Penyiapan mode pengguna untuk menemukan fungsi dan driver filter untuk perangkat, jika ada.

    Manajer PnP mode kernel mengantrekan peristiwa ke manajer PnP mode pengguna, mengidentifikasi perangkat yang perlu diinstal. Setelah pengguna istimewa masuk, komponen mode pengguna dilanjutkan dengan menemukan driver. Lihat gambaran umum penginstalan perangkat Untuk informasi tentang komponen Penyiapan dan perannya dalam menginstal perangkat.

  2. Komponen Penyiapan mode pengguna mengarahkan manajer PnP mode kernel untuk memuat fungsi dan driver filter.

    Komponen mode pengguna memanggil kembali ke mode kernel untuk memuat driver, menyebabkan rutinitas AddDevice mereka dipanggil.

Gambar berikut menunjukkan manajer PnP yang memuat driver (jika sesuai), memanggil rutinitas AddDevice mereka, dan mengarahkan driver untuk memulai perangkat.

diagram yang mengilustrasikan rutinitas penambahan layanan panggilan dan memulai perangkat baru.

Catatan berikut ini sesuai dengan lingkaran bernomor di gambar sebelumnya:

  1. Driver filter bawah

    Sebelum driver fungsi melekat pada tumpukan perangkat, manajer PnP memproses driver filter yang lebih rendah. Untuk setiap driver filter bawah, manajer PnP memanggil rutinitas DriverEntry driver jika driver belum dimuat. Kemudian manajer PnP memanggil rutinitas AddDevice driver. Dalam rutinitas AddDevice-nya , driver filter membuat objek perangkat filter (filter DO) dan melampirkannya ke tumpukan perangkat (IoAttachDeviceToDeviceStack). Setelah melampirkan objek perangkatnya ke tumpukan perangkat, driver dilibatkan sebagai driver untuk perangkat.

    Dalam contoh joystick USB, ada satu driver filter bawah untuk perangkat.

  2. Driver fungsi

    Setelah filter yang lebih rendah terpasang, manajer PnP memproses driver fungsi. Manajer PnP memanggil rutinitas DriverEntry driver fungsi jika driver belum dimuat dan memanggil rutinitas AddDevice driver fungsi. Driver fungsi membuat objek perangkat fungsi (FDO) dan melampirkannya ke tumpukan perangkat.

    Dalam contoh ini, driver fungsi untuk joystick USB sebenarnya adalah sepasang driver: driver kelas HID dan driver miniclass HID. Kedua driver bekerja sama untuk berfungsi sebagai driver fungsi. Pasangan driver hanya membuat satu FDO dan melampirkannya ke tumpukan perangkat.

  3. Driver filter atas

    Setelah driver fungsi terpasang, manajer PnP memproses driver filter atas.

    Dalam contoh ini, ada satu driver filter atas untuk perangkat.

  4. Menetapkan sumber daya dan memulai perangkat

    Manajer PnP menetapkan sumber daya ke perangkat, jika diperlukan, dan mengeluarkan IRP untuk memulai perangkat.

    • Menetapkan sumber daya

      Sebelumnya dalam proses konfigurasi, manajer PnP mengumpulkan persyaratan sumber daya perangkat keras untuk perangkat dari driver bus induk perangkat. Setelah set lengkap driver dimuat untuk perangkat, manajer PnP mengirimkan permintaan IRP_MN_FILTER_RESOURCE_REQUIREMENTS ke tumpukan perangkat. Semua driver dalam tumpukan memiliki kesempatan untuk menangani IRP ini dan memodifikasi daftar persyaratan sumber daya perangkat, jika perlu.

      Manajer PnP menetapkan sumber daya ke perangkat, jika perangkat memerlukannya, berdasarkan persyaratan perangkat dan sumber daya yang saat ini tersedia.

      Manajer PnP mungkin perlu mengatur ulang penetapan sumber daya perangkat yang ada untuk memenuhi kebutuhan perangkat baru. Penetapan kembali sumber daya ini disebut "penyeimbangan ulang." Driver untuk perangkat yang ada menerima urutan penghentian dan memulai IRP selama penyeimbangan ulang, tetapi penyeimbangan ulang harus transparan bagi pengguna.

      Dalam contoh joystick USB, perangkat USB tidak memerlukan sumber daya perangkat keras sehingga manajer PnP mengatur daftar sumber daya ke NULL.

    • Memulai perangkat (IRP_MN_START_DEVICE)

      Setelah manajer PnP menetapkan sumber daya ke perangkat, manajer PnP mengirimkan IRP_MN_START_DEVICE IRP ke tumpukan perangkat untuk mengarahkan driver untuk memulai perangkat.

    Setelah perangkat dimulai, manajer PnP mengirimkan tiga IRP lagi ke driver untuk perangkat:

    • IRP_MN_QUERY_CAPABILITIES

      Setelah IRP mulai berhasil diselesaikan, manajer PnP mengirimkan IRP_MN_QUERY_CAPABILITIES IRP lain ke tumpukan perangkat. Semua driver untuk perangkat memiliki opsi untuk menangani IRP. Manajer PnP mengirimkan IRP ini saat ini, setelah semua driver terpasang dan perangkat dimulai, karena fungsi atau driver filter mungkin perlu mengakses perangkat untuk mengumpulkan informasi kemampuan.

    • IRP_MN_QUERY_PNP_DEVICE_STATE

      IRP ini memberi driver kesempatan untuk, misalnya, melaporkan bahwa perangkat tidak boleh ditampilkan di antarmuka pengguna seperti Device Manager dan program Hotplug. Ini berguna untuk perangkat yang ada pada sistem tetapi tidak dapat digunakan dalam konfigurasi saat ini, seperti port game pada laptop yang tidak dapat digunakan ketika laptop dilepaskan.

    • IRP_MN_QUERY_DEVICE_RELATIONS untuk relasi bus

      Manajer PnP mengirimkan IRP ini untuk menentukan apakah perangkat memiliki perangkat turunan. Jika demikian, manajer PnP mengonfigurasi setiap perangkat anak.

Menggunakan GUID_PNP_LOCATION_INTERFACE

Antarmuka GUID_PNP_LOCATION_INTERFACE memasok properti perangkat SPDRP_LOCATION_PATHS Plug and Play (PnP) untuk perangkat.

Untuk mengimplementasikan antarmuka ini di driver Anda, tangani IRP IRP_MN_QUERY_INTERFACE dengan InterfaceType = GUID_PNP_LOCATION_INTERFACE. Driver Anda menyediakan pointer ke struktur PNP_LOCATION_INTERFACE yang berisi pointer ke rutinitas antarmuka individu. Rutinitas PnpGetLocationString menyediakan bagian khusus perangkat dari properti SPDRP_LOCATION_PATHS perangkat.