Bagikan melalui


Isolasi paket driver

Isolasi paket driver adalah persyaratan untuk Driver Windows yang membuat paket driver lebih tahan terhadap perubahan eksternal, lebih mudah diperbarui, dan lebih mudah diinstal.

Catatan

Meskipun isolasi paket driver diperlukan untuk Driver Windows, Driver Desktop Windows masih mendapat manfaat darinya melalui peningkatan ketahanan dan layanan.

Tabel berikut ini memperlihatkan beberapa contoh praktik paket driver warisan yang tidak lagi diizinkan untuk Driver Windows di kolom kiri bersama dengan perilaku yang diperlukan untuk Driver Windows di kolom kanan.

Driver yang tidak terisolasi Driver terisolasi
INF menyalin file ke %windir%\System32 atau %windir%\System32\drivers File driver dijalankan dari penyimpanan driver
Berinteraksi dengan tumpukan/driver perangkat menggunakan jalur yang dikodekan secara permanen Berinteraksi dengan tumpukan/driver perangkat menggunakan fungsi yang disediakan sistem atau antarmuka perangkat
Jalur hardcode ke lokasi registri global Menggunakan fungsi HKR dan yang disediakan sistem untuk lokasi relatif registri dan status file
File runtime menulis ke lokasi mana pun File ditulis relatif terhadap lokasi yang disediakan oleh sistem operasi

Untuk bantuan dalam menentukan apakah paket driver Anda memenuhi persyaratan isolasi paket driver, lihat Memvalidasi Driver Windows. Untuk contoh cara memperbarui INF untuk memenuhi persyaratan isolasi paket driver, lihat Porting INF untuk mengikuti isolasi paket driver.

Jalankan dari penyimpanan driver

Semua paket driver terisolasi meninggalkan file paket driver mereka di penyimpanan driver. Ini berarti bahwa mereka menentukan DIRID 13 di INF mereka untuk menentukan lokasi untuk file paket driver saat diinstal. Untuk informasi selengkapnya tentang cara menggunakan ini dalam paket driver, lihat Menjalankan dari penyimpanan driver.

Status membaca dan menulis

Catatan

Jika komponen Anda menggunakan properti antarmuka perangkat atau perangkat untuk menyimpan status , terus gunakan metode tersebut dan API OS yang sesuai untuk menyimpan dan mengakses status. Panduan berikut untuk registri dan status file adalah untuk status lain yang perlu disimpan oleh komponen.

Akses ke berbagai registri dan status file harus dilakukan dengan memanggil fungsi yang menyediakan penelepon dengan lokasi status dan kemudian status dibaca/ditulis relatif terhadap lokasi tersebut. Jangan gunakan jalur registri absolut dan jalur file yang dikodekan secara permanen.

Bagian ini berisi subbagian berikut:

Status registri

Bagian ini berisi subbagian berikut:

Status registri perangkat PnP

Paket driver terisolasi dan komponen mode pengguna biasanya menggunakan salah satu dari dua lokasi untuk menyimpan status perangkat di registri. Ini adalah kunci perangkat keras (kunci perangkat) untuk perangkat dan kunci perangkat lunak (kunci driver) untuk perangkat. Kunci perangkat keras biasanya untuk pengaturan yang terkait dengan bagaimana instans perangkat individual berinteraksi dengan perangkat keras. Misalnya, untuk mengaktifkan fitur perangkat keras atau memasukkan perangkat keras ke dalam mode tertentu. Kunci perangkat lunak biasanya untuk pengaturan yang terkait dengan bagaimana instans perangkat individual berinteraksi dengan sistem dan perangkat lunak lainnya. Misalnya, untuk mengonfigurasi lokasi file data, untuk beroperasi dengan kerangka kerja, atau mengakses pengaturan aplikasi untuk perangkat. Untuk mengambil handel ke lokasi registri ini, gunakan salah satu opsi berikut:

[ExampleDDInstall.HW]
AddReg = Example_DDInstall.AddReg

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

Status registri antarmuka perangkat

Untuk membaca dan menulis status registri antarmuka perangkat, gunakan salah satu opsi berikut:

Status registri layanan

Status layanan harus diklasifikasikan ke dalam salah satu dari 3 kategori

Status registri layanan yang tidak dapat diubah

Status layanan yang tidak dapat diubah adalah status yang disediakan oleh paket driver yang menginstal layanan. Nilai registri ini yang ditetapkan oleh INF untuk driver dan layanan Win32 harus disimpan di bawah subkunci "Parameter" layanan dengan menyediakan baris HKR di bagian AddReg , lalu merujuk bagian tersebut di bagian penginstalan layanan di INF. Contohnya:

[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

Untuk mengakses lokasi status ini dari layanan pada runtime, gunakan salah satu fungsi berikut:

Nilai registri ini disediakan oleh INF dalam subkunjuk "Parameter" untuk layanan hanya boleh dibaca saat runtime dan tidak dimodifikasi. Mereka harus diperlakukan sebagai baca saja.

Jika nilai registri yang disediakan oleh INF adalah pengaturan default yang dapat ditimpa saat runtime, nilai penimpaan harus ditulis ke dalam status registri layanan Internal atau status registri layanan bersama untuk layanan. Saat mengambil pengaturan, pengaturan dapat dicari terlebih dahulu dalam status dapat diubah. Jika tidak ada di sana, maka pengaturan dapat dicari dalam keadaan tidak dapat diubah. RtlQueryRegistryValueWithFallback dapat digunakan untuk membantu pengaturan kueri seperti ini yang memiliki penimpaan dan nilai default.

Status registri layanan internal

Status layanan internal adalah status yang ditulis pada runtime dan dimiliki dan dikelola oleh hanya layanan itu sendiri dan hanya dapat diakses oleh layanan tersebut. Untuk mengakses lokasi untuk status layanan internal, gunakan salah satu fungsi ini dari layanan:

Jika layanan ingin mengizinkan komponen lain mengubah pengaturan ini, layanan harus mengekspos antarmuka yang dapat dipanggil komponen lain yang memberi tahu layanan cara mengubah pengaturan ini. Misalnya, layanan Win32 dapat mengekspos antarmuka COM atau RPC dan layanan driver dapat mengekspos antarmuka IOCTL melalui antarmuka perangkat.

Status registri layanan bersama

Status layanan bersama adalah status yang ditulis pada runtime dan dapat dibagikan dengan komponen mode pengguna lain jika mereka cukup istimewa. Untuk mengakses lokasi untuk status layanan bersama ini, gunakan salah satu fungsi berikut:

Status file

Bagian ini berisi subbagian berikut:

Status file perangkat

Jika file yang terkait dengan perangkat perlu ditulis pada runtime, file tersebut harus disimpan relatif terhadap handel atau jalur file yang disediakan melalui OS API. File konfigurasi khusus untuk perangkat tersebut adalah salah satu contoh jenis file apa yang akan disimpan di sini. Untuk mengakses lokasi status ini, gunakan salah satu fungsi ini dari layanan:

Status file layanan

Status file layanan dapat diklasifikasikan ke dalam salah satu dari 3 kategori

Status file layanan yang tidak dapat diubah

Status file layanan yang tidak dapat diubah adalah file yang merupakan bagian dari paket driver. Untuk informasi selengkapnya tentang mengakses file-file tersebut, lihat Menjalankan dari Driver Store.

Status file layanan internal

Status file layanan internal adalah status yang ditulis pada runtime dan dimiliki dan dikelola oleh hanya layanan itu sendiri dan hanya dapat diakses oleh layanan tersebut. Untuk mengakses lokasi untuk status layanan internal, gunakan salah satu fungsi ini dari layanan:

Jika layanan ingin mengizinkan komponen lain mengubah pengaturan ini, layanan harus mengekspos antarmuka yang dapat dipanggil komponen lain yang memberi tahu layanan cara mengubah pengaturan ini. Misalnya, layanan Win32 dapat mengekspos antarmuka COM atau RPC dan layanan driver dapat mengekspos antarmuka IOCTL melalui antarmuka perangkat.

Status file layanan bersama

Status file layanan bersama adalah status yang ditulis pada runtime dan dapat dibagikan dengan komponen mode pengguna lain jika cukup istimewa. Untuk mengakses lokasi untuk status layanan bersama ini, gunakan salah satu fungsi berikut:

DriverData dan ProgramData

File yang dapat dibagikan dengan komponen lain tetapi tidak cocok dengan kategori status file layanan bersama dapat ditulis ke salah satu DriverData atau ProgramData lokasi.

Lokasi ini menawarkan komponen lokasi untuk menulis status atau status sementara yang dimaksudkan untuk dikonsumsi oleh komponen lain dan berpotensi dikumpulkan dan disalin dari sistem untuk diproses oleh sistem lain. Misalnya, file log kustom atau crash dump sesuai dengan deskripsi ini.

Hindari menulis file di akar DriverData direktori atau ProgramData . Sebagai gantinya, buat subdirektori dengan nama perusahaan Anda lalu tulis file dan subdirektori lebih lanjut dalam direktori tersebut.

Misalnya, untuk nama perusahaan Contoso, driver mode kernel dapat menulis log kustom ke \DriverData\Contoso\Logs dan aplikasi mode pengguna dapat mengumpulkan atau menganalisis file log dari %DriverData%\Contoso\Logs.

DriverData

DriverData Direktori ini tersedia di Windows 10, versi 1803 dan yang lebih baru, dan dapat diakses oleh administrator dan driver UMDF.

Driver mode kernel mengakses DriverData direktori dengan menggunakan tautan simbolis yang disediakan sistem yang disebut \DriverData.

Program mode pengguna mengakses DriverData direktori dengan menggunakan variabel %DriverData%lingkungan .

ProgramData

Variabel %ProgramData% lingkungan mode pengguna tersedia untuk digunakan komponen mode pengguna saat menyimpan data.

File sementara

File sementara biasanya digunakan dalam operasi perantara. Ini dapat ditulis ke sub-jalur di %TEMP% bawah variabel lingkungan atau %TMP% . Karena lokasi ini diakses melalui variabel lingkungan, kemampuan ini terbatas pada komponen mode pengguna. Tidak ada jaminan tentang masa pakai atau kegigihan file sementara ini setelah menanganinya ditutup. Sistem operasi atau pengguna dapat menghapusnya kapan saja dan mereka mungkin tidak bertahan di seluruh boot ulang.

Hindari menulis file di akar %TEMP% direktori atau %TMP% . Sebagai gantinya, buat subdirektori dengan nama perusahaan Anda lalu tulis file dan subdirektori lebih lanjut dalam direktori tersebut.

Status properti

Perangkat dan antarmuka perangkat mendukung penyimpanan status melalui model properti PnP. Model properti memungkinkan data properti terstruktur disimpan terhadap antarmuka perangkat atau perangkat. Ini dimaksudkan untuk data yang lebih kecil yang cukup sesuai dengan jenis properti yang didukung oleh model properti.

Untuk mengakses properti perangkat, API ini dapat digunakan:

Untuk mengakses properti antarmuka perangkat, API ini dapat digunakan:

Menggunakan antarmuka perangkat

Jika driver ingin mengizinkan komponen lain membaca atau memodifikasi status internal driver, driver harus mengekspos antarmuka yang dapat dipanggil komponen lain yang memberi tahu driver pengaturan apa yang akan dikembalikan atau cara memodifikasi pengaturan tertentu. Misalnya, layanan driver dapat mengekspos antarmuka IOCTL melalui antarmuka perangkat.

Biasanya, driver yang memiliki status mengekspos antarmuka perangkat di kelas antarmuka perangkat kustom. Ketika driver siap untuk komponen lain untuk memiliki akses ke status, itu memungkinkan antarmuka. Untuk mendapatkan pemberitahuan ketika antarmuka perangkat diaktifkan, komponen mode pengguna dapat mendaftar untuk pemberitahuan kedatangan antarmuka perangkat dan komponen mode kernel dapat menggunakan IoRegisterPlugPlayNotification. Agar komponen ini dapat mengakses status, driver yang mengaktifkan antarmuka harus menentukan kontrak untuk kelas antarmuka perangkat kustomnya. Kontrak ini biasanya adalah salah satu dari dua jenis:

  • Kontrak I/O dapat dikaitkan dengan kelas antarmuka perangkat yang menyediakan mekanisme untuk mengakses status. Komponen lain menggunakan antarmuka perangkat yang diaktifkan untuk mengirim permintaan I/O yang sesuai dengan kontrak.

  • Antarmuka panggilan langsung yang dikembalikan melalui antarmuka kueri. Driver lain dapat mengirim IRP_MN_QUERY_INTERFACE untuk mengambil penunjuk fungsi dari driver untuk dipanggil.

Atau, jika driver yang memiliki status memungkinkan akses langsung ke status, driver lain dapat mengakses status dengan menggunakan fungsi yang disediakan sistem untuk akses terprogram ke status antarmuka perangkat. Lihat Status Registri Antarmuka Perangkat untuk informasi selengkapnya.

Antarmuka atau status ini (tergantung pada metode berbagi yang digunakan) perlu di-versi dengan benar sehingga driver yang memiliki status dapat dilayankan secara independen dari komponen lain yang mengakses status tersebut. Vendor driver tidak dapat mengandalkan komponen lain yang dilayankan pada saat yang sama dengan driver dan tetap pada versi yang sama.

Karena perangkat dan driver yang mengontrol antarmuka datang dan pergi, driver dan aplikasi harus menghindari panggilan IoGetDeviceInterfaces pada start-up komponen untuk mendapatkan daftar antarmuka yang diaktifkan. Sebaliknya, praktik terbaik adalah mendaftar untuk pemberitahuan kedatangan atau penghapusan antarmuka perangkat dan kemudian memanggil fungsi yang sesuai untuk mendapatkan daftar antarmuka yang diaktifkan yang ada pada komputer.

Untuk informasi selengkapnya tentang antarmuka perangkat, lihat:

Referensi cepat dukungan sistem operasi untuk API manajemen status

Sebagian besar paket driver perlu mendukung berbagai versi sistem operasi. Lihat Mendukung beberapa versi sistem operasi untuk informasi selengkapnya tentang cara mencapainya dalam paket driver. Tabel berikut ini memberikan referensi cepat tentang kapan dukungan sistem operasi ditambahkan untuk berbagai API manajemen status.

Driver WDM

Sistem operasi Dukungan ditambahkan
Windows 2000 IoopenDeviceRegistryKey
IoOpenDeviceInterfaceRegistryKey
Windows Vista IoGetDevicePropertyData
IoSetDevicePropertyData
Windows 8 IoGetDeviceInterfacePropertyData
IoSetDeviceInterfacePropertyData
Windows 8.1 IoQueryFullDriverPath
Windows 10 1803 IoOpenDriverRegistryKey untuk RegKeyType dari DriverRegKeyParameters dan DriverRegKeyPersistentState
IoGetDeviceDirectory
IoGetDriverDirectory untuk DirectoryType driverDirectoryImage dan DriverDirectoryData
Windows 10 1809 RtlQueryRegistryValueWithFallback
Windows 11 21H2 IoOpenDriverRegistryKey untuk RegKeyType dari DriverRegKeySharedPersistentState
IoGetDriverDirectory untuk DirectoryType dari DriverDirectorySharedData

Driver KMDF

Versi KMDF Dukungan ditambahkan
1.0 WdfDeviceOpenRegistryKey
WdfFdoInitOpenRegistryKey
WdfDriverOpenParametersRegistryKey
WdfDeviceQueryProperty
WdfDeviceAllocAndQueryProperty
WdfFdoInitQueryProperty
WdfFdoInitAllocAndQueryProperty
1.13 WdfDeviceQueryPropertyEx
WdfDeviceAllocAndQueryPropertyEx
WdfDeviceAssignProperty
WdfFdoInitQueryPropertyEx
WdfFdoInitAllocAndQueryPropertyEx
1.25 WdfDriverOpenPersistentStateRegistryKey (Windows 10 1803)

Driver UMDF

Versi UMDF Dukungan ditambahkan
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

Kode mode pengguna

Sistem operasi Dukungan ditambahkan
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