Minidriver dan driver kelas HID
Artikel ini menjelaskan minidriver dan driver kelas HID.
Untuk informasi selengkapnya, lihat Membuat minidriver WDF HID.
Fitur operasional driver kelas HID
Driver kelas HID melakukan operasi berikut:
Menyediakan dan mengelola antarmuka tingkat atas yang digunakan driver mode kernel dan aplikasi mode pengguna untuk mengakses koleksi HID yang didukung perangkat input.
Driver kelas HID secara transparan mengelola dan merutekan semua komunikasi antara driver dan aplikasi tingkat atas dan perangkat input dasar yang mendukung koleksi HID. Ini mengelola berbagai protokol data yang digunakan oleh perangkat input yang berbeda dan antrean input yang mendukung lebih dari satu file terbuka pada koleksi HID yang sama.
Antarmuka tingkat atas ke koleksi HID terdiri dari IOCTL driver kelas HID, rutinitas dukungan HIDClass, dan struktur HIDClass.
Berkomunikasi dengan minidriver HID dengan memanggil rutinitas driver standar minidriver.
Membuat objek perangkat fungsi (FDO) untuk perangkat input HIDClass yang dijumlahkan oleh bus tingkat bawah atau driver port.
Misalnya, driver kelas HID membuat dan mengelola operasi FDO yang mewakili perangkat USB HID yang dihitung oleh tumpukan driver USB yang disediakan sistem.
Menyediakan fungsionalitas driver bus untuk perangkat anak (koleksi HID) yang didukung oleh perangkat input yang mendasar.
Driver kelas HID membuat objek perangkat fisik (PDO) untuk setiap koleksi HID yang didukung oleh perangkat input dan mengelola operasi koleksi.
Mengikat minidriver ke HIDClass
Minidriver HID mengikat operasinya ke driver kelas HID dengan memanggil HidRegisterMinidriver untuk mendaftarkan dirinya dengan driver kelas HID. Operasi pendaftaran:
Menyimpan salinan titik masuk (pointer) ke rutinitas driver standar hid minidriver di ekstensi perangkat driver kelas HID.
Minidriver HID mengatur titik masuknya di objek driver yang diterima minidriver sebagai input ke rutinitas DRIVER_INITIALIZE . Minidriver HID mengatur titik masuk ini sebelum mendaftar dengan driver kelas HID.
Mengatur ulang titik masuk dalam objek driver minidriver ke titik masuk untuk rutinitas driver standar yang disediakan oleh driver kelas HID.
Driver kelas HID menyediakan rutinitas driver standar berikut:
rutinitas DRIVER_ADD_DEVICE dan DRIVER_UNLOAD
Mengirimkan rutinitas untuk permintaan I/O berikut:
Proses pendaftaran juga mengalokasikan memori untuk ekstensi perangkat sungai pikiran HID. Meskipun memori dialokasikan oleh driver kelas HID, hanya minidriver HID yang menggunakan ekstensi perangkat ini.
Berkomunikasi dengan minidriver HID
Driver kelas HID berkomunikasi dengan minidriver HID dengan memanggil rutinitas DRIVER_ADD_DEVICE, DRIVER_UNLOAD, dan pengiriman minidriver HID sebagai berikut:
Memanggil rutinitas AddDevice
Ketika rutinitas AddDevice driver kelas HID dipanggil untuk membuat objek perangkat fungsional (FDO), driver kelas HID membuat FDO, menginisialisasinya, dan memanggil rutinitas AddDevice minidriver HID. Rutinitas AddDevice minidriver HID melakukan inisialisasi khusus perangkat internal dan, jika berhasil, mengembalikan STATUS_SUCCESS. Jika rutinitas AddDevice minidriver HID tidak berhasil, driver kelas HID menghapus FDO dan mengembalikan status yang dikembalikan oleh rutinitas Hid minidriver AddDevice .
Memanggil rutinitas Bongkar
Ketika rutinitas Pembongkaran driver kelas HID dipanggil, driver kelas HID selesai merilis semua sumber daya yang terkait dengan FDO dan memanggil rutinitas Bongkar Muat minidriver HID.
Memanggil rutinitas Pengiriman
Untuk mengoperasikan perangkat, driver kelas HID terutama memanggil rutinitas pengiriman minidriver HID untuk permintaan kontrol perangkat internal.
Ketika manajer I/O mengirim permintaan ke driver kelas HID, driver kelas HID memproses permintaan, dan memanggil rutinitas pengiriman terkait hid minidriver.
Driver kelas HID tidak mengirim permintaan berikut ke minidriver HID: buat, tutup, atau kontrol perangkat.
Pengoperasian minidriver HID
Minidriver transportasi HID mengabstraksi pengoperasian bus perangkat keras atau port yang dilampirkan perangkat input Anda.
Minidriver HID dapat dibangun menggunakan salah satu kerangka kerja berikut:
- UMDF – Kerangka Kerja Driver Mode Pengguna
- KDMF – Kerangka Kerja Driver Mode Kernel
- WDF - Windows Driver Framework
- WDM – Windows Driver Model (warisan)
Microsoft merekomendasikan penggunaan solusi berbasis Kerangka Kerja (KMDF atau UMDF). Untuk informasi selengkapnya tentang setiap model driver, kunjungi bagian berikut:
- Minidriver HID berbasis KMDF, lihat Membuat Minidriver HID berbasis Kerangka Kerja
- Minidriver HID berbasis UMDF, lihat Membuat Minidriver WDF HID
Bagian berikut berbicara tentang mendaftarkan minidriver HID berbasis WDM tetapi sebagian besar berkaitan dengan driver Kerangka Kerja berbasis KMDF juga. Semua minidriver HID harus mendaftar dengan driver kelas HID, dan driver kelas HID berkomunikasi dengan minidriver dengan memanggil rutinitas driver standar minidriver.
Untuk informasi selengkapnya tentang fungsionalitas yang harus didukung oleh minidriver HID dalam rutinitas driver standarnya, lihat bagian berikut ini:
- Mendaftarkan minidriver HID
- Ekstensi minidriver HID
- Menggunakan struktur HID_DEVICE_EXTENSION
- Rutinitas minidriver standar
Untuk informasi selengkapnya tentang driver kelas HID, lihat Pengoperasian minidriver HID.
Mendaftarkan minidriver HID
Setelah minidriver HID menyelesaikan semua inisialisasi driver lainnya dalam rutinitas DRIVER_INITIALIZE , minidriver HID mengikat operasinya ke driver kelas HID dengan memanggil HidRegisterMinidriver.
Ketika minidriver HID mendaftar dengan driver kelas HID, itu menggunakan struktur HID_MINIDRIVER_REGISTRATION . Struktur menentukan:
- Revisi HID
- Objek driver minidriver HID
- Ukuran ekstensi perangkat minidriver HID
- Apakah perangkat dijajaki
Ekstensi minidriver HID
Ekstensi perangkat minidriver HID khusus untuk perangkat, dan hanya digunakan oleh minidriver HID. Driver kelas HID mengalokasikan memori untuk ekstensi perangkat minidriver ketika driver kelas membuat ekstensi perangkatnya untuk objek perangkat fungsional (FDO). Minidriver HID menentukan ukuran ekstensi perangkatnya saat mendaftarkan minidriver dengan driver kelas HID. Ukuran ditentukan oleh anggota DeviceExtensionSize dari struktur HID_MINIDRIVER_REGISTRATION .
Menggunakan struktur HID_DEVICE_EXTENSION
Minidriver HID harus menggunakan struktur HID_DEVICE_EXTENSION sebagai tata letak untuk ekstensi perangkat yang dibuat oleh driver kelas HID untuk objek perangkat fungsional (FDO). Driver kelas HID mengatur anggota struktur ini ketika menginisialisasi FDO. Minidriver HID tidak boleh mengubah informasi dalam struktur ini.
Struktur HID_DEVICE_EXTENSION berisi anggota berikut:
PhysicalDeviceObject adalah penunjuk ke objek perangkat fisik (PDO) yang mewakili perangkat input yang mendasar.
NextDeviceObject adalah penunjuk ke bagian atas tumpukan perangkat di bawah FDO.
MiniDeviceExtension adalah penunjuk ke ekstensi perangkat minidriver HID.
Mengingat penunjuk ke FDO perangkat input, makro GET_MINIDRIVER_DEVICE_EXTENSION berikut mengembalikan penunjuk ke ekstensi minidriver HID:
#define GET_MINIDRIVER_DEVICE_EXTENSION(DO) ((PDEVICE_EXTENSION) (((PHID_DEVICE_EXTENSION)(DO)->DeviceExtension)->MiniDeviceExtension))
PDEVICE_EXTENSION adalah penunjuk ke ekstensi perangkat khusus perangkat yang dideklarasikan oleh minidriver HID.
Demikian pula, minidriver HID dapat memperoleh penunjuk ke PDO perangkat input dan bagian atas tumpukan perangkat di bawah FDO perangkat input.
Ketika minidriver HID mengirim IRP ke bawah tumpukan perangkat, itu harus menggunakan NextDeviceObject sebagai objek perangkat target.
Rutinitas minidriver standar
Minidriver HID harus menyediakan rutinitas dukungan driver standar berikut:
- Rutinitas DriverEntry minidriver HID
- Hid minidriver AddDevice rutin
- Hid minidriver Unload rutin
Minidriver HID juga harus mendukung rutinitas pengiriman yang dijelaskan dalam Rutinitas pengiriman yang Disediakan oleh minidriver HID.
Rutinitas DriverEntry
Rutinitas DRIVER_INITIALIZE dalam minidriver HID melakukan hal berikut:
Membuat objek driver untuk pasangan driver yang ditautkan (driver kelas HID dan minidriver HID).
Mengatur titik masuk driver yang diperlukan dalam objek driver minidriver HID.
Memanggil HidRegisterMinidriver untuk mendaftarkan minidriver HID dengan driver kelas HID.
Apakah konfigurasi khusus perangkat yang hanya digunakan oleh minidriver HID.
Rutinitas AddDevice
Driver kelas HID menangani pembuatan dan inisialisasi objek perangkat fungsional (FDO) untuk perangkat input yang mendasar. Driver kelas HID juga mengoperasikan FDO dari perspektif antarmuka tingkat atas ke perangkat dasar dan perangkat turunannya (koleksi HID).
Driver kelas HID DRIVER_ADD_DEVICE rutin memanggil rutinitas AddDevice minidriver HID sehingga minidriver dapat melakukan inisialisasi khusus perangkat internal.
Parameter yang diteruskan ke minidriver HID DRIVER_ADD_DEVICE rutin adalah objek driver minidriver dan FDO. Driver kelas HID meneruskan FDO ke rutinitas AddDevice minidriver, bukan ke objek perangkat fisik untuk perangkat input yang mendasar.
Minidriver HID DRIVER_ADD_DEVICE rutin mendapatkan pointer ke ekstensi perangkat minidriver dari FDO.
Biasanya, minidriver HID DRIVER_ADD_DEVICE rutin melakukan hal berikut:
Menginisialisasi ekstensi perangkat minidriver. Ekstensi perangkat hanya digunakan oleh minidriver.
Mengembalikan STATUS_SUCCESS. Jika minidriver mengembalikan status kesalahan, driver kelas HID akan menghapus FDO dan mengembalikan status kesalahan ke manajer Plug and Play.
Membongkar rutinitas
Rutinitas Bongkar driver kelas HID memanggil minidriver HID DRIVER_UNLOAD rutin. Minidriver HID merilis sumber daya internal apa pun yang dialokasikan oleh minidriver.
Mengirimkan rutinitas
Minidriver HID harus menyediakan rutinitas pengiriman berikut: membuat, menutup, kontrol perangkat internal, kontrol sistem, Plug and Play, dan manajemen daya. Kecuali untuk permintaan kontrol perangkat internal, sebagian besar rutinitas pengiriman ini menyediakan fungsi minimal. Ketika driver kelas HID memanggil rutinitas pengiriman ini, itu melewati objek driver minidriver dan objek perangkat fungsional (FDO).
IRP_MJ_CREATE
Sesuai dengan persyaratan WDM, driver kelas HID dan minidriver HID menyediakan rutinitas pengiriman untuk membuat permintaan. Namun, FDO tidak dapat dibuka. Driver kelas HID mengembalikan STATUS_UNSUCCESSFUL.
Minidriver HID hanya perlu menyediakan ganja. Rutinitas pengiriman buat tidak pernah dipanggil.
IRP_MJ_CLOSE
Sesuai dengan persyaratan WDM, driver kelas HID dan minidriver HID harus menyediakan rutinitas pengiriman untuk permintaan dekat. Namun, FDO tidak dapat dibuka. Driver kelas HID mengembalikan STATUS_INVALID_PARAMETER_1.
Minidriver HID hanya perlu menyediakan ganja. Rutinitas pengiriman dekat tidak pernah dipanggil.
IRP_MJ_DEVICE_CONTROL
Minidriver HID tidak memerlukan rutinitas pengiriman untuk permintaan kontrol perangkat. Driver kelas HID tidak meneruskan permintaan kontrol perangkat ke minidriver.
IRP_MJ_INTERNAL_DEVICE_CONTROL
Minidriver HID harus menyediakan rutinitas pengiriman untuk permintaan kontrol perangkat internal yang mendukung permintaan yang dijelaskan dalam IOCTL minidriver HID.
Driver kelas HID terutama menggunakan permintaan kontrol perangkat internal untuk mengakses perangkat input yang mendasar.
Minidriver HID menangani permintaan ini dengan cara khusus perangkat.
IRP_MJ_SYSTEM_CONTROL
Minidriver HID harus menyediakan rutinitas pengiriman untuk permintaan kontrol sistem. Namun, minidriver HID hanya diperlukan untuk meneruskan permintaan kontrol sistem ke tumpukan perangkat sebagai berikut:
Lewati lokasi tumpukan IRP saat ini
Mengirim permintaan ke tumpukan perangkat FDO
IRP_MJ_PNP
Minidriver HID harus menyediakan rutinitas pengiriman untuk permintaan Plug and Play.
Driver kelas HID melakukan semua pemrosesan Plug and Play yang terkait dengan FDO. Ketika driver kelas HID memproses permintaan Plug and Play, driver tersebut memanggil rutinitas pengiriman Plug and Play minidriver HID.
Minidriver HID Plug and Play rutinitas pengiriman:
Menangani pengiriman permintaan ke tumpukan perangkat FDO dan menyelesaikan permintaan dalam cara mencadangkan tumpukan perangkat, yang sesuai untuk setiap jenis permintaan.
Apakah pemrosesan khusus perangkat yang terkait dengan permintaan tertentu untuk memperbarui informasi tentang status FDO.
Misalnya, minidriver mungkin memperbarui status Plug and Play FDO (khususnya, apakah FDO dimulai, dihentikan, atau dalam proses dihapus).
IRP_MJ_POWER
Minidriver HID harus menyediakan rutinitas pengiriman untuk permintaan daya. Namun, driver kelas HID menangani pemrosesan daya untuk FDO.
Sesuai dengan persyaratan WDM, minidriver HID mengirimkan permintaan daya ke tumpukan perangkat FDO dengan cara ini:
Melewati lokasi tumpukan IRP saat ini
Memulai IRP daya berikutnya
Mengirim power IRP ke bawah tumpukan perangkat FDO
Biasanya, minidriver HID meneruskan permintaan daya ke tumpukan perangkat tanpa pemrosesan tambahan.