Konfigurasi driver kelas keyboard dan mouse

Catatan

Topik ini untuk pengembang yang mengonfigurasi driver kelas keyboard dan mouse. Jika Anda ingin memperbaiki mouse atau keyboard, lihat:

Keyboard dan tikus non-HID dapat terhubung melalui beberapa bus warisan tetapi masih menggunakan driver kelas yang sama. Bagian ini berisi detail tentang driver kelas itu sendiri. Bagian berikut masuk ke detail pada pengontrol.

Topik ini menjelaskan konfigurasi fisik khas perangkat keyboard dan mouse di Microsoft Windows 2000 dan yang lebih baru.

Gambar berikut menunjukkan dua konfigurasi umum yang menggunakan satu keyboard dan satu mouse.

Diagram yang mengilustrasikan dua konfigurasi yang menggunakan satu keyboard dan satu mouse.

Gambar di sebelah kiri menunjukkan keyboard dan mouse yang terhubung ke bus sistem melalui pengontrol independen. Konfigurasi umum terdiri dari keyboard gaya PS/2 yang dioperasikan melalui pengontrol i8042, dan mouse bergaya serial yang dioperasikan melalui pengontrol port serial.

Informasi tambahan berikut ini penting untuk produsen keyboard dan mouse:

  • Keyboard dibuka dalam mode eksklusif oleh tumpukan sistem operasi karena alasan keamanan
  • Windows mendukung koneksi simultan lebih dari satu keyboard dan perangkat tetikus.
  • Windows tidak mendukung akses independen oleh klien ke setiap perangkat.

Fitur driver kelas

Topik ini menjelaskan fitur driver kelas sistem Microsoft Windows 2000 dan yang lebih baru berikut:

  • Kbdclass, driver kelas untuk perangkat kelas perangkat GUID_CLASS_KEYBOARD

  • Mouclass, driver kelas untuk perangkat kelas perangkat GUID_CLASS_MOUSE

Kbdclass mengimplementasikan layanan Kbdclass dan gambar yang dapat dieksekusi kbdclass.sys.

Mouclass mengimplementasikan layanan Mouclass dan gambar yang dapat dieksekusi mouclass.sys.

Kbdclass dan Mouclass setiap fitur:

  • Operasi generik dan independen perangkat keras dari kelas perangkat.

  • Plug and Play, manajemen daya, dan Instrumentasi Manajemen Windows (WMI).

  • Pengoperasian perangkat warisan.

  • Pengoperasian simultan lebih dari satu perangkat.

  • Koneksi rutinitas panggilan balik layanan kelas yang digunakan driver fungsi untuk mentransfer data dari buffer data input perangkat ke buffer data driver kelas.

Konfigurasi objek perangkat

Gambar berikut menunjukkan konfigurasi objek perangkat untuk keyboard dan perangkat mouse gaya PS/2 Plug and Play. Setiap driver kelas membuat objek perangkat filter kelas atas (filter DO) yang dilampirkan ke objek perangkat fungsi (FDO) melalui DO filter perangkat tingkat atas opsional. Driver filter perangkat tingkat atas membuat DO filter perangkat tingkat atas. I8042prt membuat FUNGSI DO dan melampirkannya ke objek perangkat fisik (PDO) yang dibuat oleh driver bus akar.

Diagram yang mengilustrasikan konfigurasi objek perangkat untuk keyboard gaya ps/2 dan perangkat mouse.

PS/2 Keyboard

Tumpukan driver keyboard terdiri dari berikut ini.

  • Kbdclass, driver filter kelas keyboard tingkat atas
  • Satu atau beberapa driver filter keyboard tingkat atas opsional
  • I8042prt, driver fungsi

PS/2 Mouse

Tumpukan driver mouse terdiri dari berikut ini.

  • Mouclass, driver filter kelas mouse tingkat atas
  • Satu atau beberapa pengandar filter mouse tingkat atas opsional
  • I8042prt, driver fungsi

Kbdclass dan Mouclass dapat mendukung lebih dari satu perangkat dalam dua mode berbeda. Dalam mode satu-ke-satu, setiap perangkat memiliki tumpukan perangkat independen. Driver kelas membuat dan melampirkan DO kelas independen ke setiap tumpukan perangkat. Setiap tumpukan perangkat memiliki status kontrol dan buffer inputnya sendiri. Subsistem Microsoft Win32 mengakses input dari setiap perangkat melalui objek file yang unik.

Dalam mode grandmaster, driver kelas mengoperasikan semua perangkat dengan cara berikut:

  • Driver kelas membuat do kelas grandmaster yang mewakili semua perangkat dan DO kelas bawahan untuk setiap perangkat.

    Driver kelas melampirkan DO kelas subordinat ke setiap tumpukan perangkat. Di bawah kelas subordinat DO, tumpukan perangkat sama dengan yang dibuat dalam mode satu-ke-satu.

  • Kelas grandmaster DO mengontrol pengoperasian semua DO bawahan.

  • Subsistem Win32 mengakses semua input perangkat melalui objek file yang mewakili perangkat kelas grandmaster.

  • Semua input perangkat di-buffer dalam antrean data grandmaster.

  • Grandmaster mempertahankan satu status perangkat global.

Kbdclass dan Mouclass beroperasi dalam mode satu-ke-satu jika nilai entri registri mereka ConnectMultiplePorts diatur ke 0x00 (di bawah kunci HKLM\Services\CurrentControlSet\<class service>\Parameters, di mana layanan kelas adalah Kbdclass atau Mouclass). Jika tidak, Kbdclass dan Mouclass beroperasi dalam mode grandmaster.

Buka dan tutup melalui driver kelas

Subsistem Microsoft Win32 membuka semua perangkat keyboard dan mouse untuk penggunaan eksklusifnya. Untuk setiap kelas perangkat, subsistem Win32 memperlakukan input dari semua perangkat seolah-olah input berasal dari satu perangkat input. Aplikasi tidak dapat meminta untuk menerima input hanya dari satu perangkat tertentu.

Subsistem Win32 secara dinamis membuka Plug and Play perangkat input setelah menerima pemberitahuan dari manajer Plug and Play bahwa antarmuka perangkat GUID_CLASS_KEYBOARD atau GUID_CLASS_MOUSE diaktifkan. Subsistem Win32 menutup perangkat Plug and Play setelah menerima pemberitahuan bahwa antarmuka yang dibuka dinonaktifkan. Subsistem Win32 juga membuka perangkat warisan berdasarkan nama (misalnya, "\Device\KeyboardLegacyClass0"). Perhatikan bahwa setelah subsistem Win32 berhasil membuka perangkat warisan, itu tidak dapat menentukan apakah perangkat kemudian dihapus secara fisik.

Setelah Kbdclass dan Mouclass menerima permintaan buat, mereka melakukan hal berikut untuk operasi Plug and Play dan warisan:

  • Operasi Plug and Play

    Jika perangkat dalam status mulai Plug and Play, driver kelas mengirimkan permintaan IRP_MJ_CREATE ke bawah tumpukan driver. Jika tidak, driver kelas menyelesaikan permintaan tanpa mengirim permintaan ke tumpukan driver. Driver kelas mengatur file tepercaya yang memiliki akses baca ke perangkat. Jika ada perangkat grandmaster, driver kelas mengirimkan permintaan buat ke semua port yang terkait dengan perangkat kelas bawahan.

  • Operasi Warisan

    Driver kelas mengirimkan permintaan kontrol perangkat internal ke driver port untuk mengaktifkan perangkat.

Menyambungkan panggilan balik layanan ke perangkat

Driver kelas harus menghubungkan layanan kelas mereka ke perangkat sebelum perangkat dapat dibuka. Driver kelas menghubungkan layanan kelas mereka setelah mereka melampirkan KELAS DO ke tumpukan perangkat. Driver fungsi menggunakan panggilan balik layanan kelas untuk mentransfer data input dari perangkat ke antrean data kelas untuk perangkat. Rutinitas penyelesaian pengiriman ISR driver fungsi untuk perangkat memanggil panggilan balik layanan kelas. Kbdclass menyediakan panggilan balik layanan kelas KeyboardClassServiceCallback, dan Mouclass menyediakan panggilan balik layanan kelas MouseClassServiceCallback.

Vendor dapat memodifikasi pengoperasian panggilan balik layanan kelas dengan menginstal driver filter tingkat atas untuk perangkat. Contoh driver filter keyboard Kbfiltr menentukan panggilan balik KbFilter_ServiceCallback , dan contoh driver filter mouse Moufiltr menentukan panggilan balik MouFilter_ServiceCallback . Panggilan balik layanan filter sampel dapat dikonfigurasi untuk memodifikasi data input yang ditransfer dari buffer input port untuk perangkat ke antrean data kelas. Misalnya, panggilan balik layanan filter dapat menghapus, mengubah, atau menyisipkan data.

Panggilan balik layanan kelas dan filter tersambung dengan cara berikut:

  • Driver kelas mengirimkan permintaan sambungkan perangkat internal ke tumpukan perangkat (IOCTL_INTERNAL_KEYBOARD_CONNECT atau IOCTL_INTERNAL_MOUSE_CONNECT). Data koneksi kelas ditentukan oleh struktur CONNECT_DATA yang menyertakan penunjuk ke objek perangkat kelas, dan penunjuk ke panggilan balik layanan kelas.

  • Setelah driver filter menerima permintaan sambungkan, driver tersebut menyimpan salinan data koneksi kelas, dan mengganti data koneksi permintaan dengan data sambungkan filter. Filter menyambungkan data menentukan penunjuk ke objek perangkat filter dan penunjuk ke panggilan balik layanan driver filter. Driver filter kemudian mengirim permintaan sambungkan yang difilter ke driver fungsi.

Panggilan balik layanan kelas dan filter dipanggil dengan cara berikut:

  • Driver fungsi menggunakan filter menyambungkan data untuk melakukan panggilan balik awal ke panggilan balik layanan filter.

  • Setelah memfilter data input, panggilan balik layanan filter menggunakan data koneksi kelas yang disimpannya untuk melakukan panggilan balik ke panggilan balik layanan kelas.

Mengkueri dan mengatur perangkat keyboard

I8042prt mendukung permintaan kontrol perangkat internal berikut untuk mengkueri informasi tentang perangkat keyboard, dan untuk mengatur parameter pada perangkat keyboard:

IOCTL_KEYBOARD_QUERY_ATTRIBUTES

IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION

IOCTL_KEYBOARD_QUERY_INDICATORS

IOCTL_KEYBOARD_QUERY_TYPEMATIC

IOCTL_KEYBOARD_SET_INDICATORS

IOCTL_KEYBOARD_SET_TYPEMATIC

Untuk informasi selengkapnya tentang semua permintaan kontrol perangkat keyboard, lihat Referensi Perangkat Antarmuka Manusia.

Pindai pemeta kode untuk keyboard

Dalam sistem operasi Microsoft Windows, kode pemindaian yang kompatibel dengan PS/2 yang disediakan oleh perangkat input dikonversi menjadi kunci virtual, yang disebarkan melalui sistem dalam bentuk pesan Windows. Jika perangkat menghasilkan kode pemindaian yang salah untuk kunci tertentu, pesan kunci virtual yang salah akan dikirim. Ini dapat diperbaiki dengan menulis driver filter yang menganalisis kode pemindaian yang dihasilkan oleh firmware dan memodifikasi kode pemindaian yang salah untuk dipahami oleh sistem. Namun, ini adalah proses yang melelahkan dan terkadang dapat menyebabkan masalah parah, jika kesalahan ada di driver filter tingkat kernel.

Windows 2000 dan Windows XP menyertakan Pemeta Kode Pemindaian baru, yang menyediakan metode yang memungkinkan pemetaan kode pemindaian. Pemetaan kode pemindaian untuk Windows disimpan dalam kunci registri berikut:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout

Catatan Ada juga tombol Tata Letak Keyboard (perhatikan bentuk jamak) di bawah tombol Kontrol, tetapi tombol itu tidak boleh dimodifikasi.

Di tombol Tata Letak Keyboard , nilai Peta Scancode harus ditambahkan. Nilai ini berjenis REG_BINARY (format Endian kecil) dan memiliki format data yang ditentukan dalam tabel berikut.

Mulai offset (dalam byte) Ukuran Halaman (dalam Byte) Data
0 4 Header: Informasi Versi
4 4 Header: Bendera
8 4 Header: Jumlah Pemetaan
12 4 Pemetaan Individu
... ... ...
4 byte terakhir 4 Terminator Null (0x00000000)

DWORDS pertama dan kedua menyimpan informasi header dan harus diatur ke semua nol untuk versi Pemeta Kode Pemindaian saat ini. Entri DWORD ketiga menyimpan hitungan jumlah total pemetaan yang mengikuti, termasuk pemetaan penghentian null. Oleh karena itu, jumlah minimum adalah 1 (tidak ada pemetaan yang ditentukan). Pemetaan individual mengikuti header . Setiap pemetaan memiliki panjang satu DWORD dan dibagi menjadi dua bidang panjang WORD. Setiap bidang WORD menyimpan kode pemindaian untuk kunci yang akan dipetakan.

Setelah peta disimpan dalam registri, sistem harus di-boot ulang agar pemetaan berlaku. Perhatikan bahwa jika pemetaan kode pemindaian diperlukan pada keypress, langkah tersebut dilakukan dalam mode pengguna tepat sebelum kode pemindaian dikonversi ke kunci virtual. Melakukan konversi ini dalam mode pengguna dapat menunjukkan batasan tertentu, seperti pemetaan yang tidak berfungsi dengan benar saat berjalan di bawah Layanan Terminal.

Untuk menghapus pemetaan ini, hapus nilai registri Peta Scancode dan reboot.

Contoh 1

Berikut ini menyajikan contoh. Untuk menukar tombol CTRL kiri dengan kunci CAPS LOCK, gunakan editor registri (sebaiknya Regedt32.exe) untuk memodifikasi kunci Peta Scancode dengan nilai berikut:

00000000 00000000 03000000 3A001D00 1D003A00 00000000

Tabel berikut berisi entri ini yang dipecah menjadi bidang DWORD dan byte yang ditukar.

Nilai: Interpretasi

0x00000000: Header: Versi. Atur ke semua nol.

0x00000000: Header: Bendera. Atur ke semua nol.

0x00000003: Tiga entri dalam peta (termasuk entri null).

0x001D003A: Tombol CTRL kiri --> CAPS LOCK (0x1D --> 0x3A).

0x003A001D: CAPS LOCK --> Tombol CTRL kiri (0x3A --> 0x1D).

0x00000000: Terminator null.

Contoh 2

Dimungkinkan juga untuk menambahkan kunci yang tidak tersedia secara umum pada keyboard atau untuk menghapus kunci yang tidak pernah digunakan. Contoh berikut menunjukkan nilai yang disimpan di Peta Scancode untuk menghapus kunci CTRL yang tepat dan mengubah fungsionalitas kunci ALT yang tepat agar berfungsi sebagai kunci bisu:

00000000 00000000 03000000 00001DE0 20E038E0 00000000

Tabel berikut berisi entri ini yang dipecah menjadi bidang DWORD dan byte yang ditukar.

Nilai: Interpretasi

0x00000000: Header: Versi. Atur ke semua nol.

0x00000000: Header: Bendera. Atur ke semua nol.

0x00000003: Tiga entri dalam peta (termasuk entri null).

0xE01D0000: Hapus tombol CTRL yang tepat (0xE01D --> 0x00).

0xE038E020: Tombol ALT kanan --> Tombol bisukan (0xE038 --> 0xE020).

0x00000000: Terminator null.

Setelah data yang diperlukan dihasilkan, data dapat dimasukkan ke dalam registri dengan beberapa cara.

  • File .reg dapat dihasilkan yang dapat dengan mudah dimasukkan ke dalam registri sistem menggunakan editor registri.
  • File .inf juga dapat dibuat dengan bagian [AddReg] yang berisi informasi registri yang akan ditambahkan.
  • Regedt32.exe dapat digunakan untuk menambahkan informasi secara manual ke registri.

Scan Code Mapper memiliki beberapa kelebihan dan kekurangan.

Keuntungannya meliputi:

  • Pemeta dapat digunakan sebagai perbaikan mudah untuk memperbaiki kesalahan firmware.
  • Tombol yang sering digunakan dapat ditambahkan ke keyboard dengan memodifikasi peta dalam registri. Kunci yang tidak sering digunakan (misalnya, tombol CTRL kanan) dapat dipetakan ke null (dihapus) atau ditukar dengan kunci lain.
  • Lokasi utama dapat diubah dengan mudah. Pengguna dapat dengan mudah menyesuaikan lokasi kunci yang sering digunakan untuk keuntungan mereka.

Kerugian berikut dikenali:

  • Setelah peta disimpan di registri, reboot sistem diperlukan untuk mengaktifkannya.
  • Pemetaan yang disimpan dalam registri berfungsi di tingkat sistem dan berlaku untuk semua pengguna. Pemetaan ini tidak dapat diatur untuk bekerja secara berbeda tergantung pada pengguna saat ini.
  • Implementasi saat ini membatasi fungsionalitas peta sehingga pemetaan selalu berlaku untuk semua keyboard yang terhubung ke sistem. Saat ini tidak dimungkinkan untuk membuat peta berdasarkan per keyboard.

Mengkueri perangkat mouse

I8042prt mendukung permintaan kontrol perangkat internal berikut untuk mengkueri informasi tentang perangkat mouse:

IOCTL_MOUSE_QUERY_ATTRIBUTES

Untuk informasi selengkapnya tentang semua permintaan kontrol perangkat mouse, lihat Referensi Perangkat Antarmuka Manusia.

Pengaturan registri yang terkait dengan driver kelas mouse

Berikut ini adalah daftar kunci registri yang terkait dengan driver kelas mouse.

[Kunci: HKLM\SYSTEM\CurrentControlSet\Services\Mouclass\Parameters]

  • MaximumPortsServiced – Tidak digunakan pada Windows XP dan yang lebih baru. Hanya untuk Windows NT4.
  • PointerDeviceBaseName – Menentukan nama dasar untuk objek perangkat yang dibuat oleh driver perangkat kelas mouse
  • ConnectMultiplePorts – Menentukan apakah ada satu atau beberapa objek perangkat port untuk setiap objek perangkat kelas. Entri ini digunakan terutama oleh driver perangkat.
  • MouseDataQueueSize - Menentukan jumlah peristiwa mouse yang di-buffer oleh driver mouse. Ini juga digunakan dalam menghitung ukuran buffer internal driver mouse di kumpulan memori yang tidak dipagasi.

Perangkat penunjuk absolut

Untuk perangkat jenis GUID_CLASS_MOUSE, driver fungsi perangkat:

  • Menangani input khusus perangkat.

  • Membuat struktur MOUSE_INPUT_DATA yang diperlukan oleh MouseClassServiceCallback.

  • Mentransfer struktur MOUSE_INPUT_DATA ke antrean data Mouclass dengan memanggil MouseClassServiceCallback dalam rutinitas penyelesaian pengiriman ISR-nya.

Untuk perangkat penunjuk absolut, driver fungsi perangkat harus mengatur anggota LastX, LastY, dan Flags dari struktur MOUSE_INPUT_DATA dengan cara berikut:

  • Selain memba lagi nilai input perangkat dengan kemampuan maksimum perangkat, driver menskalakan nilai input perangkat dengan 0xFFFF:

    LastX = ((device input x value) * 0xFFFF ) / (Maximum x capability of the device)
    LastY = ((device input y value) * 0xFFFF ) / (Maximum y capability of the device)
    
  • Driver mengatur bendera MOUSE_MOVE_ABSOLUTE di Bendera.

  • Jika input harus dipetakan oleh Window Manager ke seluruh desktop virtual, driver mengatur bendera MOUSE_VIRTUAL_DESKTOP di Bendera. Jika bendera MOUSE_VIRTUAL_DESKTOP tidak diatur, Window Manager memetakan input hanya ke monitor utama.

Berikut ini menentukan, berdasarkan jenis perangkat, bagaimana persyaratan khusus untuk perangkat penunjuk absolut ini diimplementasikan:

  • Perangkat HID:

    Mouhid, driver fungsi Windows untuk perangkat mouse HID, menerapkan persyaratan khusus ini secara otomatis.

  • Perangkat bergaya PS/2:

    Driver filter tingkat atas diperlukan. Driver filter menyediakan panggilan balik IsrHook dan panggilan balik layanan kelas. I8042prt memanggil IsrHook untuk menangani input perangkat mentah, dan memanggil panggilan balik layanan kelas filter untuk memfilter input. Panggilan balik layanan kelas filter, pada gilirannya, memanggil MouseClassServiceCallback. Kombinasi panggilan balik IsrHook dan panggilan balik layanan kelas menangani input khusus perangkat, membuat struktur MOUSE_INPUT_DATA yang diperlukan, menskalakan data input perangkat, dan mengatur bendera MOUSE_MOVE_ABSOLUTE.

  • Plug and Play perangkat port COM yang dijumlahkan oleh Serenum:

    Driver fungsi Plug and Play diperlukan. Driver fungsi membuat struktur MOUSE_INPUT_DATA yang diperlukan, menskalakan data input perangkat, dan mengatur bendera MOUSE_MOVE_ABSOLUTE sebelum memanggil MouseClassServiceCallback.

  • Perangkat port COM non-Plug and Play:

    Driver fungsi khusus perangkat diperlukan. Driver fungsi membuat struktur MOUSE_INPUT_DATA yang diperlukan, menskalakan data input perangkat, dan mengatur bendera MOUSE_MOVE_ABSOLUTE sebelum memanggil MouseClassServiceCallback.

  • Perangkat pada bus yang tidak didukung:

    Driver fungsi khusus perangkat diperlukan. Driver fungsi membuat struktur MOUSE_INPUT_DATA yang diperlukan, menskalakan data input perangkat, dan mengatur bendera MOUSE_MOVE_ABSOLUTE sebelum memanggil MouseClassServiceCallback.