Aracılığıyla paylaş


Cihaz filtresi sürücülerinin sıralanması

Microsoft, cihaz filtre sürücüsü sıralama olarak bilinen yığın konumu yerine filtrenin amacını ifade ederek bildirim temelli olarak filtre ekleme yöntemi geliştirmiştir.

Cihaz filtre sürücüsü sıralama gereksinimi

Windows 10 sürüm 1903'ün öncesinde, cihaz filtresi sürücüsünü kaydetmenin desteklenen tek yolu bir kayıt defteri girdisinin eklenmesiydi ( AddReg yönergesini kullanarak). Ancak bu kayıt defteri işleme yöntemi, belirli bir filtrenin tam olarak hangi konumda kaydedileceğini belirtme esnekliği sağlamaz.

AddReg yönergesini kullanarak filtre kaydı, filtreyi filtre listesinin sonuna ekler. Bu yaklaşım, sıranın önemli olduğu değerlerin listesini kullanır ve yığında filtrenin nereye yüklendiğini belirler.

Birden fazla sürücü aynı cihaza filtre ekliyorsa olumsuz sonuçlar doğabileceğinden, özellikle AddRegyalnızca sona eklendiğinde, tek bir sıralı değer listesi kullanmak ideal değildir.

En az bir Uzantı INF'sinin söz konusu olduğu senaryoda, INF'ler AddReg'i yanlış kullanıyorsa (başka bir deyişle ekleme bayrağını kullanmıyorsa), farklı bir INF tarafından eklenen filtreyi silebilir.

Ayrıca, birden çok Uzantı INF'i filtre ekleyebilir ve bu filtrelerin göreli sıralaması önemli olabilir; ancak Tak Çalıştır (PnP) platformu, uzantılar için yükleme sırasını garanti etmez. Sonuç olarak, "ekleme işlemleri" sırasının garanti altına alınamamasıdır.

Cihaz filtre sürücüsü düzenlemesini uygulamak

Microsoft, cihaz filtrelerini kaydetmek için esnek bildirim temelli bir yöntem sağlamak için yığın konumu yerine filtrenin amacını ifade ederek bildirim temelli olarak filtre ekleme yöntemi geliştirmiştir. Çözüm, işlev sürücüsü yazarlarının INF'lerinde bir filtrenin kendisini kaydedebileceği sıralı konum kümesini (düzeyler olarak adlandırılır) ifade edebilmesini sağlar.

Belirli bir düzeye ek olarak, bir filtre bildirim temelli olarak yalnızca üst veya alt düzey filtre olarak kaydedilebilir.

Altyapı, cihaz yığınına hangi sıra sürücülerinin dahil olacağını belirlemek için yeni bir filtre kayıt yöntemini temel alır. Yeni yöntem, filtre eklemenin eski yolu için uyumluluğu bozmaz. Ancak yeni filtrelerin daha sağlam ve esnek bir kayıt mekanizmasına geçmesine olanak tanır.

yöntemi, temel INF'nin bir veya daha fazla "düzeyin" sıralı listesini tanımlamasını sağlayarak etkinleştirilir. Hem temel INF hem de tüm uzantı INF'leri, filtrenin ait olduğu hizmet adını ve düzeyini belirten yeni bir INF yönergesi aracılığıyla bildirim temelli bir filtre kaydedebilir. Üst ve alt filtrelerin her biri kendi sıralı düzey listesiyle gösterilir.

Bu üst ve alt filtre listeleri, tüm filtre sürücüleri kendi düzeylerine göre sıralanarak oluşturulur. Her düzeydeki filtrelerin sırası rastgele olarak değerlendirilmelidir ve burada belirli bir düzeydeki filtrelerin sırasına bağımlılık alınamayabilir. İki filtrenin göreli sırasının garanti edilmesi gereken senaryolarda, farklı düzeylere kaydedilmelidir.

Aşağıdaki cihaz sürücüsü örneğini göz önünde bulundurun:

İstenen konumlandırma ve sıralamaya uygun olarak filtre sürücüleri listelerini birleştirirken cihaz yığını sırası olarak gösterilen cihaz sürücülerinin yüklenmesi.

Cihaz sürücüsünün temel INF'i, sırasıyla A ve B olmak üzere iki üst filtre düzeyi bildirir. Temel INF'nin ilişkili Uzantı INF'sinde, iki düzeyin her birine iki filtre eklenir.

Cihaz sürücüsünün yüklenmesinin sonucu, istenen konumlandırma ve sıralamaya dikkat ederken filtre sürücüleri listelerini birleyen bir cihaz yığını sırasıdır. Elde edilen cihaz yığını sırası, "A" düzeyine yerleştirilen tüm filtrelerin "B" düzeyindeki herhangi bir filtreden önce gelmesini sağlar. Ancak, her düzeyde sıra rastgeledir.

Örnekte gösterildiği gibi, Filter3 Filter5'in önüne gelebilir veya Filter5'in ardından gelebilir. Her durumda, Filter3 ve Filter5, bir sonraki düzey olan "B" filtrelerden önce gelir.

Sıralama amacıyla bir dizi düzey oluşturmak yerine filtrenin kaydedilebileceği düzey serisi tasarlanırken, düzeylerin filtrenin amacına eşlenecek şekilde adlandırılması ve sıralanması gerekir. Örneğin, bir G/Ç cihazı herhangi bir şifreleme filtresinin kaydedilmesi gereken Şifreleme düzeyini tanımlayabilir. Bu, filtrenin amacının kolayca anlaşılmasını ve yönetilmesini sağlar ve işlev sürücüsünde hataya neden olan değişikliklere karşı yığını daha sağlam hale getirir.

Uyarı

Temel INF tarafından tanımlanan düzeyler olmasa bile bildirim temelli bir filtre yalnızca üst veya alt olarak kaydedilebilir. Düzeyler tanımlanmadığında, bu mantıksal olarak filtrenin UpperFilters/LowerFilters kayıt defteri değerinin sonuna eklenmesiyle eşdeğerdir. Düzeyler tanımlandığında, düzeylerden biri temel sürücüde varsayılan düzey olarak işaretlenmelidir ve bu durumda filtre bu düzeye kaydedilir.

Senaryo

Yığından gelen verileri şifreleyen bir I/O aygıt sürücüsü düşünün. Tipik bir uygulama, bunu gerçekleştirmek için işlev sürücüsünün hemen altında daha düşük bir filtre sürücüsü kullanabilir. Şifreleme filtresinin sürücü yazarının tam istediği konuma yerleştirildiğinden emin olmak için aşağıda gösterildiği gibi bildirim temelli filtreler kullanabilir:

Temel INF, "Şifreleme" ve "İzleme" (Varsayılan) adlı iki düşük filtre düzeyi oluşturur. Bu örnekteki "İzleme" (Varsayılan), bu cihaz için mevcut olabilecek alt filtrelerin geri kalanıdır. Sürücü, "Şifrele" filtre sürücüsünü "Şifreleme" düzeyine açıkça yerleştirerek, sonuçta elde edilen cihaz yığını sırasının "Şifrele" filtre sürücüsünü diğer düşük filtrelerden önce ve işlev sürücüsünü hemen takip etmesini sağlar.

Örneği bir adım daha ileri götürelim. Sürücünün daha yeni bir sürümünün ortaya çıktığını ve yazarın işlev sürücüsü için yerleşik şifreleme oluşturup oluşturmadığını düşünün. Bu, ayrı bir "Şifrele" filtre sürücüsü gereksinimini ortadan kaldırır. Yazarın temel INF'den "Şifrele" filtresini içeren düzeyi kaldırması yeterlidir ve sürücü güncelleştirildiğinde yığın yeniden dinamik olarak oluşturulur.

Bir filtre kendisini mevcut olmayan açık bir düzeyde olarak bildirirse, filtre cihaz yığınında bulunmaz. Örnekte Temel INF güncelleştirilmiştir ve Uzantı INF'i aynı kalsa da, sonuçta elde edilen cihaz yığını Temel INF'nin düzey bildirimine dahil edilmediğinden "Şifrele" filtresini dışlar.

Temel INF'den

Varsayılan filtre düzeyi

Son filtre yığınını oluşturmak için, tüm filtre bilgileri kaynakları tek bir listede birleştirilir. Cihaz yığını oluşturulurken birleştirme mantığının gerçekleştirildiğini unutmayın. Yeni/güncelleştirilmiş bir temel veya uzantı sürücüsü yüklenerek yeni bir filtre eklenirse, cihazlar yükleme sırasında yeniden başlatılır ve yeni bir filtre listesi alır.

Bazı filtre kaynaklarında herhangi bir konum bilgisi yoktur, yani eski UpperFilters/LowerFilters kayıt defteri değerleri aracılığıyla veya yalnızca konum belirten bildirim temelli söz dizimi aracılığıyla eklenen filtreler (aşağıda açıklandığı gibi).

Konum bilgisi olmadığında etkili bir birleştirmeyi desteklemek için temel INF tarafından ek bir bilgi parçası tanımlanmalıdır: varsayılan filtre düzeyi. Varsayılan filtre düzeyi, düzey veya konum bilgisi olmayan filtrelerin ekleneceği bir konumdur.

Örneğin, filtre düzeyleri Temel INF'de şu şekilde tanımlanabilir:

Level Order: A, B, C
DefaultFilterLevel: C

Varsayılan düzeyin son düzey olarak belirtilmesi, konum bilgisi olmayan tüm filtrelerin filtre listesine ekleneceğini gösterir. Alternatif olarak, sürücü yazarı yığının her zaman açıkça C düzeyine kaydedilmiş filtrelerle bitmesini isteyebilir:

Level Order: A, B, C
DefaultFilterLevel: B

Varsayılan filtre düzeyi B olarak ayarlandığından, konum bilgisi olmayan tüm ek filtreler A filtreleri ile C filtreleri arasına eklenir.

Sözdizimi

Filtreleri kaydetme

Daha fazla bilgi için INF DDInstall.Filters bölümüne ve AddFilter yönerge belgelerine bakın.

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

FilterLevel OR FilterPosition iki yoldan biriyle belirtilebilir:

1. Seçenek:

[FilterSection]
FilterLevel=<LevelName>

2. Seçenek:

[FilterSection]
FilterPosition=Upper/Lower

Bu işlem hem Temel hem de Uzantı INF'lerinde yapılabilir.

[DDInstall.Filters]

FilterName , sistemdeki hizmetin adıdır.

Bayraklar şu anda kullanılmamış ve boş bırakılmalıdır veya 0 olarak ayarlanmalıdır.

FilterSection , filtreyi açıklayan bir bölümdür.

[Filtre Bölümü]

Filtre bölümü şu iki yönergeden tam olarak birini içermelidir: FilterLevel veya FilterPosition.

FilterLevel, temel INF tarafından tanımlanan yığına cihaz filtresi eklemek için belirli bir yerdir.  Her düzeyde, filtrelerin sırası rastgeledir.

FilterPosition, sınıfın üçüncü taraf filtrelerin eklenmesi için belirli bir yere sahip olması durumunda kullanılır.

Filtre Düzeylerini Tanımlama

[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"

Bu yalnızca bir temel sürücü tarafından yapılabilir.

Belirli bir cihaz için filtrelerin bildirim temelli tam listesi aşağıdaki özellikler sorgulanarak alınabilir:

DEVPKEY_Device_CompoundUpperFilters
DEVPKEY_Device_CompoundLowerFilters

Eski sistemle eşdeğer filtre kaydı

Şimdi INF aracılığıyla üst filtre ekleme denemesini eski bir yaklaşım olarak nasıl gerçekleştireceğimizi inceleyelim.

[DDInstall.HW]
AddReg = Filters

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

Bu söz dizimi, üst filtreler listesinin sonuna "Filtrem" ekler.

Kullanıma sunulan yeni söz dizimi ile, yukarıdaki bölüm mantıksal olarak şuna benzer:

[DDInstall.Filters]
AddFilter = MyFilter,,MyUpperFilterInstall

[MyUpperFilterInstall]
FilterPosition = Upper

Bu, "Filtrem" filtresinin üst filtreler listesine eklenmesi gerektiğini belirtir. Temel INF'de belirtilen filtre düzeyleri varsa, FilterPosition kullanıldığında filtre bu konum için varsayılan düzeyde kaydedilecektir.

Filtre düzeyleri belirtilmezse, bu filtre rastgele sırada üst filtre olarak kaydedilir.

Ayrıca Bkz.

INF DDInstall.Filters bölümü

AddFilter yönergesi