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:
IoOpenDeviceRegistryKey (WDM)
Direktif INF AddReg menggunakan entri reg-root HKR di bagian add-registry yang direferensikan dari bagian INF DDInstall atau bagian DDInstall.HW, seperti yang ditunjukkan di bawah ini:
[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:
Direktif INF AddReg menggunakan entri reg-root HKR di bagian add-registry yang direferensikan dari bagian add-interface-section
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:
IoOpenDriverRegistryKey (WDM) dengan DRIVER_REGKEY_TYPE DriverRegKeyParameters
GetServiceRegistryStateKey (Win32 Services) dengan SERVICE_REGISTRY_STATE_TYPE ServiceRegistryStateParameters
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:
IoOpenDriverRegistryKey (WDM) dengan DRIVER_REGKEY_TYPE DriverRegKeyPersistentState
GetServiceRegistryStateKey (Layanan Win32) dengan SERVICE_REGISTRY_STATE_TYPE ServiceRegistryStatePersistent
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:
IoOpenDriverRegistryKey (WDM) dengan DRIVER_REGKEY_TYPE DriverRegKeySharedPersistentState
GetSharedServiceRegistryStateKey (Win32 Services) dengan SERVICE_SHARED_REGISTRY_STATE_TYPE ServiceSharedRegistryPersistentState
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:
IoGetDeviceDirectory (WDM) dengan parameter DirectoryType diatur ke DeviceDirectoryData
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:
IoGetDriverDirectory (WDM, KMDF) dengan parameter DirectoryType diatur ke DriverDirectoryData
GetServiceDirectory (Win32 Services) dengan parameter eDirectoryType diatur ke ServiceDirectoryPersistentState
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:
IoGetDriverDirectory (WDM, KMDF) dengan parameter DirectoryType diatur ke DriverDirectorySharedData
GetSharedServiceDirectory (Layanan Win32) dengan parameter DirectoryType diatur ke ServiceSharedDirectoryPersistentState
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:
Driver WDM
Driver WDF
Kode mode pengguna
Untuk mengakses properti antarmuka perangkat, API ini dapat digunakan:
Driver WDM
Driver WDF
Kode mode pengguna
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
Driver UMDF
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 |