Aracılığıyla paylaş


DCH uyumlu sürücü paketi örneği

Bu makalede , DCHU sürücü örneğininDCH tasarım ilkelerini nasıl uyguladığı açıklanmaktadır. Bunu, DCH tasarım ilkelerini kendi sürücü paketinize uygulamak için bir model olarak kullanabilirsiniz.

Örnek deponun yerel bir kopyasını istiyorsanız , Windows-driver-samples'dan kopyalayın.

Örneğin bazı bölümleri yalnızca Windows 10 ve üzeri sürümlerde kullanılabilen yönergeleri ve API'leri kullanabilir. Belirli bir yönergenin hangi işletim sistemi sürümünde desteklendiğine bakmak için Cihaz ve Sürücü Yüklemesi'ne bakın.

Önkoşullar

Bu bölümü okumadan önce DCH Tasarım İlkeleri'ni tanımanız gerekir.

Genel Bakış

Örnek, Contoso (sistem oluşturucusu veya OEM) ve Fabrikam (cihaz üreticisi veya IHV) olmak üzere iki donanım iş ortağının Contoso'nun yaklaşan sisteminde bir cihaz için DCH uyumlu bir sürücü oluşturmak için birlikte çalıştığı örnek senaryolar sağlar. Söz konusu cihaz bir OSR USB FX2 öğrenme setidir. Geçmişte Fabrikam, belirli bir Contoso ürün serisine özel olarak özelleştirilmiş eski bir sürücü paketi yazar ve ardından bakımı işlemek için oem'e teslim ederdi. Bu işlem önemli bir bakım yüküne neden olduğundan Fabrikam kodu yeniden düzenlemeye ve bunun yerine DCH uyumlu bir sürücü paketi oluşturmaya karar verdi.

Bildirim temelli bölümleri/yönergeleri kullanma ve INF'i düzgün bir şekilde yalıtma

İlk olarak Fabrikam, DCH uyumlu sürücü paketlerinde geçersiz olan INF bölümlerinin ve yönergelerinin listesini gözden geçirir. Bu alıştırma sırasında Fabrikam, sürücü paketlerinde bu bölümlerin ve yönergelerin çoğunu kullandığını fark eder.

Sürücü INF, platforma bağımlı ayarları ve dosyaları uygulamak için bir eş yükleyici kaydeder. Sürücü paketi olması gerekenden daha büyüktür ve sürücüyü sevk eden OEM sistemlerinin yalnızca bir alt kümesini etkileyen bir hata olduğunda sürücüye hizmet vermek daha zordur. OEM'e özgü değişikliklerin çoğu markalama ile ilgilidir. Bu nedenle, Fabrikam'ın her OEM eklediğinde veya küçük bir sorun OEM sistemlerinin bir alt kümesini etkilediğinde sürücü paketini güncelleştirmesi gerekir.

Fabrikam, tanımlayıcı olmayan bölümleri ve yönergeleri kaldırır ve yeni sürücü paketinin INF dosyasının bildirim temelli INF gereksinimine uyduğunu doğrulamak için InfVerif aracını kullanır.

Bir sürücü paketini bileşenlerine ayırmak için INF dosyalarını kullanma

Ardından Fabrikam, OEM iş ortaklarına (Contoso gibi) özgü özelleştirmeleri temel sürücü paketinden bir uzantı INF'sine ayırır.

[osrfx2_DCHU_extension.inx] öğesinden güncelleştirilen aşağıdaki kod parçacığı, Extension sınıfını belirtir ve Contoso’nun uzantı sürücüsü paketine sahip olduğundan sağlayıcı olarak belirler.

[Version]
...
Class       = Extension
ClassGuid   = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider    = Contoso
ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
...

[osrfx2_DCHU_base.inx] içinde Fabrikam aşağıdaki girdileri belirtir:

[OsrFx2_AddReg]
HKR, OSR, "OperatingMode",, "Default" ; FLG_ADDREG_TYPE_SZ
HKR, OSR, "OperatingParams",, "None" ; FLG_ADDREG_TYPE_SZ

[osrfx2_DCHU_extension.inx] içinde Contoso, temel tarafından ayarlanan OperatingParams kayıt defteri değerini geçersiz kılar ve OperatingExceptions ekler:

[OsrFx2Extension_AddReg]
HKR, OSR, "OperatingParams",, "-Extended"
HKR, OSR, "OperatingExceptions",, "x86"

Sistem, uzantıları her zaman temel INF'den sonra işler ancak kesin bir sırada değildir. Temel INF'yi daha yeni bir sürüme güncelleştirirseniz, sistem yeni temel INF'yi yükledikten sonra uzantıları yeniden uygulamaya devam eder.

INF dosyasından hizmet yükleme

Fabrikam, OSR panosundaki LED'leri denetlemek için bir Win32 hizmeti kullanır. Bu bileşeni cihazın temel işlevselliğinin bir parçası olarak görüntüler, bu nedenle temel INF'lerinin ([osrfx2_DCHU_base.inx]) bir parçası olarak eklerler. Bu kullanıcı modu hizmeti (usersvc), INF dosyasında AddService yönergesi belirtilerek bildirimli olarak eklenebilir ve başlatılabilir:

[OsrFx2_Install.NT]
CopyFiles = OsrFx2_CopyFiles

[OsrFx2_Install.NT.Services]
AddService = WUDFRd, 0x000001fa, WUDFRD_ServiceInstall    ; Flag 0x2 sets this as the service for the device
AddService = osrfx2_DCHU_usersvc,, UserSvc_ServiceInstall

[UserSvc_ServiceInstall]
DisplayName = %UserSvcDisplayName%
ServiceType = 0x10                                ; SERVICE_WIN32_OWN_PROCESS
StartType = 0x3                                   ; SERVICE_DEMAND_START
ErrorControl = 0x1                                ; SERVICE_ERROR_NORMAL
ServiceBinary = %13%\osrfx2_DCHU_usersvc.exe
AddTrigger = UserSvc_AddTrigger                   ; AddTrigger syntax is only available in Windows 10 Version 2004 and above

[UserSvc_AddTrigger]
TriggerType = 1                                   ; SERVICE_TRIGGER_TYPE_DEVICE_INTERFACE_ARRIVAL
Action = 1                                        ; SERVICE_TRIGGER_ACTION_SERVICE_START
SubType = %GUID_DEVINTERFACE_OSRFX2%              ; Interface GUID
DataItem = 2, "USB\VID_0547&PID_1002"             ; SERVICE_TRIGGER_DATA_TYPE_STRING

[OsrFx2_CopyFiles]
osrfx2_DCHU_base.dll
osrfx2_DCHU_filter.dll
osrfx2_DCHU_usersvc.exe

Bu tür bir hizmeti, senaryoya bağlı olarak bir bileşene veya uzantı INF'sine de yükleyebilirsiniz.

Sürücü paketinden eski yazılımları yüklemek için bileşen kullanma

Fabrikam'ın daha önce bir cointaller kullanarak yüklediği yürütülebilir bir dosyası osrfx2_DCHU_componentsoftware.exe vardır. Bu eski yazılım, kart tarafından ayarlanan ve OEM tarafından gereken kayıt defteri anahtarlarını görüntüler. Bu yürütülebilir dosya, yalnızca masaüstü sürümleri için Windows üzerinde çalışan GUI tabanlı bir uygulamadır. Fabrikam, yüklemek için ayrı bir bileşen sürücü paketi oluşturur ve uzantı INF'sine ekler.

Aşağıdaki [osrfx2_DCHU_extension.inx] kod parçacığı, bir sanal alt cihaz oluşturmak için AddComponent yönergesini kullanır:

[OsrFx2Extension_Install.NT.Components]
AddComponent = osrfx2_DCHU_component,,OsrFx2Extension_ComponentInstall


[OsrFx2Extension_ComponentInstall]
ComponentIds=VID_045e&PID_94ab

Ardından, INF [osrfx2_DCHU_component.inx] bileşeninde Fabrikam isteğe bağlı yürütülebilir dosyayı yüklemek için AddSoftware yönergesini belirtir:

[OsrFx2Component_Install.NT.Software]
AddSoftware = osrfx2_DCHU_componentsoftware,, OsrFx2Component_SoftwareInstall

[OsrFx2Component_SoftwareInstall]
SoftwareType = 1
SoftwareBinary = osrfx2_DCHU_componentsoftware.exe
SoftwareArguments = <<DeviceInstanceId>>
SoftwareVersion = 1.0.0.0

[OsrFx2Component_CopyFiles]
osrfx2_DCHU_componentsoftware.exe

Win32 uygulamasının kaynak kodu örnekte yer alır.

Bileşen sürücüsü paketi yalnızca Windows Donanım Geliştirme Merkezi panosunda ayarlanan hedefleme nedeniyle Masaüstü SKU'larında dağıtılır. Daha fazla bilgi için bkz. Windows Update'e sürücü yayımlama.

Donanım destek uygulamasıyla iletişime izin verme

Fabrikam, Windows Sürücü paketinin bir parçası olarak GUI tabanlı bir yardımcı uygulama sağlamak istiyor. Win32 tabanlı yardımcı uygulamalar bir Windows Sürücü paketinin parçası olmadığından Fabrikam, Win32 uygulamalarını Evrensel Windows Platformu'na (UWP) bağlar ve uygulamayı cihazla eşleştirer.

Aşağıdaki kod parçacığında osrfx2_DCHU_base/device.c , temel sürücü paketinin cihaz arabirimi örneğine nasıl özel bir özellik eklediği gösterilmektedir:

    WDF_DEVICE_INTERFACE_PROPERTY_DATA PropertyData = { 0 };
    static const wchar_t customCapabilities[] = L"CompanyName.yourCustomCapabilityName_YourStorePubId\0";

    WDF_DEVICE_INTERFACE_PROPERTY_DATA_INIT(&PropertyData,
                                            &GUID_DEVINTERFACE_OSRUSBFX2,
                                            &DEVPKEY_DeviceInterface_UnrestrictedAppCapabilities);

    Status = WdfDeviceAssignInterfaceProperty(Device,
                                              &PropertyData,
                                              DEVPROP_TYPE_STRING_LIST,
                                              sizeof(customCapabilities),
                                              (PVOID)customCapabilities);

Yeni uygulama (örneğe dahil değildir) güvenlidir ve Microsoft Store'da kolayca güncelleştirebilirsiniz. UWP uygulaması hazırken Contoso, uygulamayı Windows Masaüstü sürüm görüntülerinde önceden yüklemek için DISM - Dağıtım Görüntüsü Bakımı ve Yönetimi'ni kullanır.

Birden çok INF dosyasını sıkı bir şekilde bağlama

İdeal olarak, temel, uzantılar ve bileşenler arasında güçlü sürüm oluşturma sözleşmeleri olmalıdır. Bu üç pakete bağımsız olarak hizmet vermenin (gevşek bir şekilde bağlanmış senaryo) hizmet verme avantajları vardır, ancak kötü sürüm oluşturma sözleşmeleri nedeniyle tek bir sürücü paketinde ("sıkı bir şekilde bağlanmış") paketlenmesi gereken senaryolar vardır. Örnek, her iki senaryonun örneklerini içerir:

[OsrFx2Extension_Install.NT]
CopyInf=osrfx2_DCHU_component.inf

Çok işlevli cihazlarda INF dosyalarının yüklenmesini koordine etmek için de bu yönergeyi kullanabilirsiniz. Daha fazla bilgi için bkz. INF dosyalarını kopyalama.

Uyarı

Bir temel sürücü bir uzantıyı yükleyebilir (ve sevkiyat etiketindeki temel sürücüyü hedefleyebilir), ancak uzantı donanım kimliğine başka bir sürücüyle birlikte gelen bir uzantıyı yayımlayamazsınız.

Sürücü deposundan çalıştırma

Sürücüyü güncelleştirmeyi kolaylaştırmak için Fabrikam, sürücü dosyalarını mümkün olduğunca dirid 13 kullanarak kopyalanacak hedef olarak sürücü depoyu belirtir. 13 hedef dizin değerinin kullanılması, sürücü güncelleştirme işlemi sırasında kararlılığı artırabilir. Aşağıda [osrfx2_DCHU_base.inx] tarafından bir örnek verilmiştir:

[DestinationDirs]
OsrFx2_CopyFiles = 13 ; copy to driver store

Sürücü deposundan dosyaları dinamik olarak bulma ve yükleme hakkında daha fazla bilgi için Driver Store'dan çalıştırma makalesine bakın.

Özet

Aşağıdaki diyagramda Fabrikam ve Contoso'nın DCH uyumlu sürücüsü için oluşturduğu sürücü paketleri gösterilmektedir. Gevşek bir şekilde bağlanmış örnekte , Windows Donanım Geliştirme Merkezi panosunda üç ayrı gönderim yapar: biri taban için, biri uzantı için ve biri bileşen için. Sıkı bir şekilde bağlanmış örnekte iki gönderim yapar: temel ve uzantı/bileşen.

Hem gevşek olarak bağlanmış hem de sıkı bir şekilde bağlanmış senaryolarda uzantı, temel ve bileşen sürücü paketleri arasındaki ilişkileri gösteren diyagramın ekran görüntüsü.

Bileşen INF'si bileşen donanım kimliğiyle eşleşirken, taban ve uzantılar panonun donanım kimliğiyle eşleşir.

Ayrıca bakınız