Aracılığıyla paylaş


Sürücü Deposundan Çalıştır

'Driver Store'dan çalıştır' kullanan INF, INF'nin yüklemedeki sürücü paketi dosyalarının konumunu belirtmek için DIRID 13 kullandığı anlamına gelir.

INF tarafından yüklenen bir 'Driver Store'dan çalıştır' dosyası için, INF dosyasının SourceDisksFiles girdisinde listelenen alt, INF'deki dosyanın DestinationDirs girdisinde listelenen alt dizinle eşleşmelidir.

Ayrıca CopyFiles yönergesi, Driver Store'dan çalıştırılacak bir dosyayı yeniden adlandırmak için kullanılamaz. Bir cihaza INF yüklenmesinin Sürücü Deposu dizininde yeni dosyaların oluşturulmasına neden olmaması için bu kısıtlamalar gereklidir.

SourceDisksFiles girdileri aynı dosya adına sahip birden çok girdiye sahip olmadığından ve CopyFiles bir dosyayı yeniden adlandırmak için kullanılamadığından, INF'nin başvuracağı her 'Driver Store'dan çalıştır' dosyasının benzersiz bir dosya adına sahip olması gerekir.

Sürücü paketleri, Windows 10 1709'dan başlayarak 'Driver Store'dan çalıştır' için genel desteğe sahiptir. Ancak bazı cihaz yığınları, bu yığınla entegre edilmesi gereken dosyalara ek kısıtlamalar getirebilir. Windows 10 1803'e kadar 'Driver Store'dan çalıştır' desteği olmayan bu cihaz yığınları bazı örneklerdir:

Belirli bir cihaz yığınına takılan bir ikili dosya sağlıyorsanız, ikili dosyaya tam dosya yolu sağlamayı destekleyip desteklemediğini ve bu tam dosya yolunda herhangi bir kısıtlama olup olmadığını denetlemek için lütfen prize taktığınız cihaz yığınının belgelerine bakın. İkili dosyaya, bu yolda hiçbir kısıtlama olmadan tam dosya yolu sağlamayı destekliyorsa, dosyanın 'Driver Store'dan çalıştırılmasını desteklemelidir.

Sürücü Deposu'ndan dosyaları dinamik olarak bulma ve yükleme

Bazen bir bileşenin 'Driver Store'dan çalıştır' kullanan bir sürücü paketinin parçası olan bir dosyayı yüklemesi gerekebilir. Sürücü paketinin farklı sürümleri, farklı işletim sistemi sürümleri, farklı işletim sistemi sürümleri vb. arasında farklı olabileceğinden, bu sürücü paketi dosyalarının yolları sabit kodlanmış olmamalıdır. Sürücü paketi dosyalarını yükleme gereksinimi ortaya çıktığında, bu sürücü paketi dosyaları bulunup aşağıda açıklanan paradigmalardan bazıları kullanılarak dinamik olarak yüklenmelidir.

Dosyaları aynı sürücü paketinde bulma ve yükleme

Sürücü paketindeki bir dosyanın aynı sürücü paketinden başka bir dosya yüklemesi gerektiğinde, bu dosyayı dinamik olarak bulmanın olası bir seçeneği, bu dosyanın çalıştığı dizini belirlemek ve diğer dosyayı bu dizine göre yüklemektir.

Windows 10 sürüm 1803 ve sonraki sürümlerde Sürücü Deposu'ndan çalışan ve sürücü paketinden diğer dosyalara erişmesi gereken bir WDM veya KMDF sürücüsü, sürücünün yüklendiği dizin yolunu almak için dizin türü olarak DriverDirectoryImageIoGetDriverDirectory çağırmalıdır. Alternatif olarak, Windows 10 sürüm 1803'ten önceki işletim sistemi sürümlerini desteklemesi gereken sürücüler için, sürücünün yolunu bulmak, yüklendiği dizin yolunu almak ve bu yola göre dosyaları aramak için IoQueryFullDriverPathkullanın. Çekirdek modu sürücüsü bir KMDF sürücüsüyse, IoQueryFullDriverPath'e geçirmek üzere WDM sürücü nesnesini almak için WdfDriverWdmGetDriverObjectkullanabilir.

Kullanıcı modu ikili dosyaları, ikili dosyanın nereden yüklendiğini belirlemek için GetModuleHandleExWve GetModuleFileNameWkullanabilir. Örneğin, UMDF sürücü ikili dosyası aşağıdakine benzer bir şey yapabilir:

bRet = GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
                         (PCWSTR)&DriverEntry,
                         &handleModule);
if (bRet) {
    charsWritten = GetModuleFileNameW(handleModule,
                                      path,
                                      pathLength);
    …

Herhangi bir sürücü paketindeki dosyaları bulma ve yükleme

Bazı senaryolarda, sürücü paketi başka bir sürücü paketindeki ikili dosya veya kullanıcı modu bileşeni tarafından yüklenmesi amaçlanan bir dosya içerebilir. Bu yöntem, aynı sürücü paketinden dosyaları yüklemek için yukarıda açıklanan yönteme göre tercih edilirse, aynı sürücü paketindeki dosyalar için de kullanılabilir.

Bir sürücü paketinden dosya yüklemeyi içerebilecek senaryolara birkaç örnek aşağıda verilmiştir:

  • Sürücü paketindeki kullanıcı modu DLL'leri, sürücü paketindeki bir sürücüyle iletişim kurmak için bir arabirim sağlar.

  • uzantısı sürücü paketi, temel sürücü paketindeki sürücü tarafından yüklenen bir yapılandırma dosyası içerir.

Bu gibi durumlarda, sürücü paketi bir cihaz veya cihaz arabiriminde yüklenmesi beklenen dosyanın yolunu gösteren bir durum ayarlamalıdır.

Bir sürücü paketi genellikle bu durumu ayarlamak için Bir HKR AddReg kullanır. Bu örnekte, ExampleFile.dlliçin sürücü paketi içinde alt dizinolmayan bir SourceDisksFiles girdisi olduğu varsayılmalıdır. Bu, dosyanın sürücü paketi dizininin kökünde olmasına neden olur. Ayrıca, CopyFiles yönergesi için, DestinationDirs'ün dirid 13 olarak belirtildiği varsayılmalıdır.

Bunu cihaz durumu olarak ayarlamaya yönelik bir INF örneği aşağıda verilmişti:

[ExampleDDInstall.HW]
AddReg = Example_DDInstall.AddReg

[Example_DDInstall.AddReg]
HKR,,ExampleValue,,%13%\ExampleFile.dll

Bunu cihaz arabirimi durumu olarak ayarlamak için bir INF örneği şöyle olabilir:

[ExampleDDInstall.Interfaces]
AddInterface = {<fill in an interface class GUID for an interface exposed by the device>},,Example_Add_Interface_Section

[Example_Add_Interface_Section]
AddReg = Example_Add_Interface_Section.AddReg

[Example_Add_Interface_Section.AddReg]
HKR,,ExampleValue,,%13%\ExampleFile.dll

Önceki örneklerde boş bir bayrak değeri kullanılır ve bu da REG_SZ kayıt defteri değerine neden olur. Bu, %13%'ün tam nitelikli bir kullanıcı modu dosya yoluna dönüştürülmesiyle sonuçlanıyor. Çoğu durumda, yolun bir ortam değişkenine göre olması tercih edilir. 0x20000 bayrak değeri kullanılırsa, kayıt defteri değeri REG_EXPAND_SZ türündedir ve %13%, yolun konumunu soyutlama amacıyla uygun ortam değişkenlerine sahip bir yola dönüştürülür. Bu kayıt defteri değerini alırken, yoldaki ortam değişkenlerini çözümlemek için ExpandEnvironmentStringsçağırın.

Değerin bir çekirdek modu bileşeni tarafından okunması gerekiyorsa, değer REG_SZ bir değer olmalıdır. Çekirdek modu bileşeni bu değeri okuduğunda, \??\'ı, ZwOpenFilegibi API'lere geçirmeden önce değerin önüne eklemelidir.

Cihazın durumunun bir parçası olduğunda bu ayara erişmek için önce uygulamanın cihazın kimliğini bulması gerekir. Kullanıcı modu kodu, gerektiğinde filtrelenmiş cihazların listesini almak için CM_Get_Device_ID_List_Size ve CM_Get_Device_ID_List kullanabilir. Bu cihaz listesi birden çok cihaz içerebilir, bu nedenle cihazdan durumu okumadan önce uygun cihazı arayın. Örneğin, belirli ölçütlere uyan bir cihaz ararken cihazdaki özellikleri almak için CM_Get_DevNode_Property çağırın.

Doğru cihaz bulunduktan sonra CM_Open_DevNode_Key çağırarak cihaz durumunun depolandığı kayıt defteri konumuna bir tanıtıcı alın.

Çekirdek modu kodu, duruma sahip cihaza bir PDO (fiziksel cihaz nesnesi) almalı ve ioOpenDeviceRegistryKeyçağırmalıdır. Çekirdek modu kodunun cihazın PDO'sunu almasının olası yollarından biri, cihaz tarafından kullanıma sunulan etkin bir arabirimi bulmak ve cihaz nesnesini almak için IoGetDeviceObjectPointerkullanmaktır.

Cihaz arabirimi durumundayken bu ayara erişmek için Kullanıcı modu kodu CM_Get_Device_Interface_List_Size ve CM_Get_Device_Interface_Listçağırabilir.

Ayrıca CM_Register_Notification, cihaz arabirimlerinin varış ve kaldırılmalarından haberdar olmak için kullanılabilir. Böylece, arabirim etkinleştirildiğinde kod bilgilendirilir ve durumu alabilir. Yukarıdaki API'lerde kullanılan cihaz arabirimi sınıfında birden çok cihaz arabirimi olabilir. Ayarın okunacak doğru arabirimini belirlemek için bu arabirimleri inceleyin.

Doğru cihaz arabirimi bulunduktan sonra CM_Open_Device_Interface_Keyçağrısı yapın.

Çekirdek modu kodu, durumu almak için cihaz arabiriminden bir sembolik bağlantı adı alabilir. Bunu yapmak için IoRegisterPlugPlayNotification çağırarak uygun cihaz arabirimi sınıfında cihaz arabirimi bildirimlerine kaydolun. Alternatif olarak, sistemdeki geçerli cihaz arabirimlerinin listesini almak için IoGetDeviceInterfacesçağırın. Yukarıdaki API'lerde kullanılan cihaz arabirimi sınıfında birden çok cihaz arabirimi olabilir. Hangi arabirimin okunacak ayara sahip olması gerektiğini belirlemek için bu arabirimleri inceleyin.

Uygun sembolik bağlantı adı bulunduktan sonra, cihaz arabirimi durumunun depolandığı kayıt defteri konumuna bir tanıtıcı almak için IoOpenDeviceInterfaceRegistryKeyçağrısı yapın.

Uyarı

CM_GETIDLIST_FILTER_PRESENT bayrağını, CM_Get_Device_ID_List_Size ve CM_Get_Device_ID_List ile veya CM_GET_DEVICE_INTERFACE_LIST_PRESENT bayrağını, CM_Get_Device_Interface_List_Size ve CM_Get_Device_Interface_Listile kullanın. Bu, dosya yolunu içeren durumla ilgili donanımın mevcut ve iletişim için hazır olmasını sağlar.

Sürücü paketi kaldırılıyor

Varsayılan olarak, sürücü paketi herhangi bir cihazda hala yüklüyse sistemden kaldırılamaz. Ancak, bir sürücü paketini sistemden kaldırmaya yönelik bazı seçenekler, 'zorla' kaldırılmaya çalışılması için izin verir. Bu, sürücü paketi sistemdeki bazı cihazlarda hala yüklü olsa bile sürücü paketini kaldırmaya çalışır. Driver Store'dan çalıştırılan dosyaları olan sürücü paketleri için zorla kaldırmaya izin verilmez. Bir sürücü paketi sistemden kaldırıldığında, Sürücü Deposu içeriği kaldırılır. Bu sürücü paketiyle birlikte hala yüklü olan cihazlar varsa, bu sürücü paketindeki tüm 'Sürücü Deposundan çalıştır' dosyaları artık yok olur ve bu eksik dosyalar bu cihazın arızalı çalışmasına neden olabilir. Cihazın bu şekilde kötü bir duruma gelmesini önlemek için, 'Driver Store'dan çalıştır' dosyalarını içeren sürücü paketleri zorla kaldırılamaz. Bunlar yalnızca artık herhangi bir cihaza yüklenmediklerinde kaldırılabilir. Bu tür sürücü paketlerinin kaldırılmasına yardımcı olmak için DiUninstallDriver veya pnputil /delete-driver <oem#.inf> /uninstall kullanılabilir. Bu kaldırma yöntemleri, sürücü paketini kaldırmaya çalışmadan önce kaldırılmakta olan sürücü paketini kullanan tüm cihazları bu sürücü paketiyle birlikte artık yüklenmeyecek şekilde güncelleştirir.

Sürücü paketi geliştirme

Özel ikili dosyaları test etme

Sürücü paketi geliştirirken, sürücü paketinden belirli bir yürütülebilir dosyayı sistemdeki sürücü paketini tamamen yeniden oluşturmak ve değiştirmek yerine özel bir sürümle değiştirmeniz gerekiyorsa, .kdfiles komutuyla birlikte bir çekirdek hata ayıklayıcısı kullanılması önerilir. Sürücü Deposu'ndaki dosyanın tam yolu sabit kodlanmaması gerektiğinden, .kdfiles eşlemesinde Eski Sürücü dosya adının önceki yol bilgisi olmayan dosyanın doğrudan adı önerilir. Bunu (ve diğer senaryoları) kolaylaştırmak için, sürücü paketlerindeki dosyaların adları mümkün olduğunca benzersiz olmalıdır, bu nedenle sistemdeki ilişkisiz bir sürücü paketindeki bir dosyanın adıyla eşleşmemelidir.

Sürücü Deposu'ndan çalıştırmak için bir INF dosyasını taşıma

Driver Store'dan çalıştırma kullanmayan bir INF'ye sahip sürücü paketiniz varsa ve bunu Driver Store'dan çalıştırılacak şekilde taşımaya çalışıyorsanız, aşağıdaki örneklerde, INF'lerde bazı yaygın dosya kullanımı ve bu dosyaların DriverStore'dan çalıştırılacak şekilde güncelleştirilmesiyle ilgili desenler gösterilir.

Hedef dizin güncellemeleri için hızlı referans

Aşağıdaki tabloda, bir dosya için INF sürücü paketi tarafından belirtilen mevcut hedef dizin DIRID'ye göre uygun kılavuzu bulmanıza yardımcı olacak hızlı bir referans sağlanmaktadır.

DIRID Altdizin Ayrıntılar
13 (on üç) Dosya zaten 'Driver Store'dan çalıştır' kullanıyor. Daha fazla çalışma gerekmez.
1 DIRID 1 kullanılmamalıdır. Dosyaya yapılan başvurunun çözülmesi gerektiğinde kaynak dizinin erişilebilir olacağının garantisi yoktur. Bunun yerine, sürücü paketindeki bileşenler belirli dosyalara bağımlıysa, bu dosyaları sürücü paketine ekleyin ve Sürücü Deposu'ndan çalıştırın.
10 Donanım Yazılımı DIRID 13'ü 'Driver Store'dan çalıştır' özelliğini kullanacak şekilde bir donanım yazılımı güncelleştirme sürücü paketiyle nasıl kullanabileceğiniz hakkında bilgi için Güncelleştirme sürücüsü paketi oluşturma bölümüne bakın.
10 Bkz. Diğer dosyalar.
11 Bkz. Diğer dosyalar.
12 UMDF Bkz. UMDF sürücüsü ikili dosyası.
12 DIRID 12 hedefine sahip dosyaların çoğu sürücü hizmeti ikili dosyalarını temsil etmektedir. Bkz. Hizmet ikili dosyası.
16422, 16426, 16427, 16428 Bu DIRID'lerin hedefine sahip dosyaların çoğu bir uygulamanın yüklenmesini temsil eder. Bunun yerine, bir Evrensel Windows Platformu (UWP) uygulaması sağlayın ve INF sürücü paketinin bir DDInstall.Software bölümünden AddSoftware yönergesini kullanarak yükleyin. Ayrıntılar için bkz. Evrensel Windows Platformu (UWP) uygulamasıyla sürücü eşleştirme.

Hizmet ikili dosyası

INF'niz bir hizmet eklerse ve ikili dosya Driver Store'dan çalıştırılmıyorsa INF'niz şöyle görünebilir:

[DestinationDirs]
 ; Copy the file to %windir%\system32\drivers
 Example_CopyFiles = 12

[ExampleDDInstall]
CopyFiles = Example_CopyFiles

[Example_CopyFiles]
ExampleBinary.sys

[ExampleDDInstall.Services]
AddService = ExampleService,0x2,Example_Service_Inst

[Example_Service_Inst]
DisplayName   = %SvcDesc%
ServiceType   = %SERVICE_KERNEL_DRIVER%
StartType     = %SERVICE_DEMAND_START%
ErrorControl  = %SERVICE_ERROR_NORMAL%
; Point at the file in %windir%\system32\drivers
ServiceBinary = %12%\ExampleBinary.sys

Bu dosyayı Driver Store'dan çalıştırılacak şekilde taşımak için, dosyanın kopyalanacağı yer için DestinationDirs girdisini güncelleştirmeniz ve bu dosyanın konumuna başvuran ServiceBinary yönergesini güncelleştirmeniz gerekir.

[DestinationDirs]
; Update the destination to DIRID 13
Example_CopyFiles = 13

[ExampleDDInstall]
CopyFiles = Example_CopyFiles

[Example_CopyFiles]
ExampleBinary.sys

[ExampleDDInstall.Services]
AddService = ExampleService,0x2,Example_Service_Inst

[Example_Service_Inst]
DisplayName   = %SvcDesc%
ServiceType   = %SERVICE_KERNEL_DRIVER%
StartType     = %SERVICE_DEMAND_START%
ErrorControl  = %SERVICE_ERROR_NORMAL%
; Point at the run from Driver Store file using DIRID 13
ServiceBinary = %13%\ExampleBinary.sys

UMDF sürücü ikili dosyası

Eğer INF dosyanız bir UMDF sürücüsü ekliyorsa ve ikili dosya sürücü deposundan çalıştırılmıyorsa, INF dosyanız aşağıdaki gibi görünebilir:

[DestinationDirs]
; Copy the file to %windir%\system32\drivers\UMDF
Example_CopyFiles = 12, UMDF

[ExampleDDInstall]
CopyFiles = Example_CopyFiles

[Example_CopyFiles]
ExampleUmdfDriver.dll

[ExampleDDInstall.Wdf]
UmdfService = ExampleUmdfDriver,Example_UMDF_Inst
...

[Example_UMDF_Inst]
; Point at the file in %windir%\system32\drivers\UMDF
ServiceBinary = %12%\UMDF\ExampleUmdfDriver.dll
...

Bu dosyayı Driver Store'dan çalıştırılacak şekilde taşımak için, dosyanın kopyalanacağı yer için DestinationDirs girdisini güncelleştirmeniz ve bu dosyanın konumuna başvuran ServiceBinary yönergesini güncelleştirmeniz gerekir.

[DestinationDirs]
; Update the destination to DIRID 13
Example_CopyFiles = 13

[ExampleDDInstall]
CopyFiles = Example_CopyFiles

[Example_CopyFiles]
ExampleUmdfDriver.dll

[ExampleDDInstall.Wdf]
UmdfService = ExampleUmdfDriver,Example_UMDF_Inst
...

[Example_UMDF_Inst]
; Point at the run from Driver Store file using DIRID 13
ServiceBinary = %13%\ExampleUmdfDriver.dll
...

Diğer dosyalar

INF'niz diğer bileşenler tarafından yüklenebilen ve Driver Store'dan çalıştırılmamış bir dosya eklerse, INF'niz aşağıdaki gibi görünebilir. Bu örnekte, yalnızca dosyanın adı cihazın kayıt defteri durumuna yazılır. Yüklenecek dosyayı belirlemek için bu kayıt defteri değerini okuyan bileşenler, %windir%\system32 olan dosyaya veya LoadLibraryarama sırasının dosyayı bulabilmesine bağlı olabilir.

[DestinationDirs]
; Copy the file to %windir%\system32
Example_CopyFiles = 11

[ExampleDDInstall]
CopyFiles=Example_CopyFiles
AddReg=Example_AddReg

[Example_CopyFiles]
ExampleFile.dll

[Example_AddReg]
HKR,,FileLocation,,"ExampleFile.dll"

Bu dosyayı Sürücü Deposu'ndan çalıştırılacak şekilde taşımak için, dosyanın kopyalanacağı konum için DestinationDirs girdisini güncelleştirmeniz ve cihazın durumunda kaydedilen konumu güncelleştirmeniz gerekir. Bu, bu kayıt defteri değerini okuyan bileşenlerin %windir%\system32göre bir dosya yerine dosyanın tam yolu olan kayıt defteri değerini işleyebilmesini gerektirir.

[DestinationDirs]
Example_CopyFiles = 13 ; update the destination to DIRID 13

[ExampleDDInstall]
CopyFiles=Example_CopyFiles
AddReg=Example_AddReg

[Example_CopyFiles]
ExampleFile.dll

[Example_AddReg]
; Point at the run from Driver Store file using DIRID 13
HKR,,FileLocation,,"%13%\ExampleFile.dll"