Aracılığıyla paylaş


Sürücü paketi yalıtımı

Sürücü paketi yalıtımı, sürücü paketlerini dış değişikliklere karşı daha dayanıklı, güncelleştirilmesini ve yüklenmesi daha kolay hale getiren Windows Sürücüleri için bir gereksinimdir.

Uyarı

Windows Sürücüleri için sürücü paketi yalıtımı gerekli olsa da, Windows Masaüstü Sürücüleri iyileştirilmiş dayanıklılık ve hizmet verilebilirlik sayesinde bu sürücüden yararlanmaya devam eder.

Aşağıdaki tabloda, sol sütunda Windows Sürücüleri için artık izin verilmeyen bazı örnek eski sürücü paketi uygulamaları ve sağ sütundaki Windows Sürücüleri için gerekli davranış gösterilmektedir.

Yalıtılmamış sürücü Yalıtılmış sürücü
INF dosyaları %windir%\System32 veya %windir%\System32\drivers dizinine kopyalar Sürücü dosyaları sürücü deposundan çalıştırılır
Sabit kodlanmış yolları kullanarak cihaz yığınlarıyla/sürücülerle etkileşim kurar Sistem tarafından sağlanan işlevleri veya cihaz arabirimlerini kullanarak cihaz yığınlarıyla/sürücülerle etkileşim kurar
Genel kayıt defteri konumlarının yolunu sabit kodlar Kayıt defteri ve dosya durumunun göreli konumu için HKR ve sistem tarafından sağlanan işlevleri kullanır
Çalışma zamanında dosya herhangi bir konuma yazar Dosyalar, işletim sistemi tarafından sağlanan konumlara göre yazılır

Sürücü paketinizin sürücü paketi yalıtım gereksinimlerini karşılayıp karşılamadiğini belirleme konusunda yardım için bkz. Windows Sürücülerini Doğrulama. Bir INF'yi sürücü paketi yalıtım gereksinimlerini karşılayacak şekilde güncelleştirme örnekleri için bkz. Sürücü paketi yalıtımını izlemek için INF'yi taşıma.

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

Tüm yalıtılmış sürücü paketleri, sürücü paketi dosyalarını sürücü deposunda bırakır. Bu, yüklemedeki sürücü paketi dosyalarının konumunu belirtmek için INF'lerinde DIRID 13'ü belirttikleri anlamına gelir. Bunu sürücü paketinde kullanma hakkında daha fazla bilgi için bkz. Sürücü deposundan çalıştırma.

Okuma ve yazma durumu

Uyarı

Bileşeniniz durumu depolamak için cihaz veya cihaz arabirimi özelliklerini kullanıyorsa, depolamak ve duruma erişmek için bu yöntemi ve uygun işletim sistemi API'lerini kullanmaya devam edin. Kayıt defteri ve dosya durumu için aşağıdaki kılavuz, bir bileşen tarafından depolanması gereken diğer durumlara yöneliktir.

Çeşitli kayıt defterine ve dosya durumuna erişim, çağrıyı yapana durumun konumunu sağlayan işlevler çağrılarak yapılmalıdır ve ardından durum bu konuma göre okunur/yazılır. Sabit kodlanmış mutlak kayıt defteri yollarını ve dosya yollarını kullanmayın.

Bu bölüm aşağıdaki alt bölümleri içerir:

Kayıt defteri durumu

Bu bölüm aşağıdaki alt bölümleri içerir:

PnP cihaz kayıt defteri durumu

Yalıtılmış sürücü paketleri ve kullanıcı modu bileşenleri genellikle cihaz durumunu kayıt defterinde depolamak için iki konumdan birini kullanır. Bunlar, cihazın donanım anahtarı (cihaz anahtarı) ve cihazın yazılım anahtarıdır (sürücü anahtarı). Donanım anahtarı genellikle tek bir cihaz örneğinin donanımla nasıl etkileşime geçtiğiyle ilgili ayarlara yöneliktir. Örneğin, bir donanım özelliğini etkinleştirmek veya donanımı belirli bir moda koymak için. Yazılım anahtarı genellikle tek bir cihaz örneğinin sistem ve diğer yazılımlarla nasıl etkileşime geçtiğiyle ilgili ayarlara yöneliktir. Örneğin, bir veri dosyasının konumunu yapılandırmak, bir çerçeveyle birlikte çalışmak veya bir cihazın uygulama ayarlarına erişmek için. Bu kayıt defteri konumlarına erişim tanıtıcısı edinmek için aşağıdaki seçeneklerden birini kullanın:

[ExampleDDInstall.HW]
AddReg = Example_DDInstall.AddReg

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

Cihaz arabirimi kayıt defteri durumu

Cihaz arabirimi kayıt defteri durumunu okumak ve yazmak için aşağıdaki seçeneklerden birini kullanın:

Hizmet kayıt defteri durumu

Hizmet durumu 3 kategoriden birinde sınıflandırılmalıdır

Değiştirilemez hizmet kayıt defteri durumu

Sabit hizmet durumu, hizmeti yükleyen sürücü paketi tarafından sağlanan durumdur. Sürücü ve Win32 hizmetleri için INF tarafından ayarlanan bu kayıt defteri değerleri, AddReg bölümünde bir HKR satırı sağlanarak ve ardından INF'deki hizmet yükleme bölümünde bu bölüme başvurarak hizmetin "Parametreler" alt anahtarı altında depolanmalıdır. Örneğin:

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

[Example_Service_Inst]
DisplayName    = %ExampleService.SvcDesc%
ServiceType    = 1
StartType      = 3
ErrorControl   = 1
ServiceBinary  = %13%\ExampleService.sys
AddReg=Example_Service_Inst.AddReg

[Example_Service_Inst.AddReg]
HKR, Parameters, ExampleValue, 0x00010001, 1

Çalışma zamanında hizmetten bu durumun konumuna erişmek için şu işlevlerden birini kullanın:

Hizmetin "Parameters" alt anahtarında INF tarafından sağlanan bu kayıt defteri değerleri yalnızca çalışma zamanında okunmalıdır ve değiştirilmemelidir. Bunlar salt okunur olarak ele alınmalıdır.

INF tarafından sağlanan kayıt defteri değerleri çalışma zamanında üzerine yazılabilen varsayılan ayarlarsa, geçersiz kılma değerleri hizmet için İç hizmet kayıt defteri durumuna veya Paylaşılan hizmet kayıt defteri durumuna yazılmalıdır. Ayarlar alınırken, ayar ilk olarak değişken durumda aranabilir. Orada bulunmuyorsa, ayar değiştirilemez durumda aranabilir. RtlQueryRegistryValueWithFallback , geçersiz kılma ve varsayılan değer içeren bunlar gibi sorgu ayarlarına yardımcı olmak için kullanılabilir.

İç hizmet kayıt defteri durumu

İç hizmet durumu, çalışma zamanında yazılan ve yalnızca hizmetin kendisi tarafından sahip olunan ve yönetilen ve yalnızca bu hizmet tarafından erişilebilen durumdur. İç hizmet durumunun konumuna erişmek için hizmetten şu işlevlerden birini kullanın:

Hizmet diğer bileşenlerin bu ayarları değiştirmesine izin vermek istiyorsa, hizmetin hizmete bu ayarları nasıl değiştirebileceğini bildiren başka bir bileşenin çağırabileceği bir arabirimi kullanıma sunması gerekir. Örneğin, Bir Win32 hizmeti bir COM veya RPC arabirimini ve bir sürücü hizmeti de bir cihaz arabirimi aracılığıyla bir IOCTL arabirimini kullanıma açabilir.

Paylaşılan hizmet kayıt defteri durumu

Paylaşılan hizmet durumu, çalışma zamanında yazılan ve yeterince ayrıcalıklıysa diğer kullanıcı modu bileşenleriyle paylaşılabilen durumdur. Bu paylaşılan hizmet durumunun konumuna erişmek için şu işlevlerden birini kullanın:

Dosya durumu

Bu bölüm aşağıdaki alt bölümleri içerir:

Cihaz dosya durumu

Bir cihazla ilgili dosyaların çalışma zamanında yazılması gerekiyorsa, bu dosyalar işletim sistemi API'leri aracılığıyla sağlanan bir tanıtıcıya veya dosya yoluna göre depolanmalıdır. Bu cihaza özgü yapılandırma dosyaları, burada depolanacak dosya türlerinin bir örneğidir. Bu durumun konumuna erişmek için hizmetten şu işlevlerden birini kullanın:

Hizmet dosyası durumu

Hizmet dosyası durumu 3 kategoriden birinde sınıflandırılabilir

Değiştirilemez hizmet dosyası durumu

Değiştirilemez hizmet dosya durumları, sürücü paketinin parçası olan dosyalardır. Bu dosyalara erişme hakkında daha fazla bilgi için bkz . Driver Store'dan çalıştırma.

İç hizmet dosyası durumu

İç hizmet dosyası durumu, çalışma zamanında yazılan ve yalnızca hizmetin kendisi tarafından sahip olunan ve yönetilen ve yalnızca bu hizmet tarafından erişilebilen durumdur. İç hizmet durumunun konumuna erişmek için hizmetten şu işlevlerden birini kullanın:

Hizmet diğer bileşenlerin bu ayarları değiştirmesine izin vermek istiyorsa, hizmetin hizmete bu ayarları nasıl değiştirebileceğini bildiren başka bir bileşenin çağırabileceği bir arabirimi kullanıma sunması gerekir. Örneğin, Bir Win32 hizmeti bir COM veya RPC arabirimini ve bir sürücü hizmeti de bir cihaz arabirimi aracılığıyla bir IOCTL arabirimini kullanıma açabilir.

Paylaşılan hizmet dosyası durumu

Paylaşılan hizmet dosyası durumu, çalışma zamanında yazılmış bir durumdur ve yeterince ayrıcalıklı olan diğer kullanıcı modu bileşenleriyle paylaşılabilir. Bu paylaşılan hizmet durumunun konumuna erişmek için şu işlevlerden birini kullanın:

  • DirectoryType parametresi DriverDirectorySharedData olarak ayarlanmış IoGetDriverDirectory (WDM, KMDF)

  • DirectoryType parametresi ServiceSharedDirectoryPersistentState olarak ayarlanmış GetSharedServiceDirectory (Win32 Services)

DriverData ve ProgramData

Diğer bileşenlerle paylaşılabilen ancak paylaşılan hizmet dosya durumu kategorisine sığmayan dosyalar ya da DriverDataProgramData konumlara yazılabilir.

Bu konumlar, bileşenlere diğer bileşenler tarafından tüketilmesi veya bir sistemden toplanarak başka bir sistem tarafından işlenmesi amaçlanan geçici durumları yazabilecekleri birer alan sunar. Örneğin, özel günlük dosyaları veya çökme dökümleri bu açıklamaya uyar.

veya ProgramData dizinlerinin DriverData köküne dosya yazmaktan kaçının. Bunun yerine, şirketinizin adıyla bir alt dizin oluşturun ve ardından bu dizinde dosyalar ve diğer alt dizinler yazın.

Örneğin, Contoso adında bir şirket için, çekirdek modu sürücüsü \DriverData\Contoso\Logs konumuna özel bir günlük yazabilir ve kullanıcı modu uygulaması %DriverData%\Contoso\Logs konumundan günlük dosyalarını toplayabilir veya analiz edebilir.

Sürücü Verisi

DriverData Dizin Windows 10, sürüm 1803 ve sonraki sürümlerde kullanılabilir ve yöneticiler ve UMDF sürücüleri tarafından erişilebilir.

Çekirdek modu sürücüleri, sistem tarafından sağlanan \DriverData adlı sembolik bağlantıyı kullanarak DriverData dizinine erişir.

Kullanıcı modu programları, ortam değişkenini DriverData%DriverData%kullanarak dizine erişer.

ProgramData

%ProgramData% Kullanıcı modu ortam değişkeni, kullanıcı modu bileşenlerinin verileri depolarken kullanması için kullanılabilir.

Geçici dosyalar

Geçici dosyalar genellikle ara işlemlerde kullanılır. Bunlar, %TEMP% veya %TMP% ortam değişkenleri altında bir alt yola yazılabilir. Bu konumlara ortam değişkenleri aracılığıyla erişildiğinden, bu özellik kullanıcı modu bileşenleriyle sınırlıdır. Bu geçici dosyaların kullanım ömrü veya kalıcılığı için dosya tanıtıcıları kapatıldıktan sonra hiçbir garanti yoktur. İşletim sistemi veya kullanıcı bunları istediği zaman kaldırabilir ve yeniden başlatma sırasında kalıcı olmayabilir.

veya %TMP% dizinlerinin %TEMP% köküne dosya yazmaktan kaçının. Bunun yerine, şirketinizin adıyla bir alt dizin oluşturun ve ardından bu dizinde dosyalar ve diğer alt dizinler yazın.

Özellik durumu

Hem cihazlar hem de cihaz arabirimleri PnP özellik modeli aracılığıyla depolama durumunu destekler. Özellik modeli, yapılandırılmış özellik verilerinin bir cihaz veya cihaz arabiriminde depolanmasını sağlar. Bu, özellik modeli tarafından desteklenen özellik türlerine makul ölçüde uyan daha küçük veriler içindir.

Cihaz özelliklerine erişmek için bu API'ler kullanılabilir:

Cihaz arabirimi özelliklerine erişmek için şu API'ler kullanılabilir:

Cihaz arabirimlerini kullanma

Sürücü, diğer bileşenlerin sürücünün iç durumunu okumasına veya değiştirmesine izin vermek istiyorsa, sürücüye hangi ayarların döndürüleceği veya belirli ayarların nasıl değiştirileceği konusunda başka bir bileşenin çağırabileceği bir arabirimi kullanıma sunmalıdır. Örneğin, sürücü hizmeti bir cihaz arabirimi aracılığıyla bir IOCTL arabirimini kullanıma açabilir.

Genellikle, durumun sahibi olan sürücü özel bir cihaz arabirimi sınıfında bir cihaz arabirimini kullanıma sunar. Sürücü diğer bileşenlerin duruma erişmesi için hazır olduğunda arabirimi etkinleştirir. Cihaz arabirimi etkinleştirildiğinde bildirim almak için kullanıcı modu bileşenleri cihaz arabirimi varış bildirimlerine kaydolabilir ve çekirdek modu bileşenleri IoRegisterPlugPlayNotification kullanabilir. Bu bileşenlerin duruma erişebilmesi için arabirimi etkinleştiren sürücünün özel cihaz arabirim sınıfı için bir sözleşme tanımlaması gerekir. Bu sözleşme genellikle iki türden biridir:

  • Bir I/O sözleşmesi, duruma erişmek için bir mekanizma sağlayan cihaz arabirimi sınıfı ile ilişkilendirilebilir. Diğer bileşenler, sözleşmeye uygun G/Ç istekleri göndermek için etkin cihaz arabirimini kullanır.

  • Sorgu arabirimi aracılığıyla döndürülen doğrudan çağrı arabirimi. Diğer sürücüler, çağrılacak sürücüden işlev işaretçilerini almak için IRP_MN_QUERY_INTERFACE gönderebilir.

Alternatif olarak, duruma sahip olan sürücü duruma doğrudan erişime izin veriyorsa, diğer sürücüler cihaz arabirimi durumuna programlı erişim için sistem tarafından sağlanan işlevleri kullanarak duruma erişebilir. Daha fazla bilgi için bkz. Cihaz Arabirimi Kayıt Defteri Durumu .

Bu arabirimlerin veya durumun (kullanılan paylaşım yöntemine bağlı olarak) düzgün bir şekilde sürümüne sahip olması gerekir, böylece duruma sahip olan sürücü, bu duruma erişen diğer bileşenlerden bağımsız olarak hizmet verebilir. Sürücü satıcıları, sürücüyle aynı anda hizmet verilmekte olan ve aynı sürümde kalan diğer bileşenlere güvenemez.

Arabirimleri denetleyen cihazlar ve sürücüler gelip gittiği için sürücüler ve uygulamalar, etkinleştirilen arabirimlerin listesini almak için bileşen başlangıcında IoGetDeviceInterfaces çağrısı yapmaktan kaçınmalıdır. Bunun yerine en iyi yöntem, cihaz arabiriminin gelmesi veya kaldırılması bildirimlerine kaydolmak ve ardından makinedeki mevcut etkin arabirimlerin listesini almak için uygun işlevi çağırmaktır.

Cihaz arabirimleri hakkında daha fazla bilgi için bkz:

Durum yönetimi API'leri için işletim sistemi desteğine hızlı başvuru

Çoğu sürücü paketinin bir dizi işletim sistemi sürümünü desteklemesi gerekir. Bir sürücü paketinde bunu nasıl başarma hakkında daha fazla bilgi için bkz. Birden çok işletim sistemi sürümünü destekleme . Aşağıdaki tablolar, çeşitli durum yönetimi API'leri için işletim sistemi desteğinin ne zaman eklendiğine ilişkin hızlı bir başvuru sağlar.

WDM sürücüleri

İşletim sistemi Destek eklendi
Windows 2000 IoOpenDeviceRegistryKey
IoOpenDeviceInterfaceRegistryKey
Windows Vista IoGetDevicePropertyData
IoSetDevicePropertyData
Windows 8 IoGetDeviceInterfacePropertyData
IoSetDeviceInterfacePropertyData
Windows 8.1 IoQueryFullDriverPath
Windows 10 1803 IoOpenDriverRegistryKey, RegKeyType türünde DriverRegKeyParameters ve DriverRegKeyPersistentState için
IoGetDeviceDirectory
IoGetDriverDirectory fonksiyonu için DirectoryType olarak DriverDirectoryImage ve DriverDirectoryData
Windows 10 1809 RtlQueryRegistryValueWithFallback
Windows 11 21H2 IoOpenDriverRegistryKey için RegKeyTypeDriverRegKeySharedPersistentState
IoGetDriverDirectoryDirectoryType için DriverDirectorySharedData

KMDF sürücüleri

KMDF sürümü Destek eklendi
1.0 WdfDeviceOpenRegistryKey
WdfFdoInitOpenRegistryKey
WdfDriverOpenParametersRegistryKey
WdfDeviceQueryProperty
WdfDeviceAllocAndQueryProperty
WdfFdoInitQueryProperty
WdfFdoInitAllocAndQueryProperty
1.13 WdfDeviceQueryPropertyEx
WdfDeviceAllocAndQueryPropertyEx
WdfDeviceAssignProperty
WdfFdoInitQueryPropertyEx
WdfFdoInitAllocAndQueryPropertyEx
1.25 WdfDriverOpenPersistentStateRegistryKey (Windows 10 1803)

UMDF sürücüleri

UMDF sürümü Destek eklendi
2.0 WdfDeviceOpenRegistryKey
WdfFdoInitOpenRegistryKey
WdfDriverOpenParametersRegistryKey
WdfDeviceQueryProperty
WdfDeviceAllocAndQueryProperty
WdfDeviceQueryPropertyEx
WdfDeviceAllocAndQueryPropertyEx
WdfDeviceAssignProperty
WdfFdoInitQueryProperty
WdfFdoInitAllocAndQueryProperty
WdfFdoInitQueryPropertyEx
WdfFdoInitAllocAndQueryPropertyEx
WdfDeviceQueryInterfaceProperty (Windows 8.1)
WdfDeviceAllocAndQueryInterfaceProperty (Windows 8.1)
WdfDeviceAssignInterfaceProperty (Windows 8.1)
2,25 WdfDeviceRetrieveDeviceDirectoryString
WdfDriverOpenPersistentStateRegistryKey (Windows 10 1803)
2,27 WdfDriverRetrieveDriverDataDirectoryString

Kullanıcı modu kodu

İşletim sistemi Destek eklendi
Windows 2000 CM_Open_DevNode_Key
Windows Vista CM_Open_Device_Interface_Key
CM_Get_DevNode_Property
CM_Set_DevNode_Property
CM_Get_Device_Interface_Property
CM_Set_Device_Interface_Property
Windows 10 2004 GetServiceRegistryStateKey
GetServiceDirectory
Windows 11 21H2 GetSharedServiceRegistryStateKey
GetSharedServiceDirectory