Bagikan melalui


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 serta filter dalam menyusun 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 menggambarkan menghitung dan melaporkan perangkat plug and play.

Catatan berikut 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 perangkat tersebut.

  2. Driver fungsional untuk perangkat bus menemukan bahwa ada perangkat baru di busnya.

    Bagaimana pengemudi menentukan hal ini tergantung pada arsitektur bus. Untuk beberapa bus, pengemudi fungsi bus menerima pemberitahuan hot-plug perangkat baru. Jika bus tidak mendukung pemberitahuan hot-plug, pengguna harus mengambil tindakan yang sesuai di Control Panel agar bus bisa diidentifikasi.

    Dalam contoh ini, bus USB mendukung pemberitahuan hot-plug sehingga driver fungsi perangkat untuk bus USB diberi tahu bahwa perubahannya telah terjadi.

  3. Driver fungsional untuk perangkat bus memberi tahu manajer PnP bahwa set perangkat anak telah berubah.

    Driver fungsi memberi tahu manajer PnP dengan memanggil IoInvalidateDeviceRelations dengan jenis dari BusRelations.

  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, menandakan bahwa manajer PnP meminta daftar perangkat saat ini yang tersedia pada bus (hubungan bus).

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

  5. Driver fungsi pada perangkat bus menangani IRP.

    Lihat halaman referensi IRP_MN_QUERY_DEVICE_RELATIONS untuk informasi lengkap tentang cara menangani IRP ini.

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

    Ketika driver bus induk hub USB (pasangan driver kelas pengontrol host USB/minikelas) menyelesaikan IRP, IRP bergerak kembali ke atas tumpukan perangkat dengan menggunakan rutinitas IoCompletion yang didaftarkan oleh driver hub.

Perhatikan bahwa driver fungsi bus melaporkan perubahan dalam daftar perangkat anak dengan meminta agar manajer PnP mengkueri informasi tentang daftar perangkat anaknya. Permintaan IRP_MN_QUERY_DEVICE_RELATIONS yang dihasilkan dilihat oleh semua driver pada perangkat bus. Biasanya, driver fungsi bus adalah satu-satunya pengemudi yang menangani IRP dan melaporkan anak-anak. Dalam beberapa tumpukan perangkat, driver filter bus ada dan berpartisipasi dalam membentuk 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 dilakukan.

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

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

Catatan berikut 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 IRP_MN_QUERY_DEVICE_RELATIONS dengan daftar 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 sebuah devnode untuk joystick tersebut. Pada titik ini, satu-satunya driver yang dikonfigurasi untuk joystick adalah driver bus hub USB utama, yang membuat PDO joystick. Setiap driver filter bus opsional juga akan hadir di tumpukan perangkat, tetapi contoh ini menghilangkan driver filter bus demi kesederhanaan.

    Devnode joystick merupakan anak dari devnode hub USB, ditunjukkan oleh panah lebar antara dua devnode pada gambar sebelumnya.

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

    Manajer PnP mengirimkan urutan IRP ke stack perangkat untuk mengumpulkan informasi tentang perangkat. Pada titik ini, susunan perangkat hanya terdiri dari PDO yang dibuat oleh driver bus induk perangkat dan filter DO untuk driver filter bus yang bersifat opsional. Oleh karena itu, sopir bus dan pengemudi 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 mengirimkan IRP ke stack perangkat. IRP ini mencakup hal-hal berikut:

    Manajer PnP mengirimkan IRP yang tercantum di atas pada tahap pemrosesan perangkat PnP baru, 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 IRP 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 pada registri disediakan 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 langsung mengakses cabang Enum dari driver. Informasi Enum berikut ini hanya tercantum untuk tujuan penelusuran kesalahan.

    • Manajer PnP membuat subkunci untuk perangkat di bawah kunci 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 dienumerasi oleh driver bus induk, seperti PCI atau PCMCIA. Beberapa perangkat didaftarkan oleh driver penyaring bus, seperti ACPI.

    • Manajer PnP membuat subkunci untuk instans perangkat ini.

      Jika Capabilities.UniqueID dikembalikan sebagai TRUE untuk IRP_MN_QUERY_CAPABILITIES, maka ID unik perangkat tersebut bersifat 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 subkunci untuk instans perangkat.

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

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

Diagram yang mengilustrasikan menemukan fungsi dan driver filter.

Catatan berikut ini sesuai dengan lingkaran bernomor di gambar sebelumnya:

  1. Pengelola PnP berbasis kernel berkoordinasi dengan pengelola PnP berbasis pengguna dan komponen Penyiapan berbasis pengguna untuk menemukan driver fungsi dan filter untuk perangkat, jika memang ada.

    Manajer PnP dalam mode kernel mengantrekan sebuah peristiwa ke manajer PnP dalam mode pengguna, mengidentifikasi perangkat yang perlu diinstal. Setelah pengguna istimewa masuk, komponen dalam mode pengguna mulai mencari driver. Untuk informasi tentang komponen penyiapan dan perannya dalam menginstal perangkat, lihat Penginstalan Perangkat dan Driver.

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

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

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

Diagram yang mengilustrasikan memanggil rutinitas adddevice dan memulai perangkat baru.

Catatan berikut ini sesuai dengan lingkaran bernomor di gambar sebelumnya:

  1. Driver filter lapisan bawah

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

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

  2. Penggerak fungsi

    Setelah filter tingkat bawah terpasang, pengelola 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 minikelas HID. Kedua pengemudi bekerja sama untuk bertindak sebagai driver fungsi. Pasangan driver hanya membuat satu FDO dan melampirkannya ke tumpukan perangkat.

  3. driver filter lapisan atas

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

    Dalam contoh ini, ada satu driver penapis bagian 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 serangkaian IRP berhenti dan mulai selama proses penyeimbangan ulang, tetapi proses penyeimbangan ulang ini 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 IRP_MN_START_DEVICE 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 "start IRP" berhasil diselesaikan, manajer PnP mengirimkan IRP IRP_MN_QUERY_CAPABILITIES 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 dilepas.

    • IRP_MN_QUERY_DEVICE_RELATIONS untuk relasi bus

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

Menggunakan GUID_PNP_LOCATION_INTERFACE

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

Untuk menerapkan antarmuka ini di driver Anda, mengelola IRP IRP_MN_QUERY_INTERFACE dengan InterfaceType = GUID_PNP_LOCATION_INTERFACE. Driver Anda menyediakan penunjuk ke struktur PNP_LOCATION_INTERFACE yang berisi penunjuk ke fungsi individu antarmuka. rutin PnpGetLocationString menyediakan bagian yang spesifik terhadap perangkat dari properti SPDRP_LOCATION_PATHS perangkat.