Menentukan Urutan Beban Pengandar
Untuk sebagian besar sistem, hierarki fisik perangkat di komputer menentukan urutan driver beban Windows dan manajer PnP. Windows dan manajer PnP mengonfigurasi perangkat yang dimulai dengan perangkat root sistem, dan kemudian mereka mengonfigurasi perangkat anak dari perangkat root (misalnya, adaptor PCI), anak-anak perangkat tersebut, dan sebagainya. Manajer PnP memuat driver untuk setiap perangkat saat perangkat dikonfigurasi, jika driver sebelumnya tidak dimuat untuk perangkat lain.
Pengaturan dalam file INF dapat memengaruhi urutan beban driver. Topik ini menjelaskan nilai relevan yang harus ditentukan vendor di bagian penginstalan layanan yang direferensikan oleh arahan INF AddService driver. Secara khusus, topik ini membahas entri StartType, BootFlags, LoadOrderGroup, dan Dependensi .
Driver harus mengikuti aturan ini untuk menentukan StartType:
Driver PnP tidak diperlukan di awal boot
Driver PnP harus memiliki jenis awal SERVICE_DEMAND_START (0x3), menentukan bahwa manajer PnP dapat memuat driver ketika manajer PnP menemukan perangkat yang layanan driver.
Driver untuk perangkat yang diperlukan untuk memulai komputer
Jika perangkat diperlukan untuk memulai komputer, driver untuk perangkat harus memiliki jenis awal SERVICE_BOOT_START (0x0).
Driver non-boot-start yang mendeteksi perangkat yang tidak dapat dijumlahkan PnP
Untuk perangkat yang tidak dapat dijumlahkan PnP, driver melaporkan perangkat ke manajer PnP dengan memanggil IoReportRootDevice atau IoReportDetectedDevice. Driver seperti itu harus memiliki jenis mulai SERVICE_SYSTEM_START (0x01) sehingga Windows akan memuat driver selama inisialisasi sistem.
Hanya driver yang melaporkan perangkat keras non-PnP yang harus mengatur jenis mulai ini. Jika layanan driver baik perangkat PnP maupun non-PnP, itu harus mengatur jenis mulai ini.
Driver non-PnP yang harus dimulai oleh manajer kontrol layanan
Driver seperti itu harus memiliki jenis mulai SERVICE_AUTO_START (0x02). Driver PnP tidak boleh mengatur tipe mulai ini.
Driver PnP harus ditulis sehingga dapat dimuat ketika Windows mengonfigurasi perangkat yang layanan drivernya. Sebaliknya, driver harus dapat dibongkar kapan saja manajer PnP menentukan bahwa tidak ada lagi perangkat yang ada bahwa layanan driver. Satu-satunya urutan beban driver yang harus diandalkan driver PnP adalah sebagai berikut:
Driver untuk perangkat anak dapat bergantung pada fakta bahwa driver untuk perangkat induk dimuat.
Driver di tumpukan perangkat dapat bergantung pada fakta bahwa driver apa pun di bawahnya dimuat.
Misalnya, driver fungsi dapat dipastikan bahwa driver filter yang lebih rendah dimuat.
Namun, ketahuilah bahwa driver di tumpukan perangkat tidak dapat bergantung pada dimuat secara berurutan setelah driver perangkat yang lebih rendah, karena driver mungkin telah dimuat sebelumnya ketika perangkat lain dikonfigurasi.
Driver filter dalam grup filter tidak dapat memprediksi urutan bebannya. Misalnya, jika perangkat memiliki tiga driver filter atas terdaftar, ketiga driver tersebut semuanya akan dimuat setelah driver fungsi tetapi dapat dimuat dalam urutan apa pun dalam grup filter atas mereka.
Jika driver memiliki dependensi urutan beban eksplisit pada driver lain, dependensi tersebut harus diterapkan melalui hubungan induk/anak. Driver untuk perangkat anak dapat bergantung pada driver untuk perangkat induk yang dimuat sebelum driver anak dimuat.
Untuk memperkuat pentingnya mengatur nilai StartType yang benar, daftar berikut ini menjelaskan bagaimana Windows dan manajer PnP menggunakan entri StartType dalam file INF:
Pada startup sistem, loader sistem operasi memuat driver jenis SERVICE_BOOT_START sebelum mentransfer kontrol ke kernel. Driver ini berada dalam memori ketika kernel mendapatkan kontrol.
Driver boot-start dimuat sebelum sebagian besar perangkat dikonfigurasi, sehingga urutan bebannya tidak dapat ditentukan oleh hierarki perangkat. Driver boot-start dapat menggunakan entri INF LoadOrderGroup untuk memesan pemuatannya. Sistem operasi mengabaikan entri Dependensi INF untuk driver boot-start.
Manajer PnP memanggil rutinitas DriverEntry dari driver SERVICE_BOOT_START sehingga driver dapat melayani perangkat boot.
Jika perangkat boot memiliki perangkat anak, perangkat tersebut akan dijumlahkan. Perangkat anak dikonfigurasi dan dimulai jika driver mereka juga merupakan driver boot-start. Jika driver perangkat tidak semua driver boot-start, manajer PnP membuat simpul perangkat (devnode) untuk perangkat tetapi belum memulai perangkat.
Setelah semua driver boot dimuat dan perangkat boot dimulai, manajer PnP mengonfigurasi perangkat PnP lainnya dan memuat driver mereka.
Manajer PnP berjalan di pohon perangkat dan memuat driver untuk devnode yang belum dimulai (yaitu, devnodes yang tidak ditarik dari langkah sebelumnya). Saat setiap perangkat dimulai, manajer PnP menghitung anak-anak perangkat, jika ada.
Saat mengonfigurasi perangkat ini, manajer PnP memuat driver untuk perangkat, terlepas dari nilai StartType driver (kecuali ketika StartType SERVICE_DISABLED) sebelum melanjutkan untuk memulai perangkat. Banyak dari driver ini SERVICE_DEMAND_START driver.
Manajer PnP mengabaikan entri registri yang dibuat sebagai hasil dari entri Dependensi INF dan entri LoadOrderGroup untuk driver yang dimuatnya dalam langkah ini. Pemesanan beban didasarkan pada hierarki perangkat fisik.
Pada akhir langkah ini, semua perangkat dikonfigurasi, kecuali perangkat yang tidak dapat dijumlahkan PnP dan keturunan perangkat tersebut. (Turunan mungkin atau mungkin tidak dapat dijumlahkan PnP.)
Manajer PnP memuat driver StartType SERVICE_SYSTEM_START yang belum dimuat.
Driver ini mendeteksi dan melaporkan perangkat non-PnP mereka. Manajer PnP memproses entri registri yang merupakan hasil entri INF LoadOrderGroup untuk driver ini. Ini mengabaikan entri registri yang dibuat karena entri Dependensi INF untuk driver ini.
Manajer kontrol layanan memuat driver StartType SERVICE_AUTO_START yang belum dimuat.
Manajer kontrol layanan memproses informasi database layanan sehubungan dengan DependOnGroup dan DependOnServices layanan. Informasi ini berasal dari entri Dependensi dalam entri INF AddService . Ketahuilah bahwa informasi Dependensi hanya diproses untuk driver non-PnP karena driver PnP yang diperlukan dimuat dalam langkah startup sistem sebelumnya. Manajer kontrol layanan mengabaikan informasi INF LoadOrderGroup .
Lihat dokumentasi Microsoft Windows SDK untuk informasi selengkapnya tentang manajer kontrol layanan.
Menggunakan BootFlags untuk Mempromosikan StartType Driver di Boot Tergantung pada Skenario Boot
Sistem operasi dapat mempromosikan StartType driver menjadi driver boot start tergantung pada nilai BootFlags yang ditentukan dalam INF driver. Anda dapat menentukan satu atau beberapa (ORed) dari nilai numerik berikut dalam file INF, yang dinyatakan sebagai nilai heksadesimal:
- Jika driver harus dipromosikan menjadi driver boot start pada boot jaringan, tentukan 0x1 (CM_SERVICE_NETWORK_BOOT_LOAD).
- Jika driver harus dipromosikan pada booting dari VHD, tentukan 0x2 (CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD)
- Jika driver harus dipromosikan saat booting dari disk USB, tentukan 0x4 (CM_SERVICE_USB_DISK_BOOT_LOAD).
- Jika driver harus dipromosikan saat booting dari penyimpanan SD, tentukan 0x8 (CM_SERVICE_SD_DISK_BOOT_LOAD)
- Jika driver harus dipromosikan saat melakukan boot dari disk pada pengontrol USB 3.0, tentukan 0x10 (CM_SERVICE_USB3_DISK_BOOT_LOAD).
- Jika driver harus dipromosikan saat booting dengan boot terukur diaktifkan, tentukan 0x20 (CM_SERVICE_MEASURED_BOOT_LOAD).
- Jika driver harus dipromosikan saat booting dengan boot pemverifikasi diaktifkan, tentukan 0x40 (CM_SERVICE_VERIFIER_BOOT_LOAD).
- Jika driver harus dipromosikan pada boot WinPE, tentukan 0x80 (CM_SERVICE_WINPE_BOOT_LOAD).
Untuk informasi selengkapnya tentang mempromosikan StartType driver saat boot, tergantung pada skenario boot, lihat arahan INF AddService.