Bagikan melalui


Pemesanan driver filter perangkat

Microsoft telah mengembangkan metode untuk menambahkan filter secara deklaratif dengan mengekspresikan niat filter, bukan posisi tumpukan, yang dikenal sebagai pemesanan driver filter perangkat.

Kebutuhan akan pemesanan driver filter perangkat

Sebelum Windows 10 versi 1903, satu-satunya cara yang didukung untuk mendaftarkan driver filter perangkat adalah dengan penambahan entri registri (menggunakan direktif AddReg). Namun, metode manipulasi registri ini tidak memberikan fleksibilitas untuk menentukan pada posisi mana yang tepat untuk mendaftarkan filter tertentu.

Memfilter pendaftaran menggunakan direktif AddReg hanya menambahkan filter ke akhir daftar filter. Pendekatan ini menggunakan daftar nilai di mana pesanan penting dan menentukan di mana dalam tumpukan filter dimuat.

Menggunakan satu daftar nilai yang diurutkan kurang ideal, terutama ketika AddReg hanya menambahkan ke akhir, karena ada konsekuensi negatif ketika lebih dari satu driver menambahkan filter ke perangkat yang sama.

Dalam skenario di mana setidaknya ada satu INF Ekstensi yang terlibat, jika INF secara tidak benar menggunakan AddReg (dengan kata lain tidak menggunakan bendera penambahan), mereka dapat menghapus filter yang ditambahkan oleh INF yang berbeda.

Selain itu, beberapa INF Ekstensi dapat menambahkan filter, dan pengurutan relatif filter tersebut mungkin penting; namun, platform Plug and Play (PnP) tidak menjamin urutan penginstalan untuk ekstensi. Hasilnya adalah bahwa urutan "tambahan" tidak dijamin.

Menerapkan pemesanan driver filter perangkat

Untuk menyediakan metode deklaratif yang fleksibel untuk mendaftarkan filter perangkat, Microsoft telah mengembangkan metode untuk menambahkan filter secara deklaratif dengan mengekspresikan niat filter, bukan posisi tumpukan. Solusi ini memberikan kemampuan kepada penulis driver fungsi untuk mengekspresikan dalam INF mereka serangkaian posisi yang diurutkan (disebut tingkat) yang dapat didaftarkan oleh filter itu sendiri.

Selain tingkat tertentu, filter dapat secara deklaratif mendaftar hanya sebagai filter tingkat atas atau bawah .

Infrastruktur didasarkan pada metode pendaftaran filter baru untuk menentukan driver pesanan apa yang akan disertakan dalam tumpukan perangkat. Metode baru tidak merusak kompatibilitas untuk cara lama menambahkan filter. Namun, ini memungkinkan filter baru untuk pindah ke mekanisme pendaftaran yang lebih kuat dan fleksibel.

Metode ini diaktifkan dengan meminta INF dasar menentukan daftar yang diurutkan dari satu atau beberapa "level". INF dasar dan INF ekstensi apa pun dapat mendaftarkan filter deklaratif melalui arahan INF baru yang menentukan nama dan tingkat layanan tempat filter berada. Filter atas dan bawah masing-masing diwakili oleh daftar tingkat yang diurutkan masing-masing.

Daftar filter atas dan bawah ini dibuat dengan mengurutkan semua driver filter menurut tingkatnya. Urutan filter dalam setiap tingkat harus dianggap seganteng, di mana tidak ada dependensi yang dapat diambil pada urutan filter dalam tingkat tertentu. Dalam skenario di mana urutan relatif dari dua filter harus dijamin, mereka harus didaftarkan ke tingkat yang berbeda.

Pertimbangkan contoh driver perangkat berikut:

Penginstalan driver perangkat ditampilkan sebagai urutan tumpukan perangkat yang menggabungkan daftar driver filter sambil menghormati posisi dan pemesanan yang diinginkan.

INF dasar driver perangkat mendeklarasikan dua tingkat filter atas, A dan B (dalam urutan tersebut). Dalam INF Ekstensi terkait INF dasar, dua filter ditambahkan ke masing-masing dari dua tingkat.

Hasil penginstalan driver perangkat adalah urutan tumpukan perangkat yang menggabungkan daftar driver filter sambil menghormati posisi dan pemesanan yang diinginkan. Urutan tumpukan perangkat yang dihasilkan memastikan bahwa filter apa pun yang ditempatkan di tingkat "A" hadir sebelum filter apa pun di tingkat "B". Namun, dalam setiap tingkat, urutannya segan-segan.

Seperti yang ditunjukkan dalam contoh, Filter3 bisa datang sebelum Filter5 atau bisa datang setelah Filter5. Bagaimanapun, Filter3 dan Filter5 akan datang sebelum filter pada tingkat berikutnya, "B".

Saat merancang rangkaian tingkat yang dapat didaftarkan filter, daripada membuat serangkaian tingkat demi pemesanan, tingkat harus dinamai dan diurutkan sedemikian sehingga mereka memetakan niat filter. Misalnya, perangkat I/O dapat menentukan tingkat Enkripsi, tempat filter enkripsi apa pun harus didaftarkan. Ini memungkinkan niat filter untuk mudah dipahami dan dikelola, dan membuat tumpukan lebih kuat terhadap perubahan yang melanggar pada driver fungsi.

Catatan

Bahkan tanpa tingkat yang ditentukan oleh INF dasar, filter deklaratif dapat mendaftar hanya sebagai atas atau bawah. Ketika tingkat tidak ditentukan, ini secara logis setara dengan menambahkan filter ke akhir nilai registri UpperFilters/LowerFilters. Ketika tingkat didefinisikan, salah satu tingkat harus ditandai sebagai tingkat default di driver dasar, dan dalam hal ini filter akan didaftarkan ke tingkat tersebut.

Skenario

Pertimbangkan driver perangkat I/O yang mengenkripsi data yang masuk melalui tumpukan. Implementasi umum dapat menggunakan driver filter yang lebih rendah tepat di bawah driver fungsi untuk menyelesaikan ini. Untuk memastikan bahwa filter enkripsi ditempatkan pada posisi yang tepat yang diinginkan penulis driver, mereka dapat menggunakan filter deklaratif seperti yang ditunjukkan di bawah ini:

Diagram yang menunjukkan bahwa dengan secara eksplisit menempatkan driver filter

INF Dasar menetapkan dua tingkat filter yang lebih rendah, "Enkripsi" dan "Pemantauan" (Default). "Pemantauan" (Default) dalam contoh ini adalah filter bawah lainnya yang mungkin ada untuk perangkat tertentu ini. Dengan secara eksplisit menempatkan driver filter "Enkripsi" di tingkat "Enkripsi", driver memastikan bahwa urutan tumpukan perangkat yang dihasilkan akan menempatkan driver filter "Enkripsi" sebelum filter lain yang lebih rendah dan segera mengikuti driver fungsi.

Mari kita ambil contoh satu langkah lebih jauh. Bayangkan versi driver yang lebih baru keluar dan penulis telah membangun enkripsi ke driver fungsi. Ini menghapus kebutuhan akan driver filter "Enkripsi" terpisah. Penulis hanya perlu menghapus tingkat yang berisi filter "Enkripsi" dari INF Dasar dan ketika driver diperbarui, tumpukan dibangun lagi secara dinamis.

Jika filter mendeklarasikan dirinya berada dalam tingkat eksplisit yang tidak ada, filter tidak berakhir di tumpukan perangkat. Dalam contoh, INF Dasar telah diperbarui dan meskipun Extension INF tetap sama, tumpukan perangkat yang dihasilkan mengecualikan filter "Enkripsi" karena tidak disertakan dalam deklarasi tingkat Base INF.

Diagram yang menghapus tingkat yang berisi filter

Tingkat filter default

Untuk menghasilkan tumpukan filter akhir, semua sumber informasi filter digabungkan ke dalam satu daftar. Penting untuk dicatat bahwa logika penggabungan dilakukan saat membuat tumpukan perangkat. Jika filter baru ditambahkan dengan menginstal driver dasar atau ekstensi baru/diperbarui, perangkat akan dimulai ulang selama penginstalan dan mengambil daftar filter baru.

Beberapa sumber filter tidak memiliki informasi posisi apa pun, yaitu filter yang ditambahkan melalui nilai registri UpperFilters/LowerFilters warisan, atau melalui sintaks deklaratif khusus posisi (dibahas di bawah).

Untuk mendukung penggabungan yang efektif saat tidak memiliki informasi posisi, bagian informasi tambahan harus ditentukan oleh INF Dasar: tingkat filter default. Tingkat filter default adalah posisi di mana filter, tidak memiliki tingkat atau informasi posisi, akan dimasukkan.

Misalnya, tingkat filter dapat didefinisikan dalam INF Dasar sebagai:

Level Order: A, B, C
DefaultFilterLevel: C

Menentukan tingkat default sebagai tingkat akhir menunjukkan bahwa filter apa pun yang tidak memiliki informasi posisi akan ditambahkan ke daftar filter. Atau, pembuat driver mungkin ingin tumpukan selalu diakhiri dengan filter yang secara eksplisit terdaftar ke tingkat C:

Level Order: A, B, C
DefaultFilterLevel: B

Karena tingkat filter default diatur ke B, filter tambahan apa pun tanpa informasi posisi akan dimasukkan antara filter A dan filter C.

Sintaks

Mendaftarkan filter

Lihat bagian INF DDInstall.Filters dan dokumentasi direktif AddFilter untuk informasi selengkapnya.

[DDInstall.Filters]
AddFilter = <FilterName>, [Flags], FilterSection

FilterLevel ATAU FilterPosition dapat ditentukan dengan salah satu dari dua cara:

Opsi 1:

[FilterSection]
FilterLevel=<LevelName>

Opsi 2:

[FilterSection]
FilterPosition=Upper/Lower

Ini dapat dilakukan di INF Dasar dan Ekstensi.

[DDInstall.Filters]

FilterName adalah nama layanan pada sistem.

Bendera saat ini tidak digunakan dan harus dibiarkan kosong atau diatur ke 0.

FilterSection adalah bagian yang menjelaskan filter.

[Bagian Filter]

Bagian filter harus berisi salah satu dari dua arahan berikut: FilterLevel atau FilterPosition.

FilterLevel adalah tempat tertentu untuk menyisipkan filter perangkat pada tumpukan, yang ditentukan oleh INF Dasar.  Dalam setiap tingkat, urutan filter bersifat arbitrer.

FilterPosition digunakan dalam kasus di mana kelas memiliki satu tempat khusus untuk filter pihak ketiga yang akan dimasukkan.

Menentukan Tingkat Filter

[DDInstall.HW]
AddReg = FilterLevel_Definition

[FilterLevel_Definition]
HKR,,UpperFilterLevels,%REG_MULTI_SZ%,"LevelA","LevelB","LevelC"
HKR,,UpperFilterDefaultLevel,,"LevelC"

HKR,,LowerFilterLevels,%REG_MULTI_SZ%,"LevelD","LevelE","LevelF"
HKR,,LowerFilterDefaultLevel,,"LevelE"

Ini hanya dapat dilakukan oleh driver dasar .

Daftar deklaratif lengkap filter untuk perangkat tertentu dapat diambil dengan mengkueri properti berikut:

DEVPKEY_Device_CompoundUpperFilters
DEVPKEY_Device_CompoundLowerFilters

Pendaftaran filter yang setara dengan warisan

Mari kita periksa cara mencapai pendekatan warisan untuk mencoba menambahkan filter atas melalui INF:

[DDInstall.HW]
AddReg = Filters

[Filters]
HKR,,"UpperFilters", 0x00010008, "MyFilter"

Sintaks ini akan menambahkan "MyFilter" ke akhir daftar filter atas.

Dengan sintaks baru yang telah diperkenalkan, bagian di atas secara logis mirip dengan:

[DDInstall.Filters]
AddFilter = MyFilter,,MyUpperFilterInstall

[MyUpperFilterInstall]
FilterPosition = Upper

Ini menentukan bahwa filter "MyFilter" harus ditambahkan ke daftar filter atas. Jika INF dasar telah menentukan tingkat filter, menggunakan FilterPosition akan mendaftarkan filter di tingkat default untuk posisi tersebut.

Jika tingkat filter tidak ditentukan, filter ini akan didaftarkan sebagai filter atas dalam urutan arbitrer.

Lihat Juga

Bagian INF DDInstall.Filters

Direktif AddFilter