虛擬鍵盤驅動程式

2021-05-25 18:20:17 字數 3304 閱讀 5299

文章出處:

作者****:李先靜

前 段時間寫乙個程式,要向系統中注入按鍵事件,我又不想信賴於具體的gui,就寫乙個虛擬鍵盤裝置驅動程式,感覺挺好用的,不過後來發現linux其實有一 個uinput驅動程式實現了類似的功能。幸好後來才發現uinput這玩意兒,否則就沒有機會去寫了這個程式了,有時真是寧願知識面窄一點,這樣才有機 會重**明一些輪子,從中獲得一些樂趣。

o 先寫乙個字元驅動程式。

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int vkeyboard_major =

201;

module_param(vkeyboard_major,

int,0)

;module_author(

"li xianjing ");

module_license(

"gpl");

static

struct input_dev* vkeyboard_idev = null;

int vkeyboard_open(

struct inode* inode,

struct file* filp)

int vkeyboard_release(

struct inode* inode,

struct file* filp)

ssize_t vkeyboard_read(

struct file* filp,

char __user *buf, size_t count, loff_t* f_pos)

struct keyboard_event; 

ssize_t vkeyboard_write(

struct file* filp,

const

char __user * buf, size_t count, loff_t* f_pos)

ret +=

sizeof

(event); 

input_event(vkeyboard_idev, ev_msc, msc_scan, event.key);

input_report_key(vkeyboard_idev, event.key

, event.press);

input_sync (vkeyboard_idev); 

printk(kern_info"%s p=%d key=%d with scan code/n"

, __func__, event.press

, event.key);

}return ret;

}static

struct file_operations vkeyboard_fops =

;static

int __init vkeyboard_init(

void

)static

void __exit vkeyboard_cleanup(

void) 

module_init(vkeyboard_init)

;module_exit(vkeyboard_cleanup)

;

o 再實現乙個虛擬輸入裝置。

static

int vkeyboard_input_dev_open(

struct input_dev* idev)

static

void vkeyboard_input_dev_close(

struct input_dev* idev)

static

int vkeyboard_input_dev_setup(

void) 

vkeyboard_idev->evbit[0]

= bit_mask(ev_key)

| bit_mask(ev_abs)

| bit_mask(ev_msc)

; vkeyboard_idev->mscbit[0]

= bit_mask(msc_scan)

| bit_mask(msc_serial)

| bit_mask(msc_raw); 

bitmap_fill(vkeyboard_idev->keybit, key_max)

; bitmap_fill(vkeyboard_idev->relbit, rel_max)

; bitmap_fill(vkeyboard_idev->absbit, abs_max)

;

vkeyboard_idev->name =

"vkeyboard"

; vkeyboard_idev->phys =

"vkeyboard/input0"

; vkeyboard_idev->open = vkeyboard_input_dev_open;

vkeyboard_idev->close = vkeyboard_input_dev_close;

for(i =

32; i < key_max; i++

) __set_bit(ev_key, vkeyboard_idev->evbit); 

ret = input_register_device(vkeyboard_idev)

;return ret;

}

o makefile

obj-m := vkeyboard.o

kdir := /lib/modules/$(shell uname -r)/build

pwd := $(shell pwd)

default:

$(make) -c $(kdir) subdirs=$(pwd) modules

install:

$(make) -c $(kdir) subdirs=$(pwd) modules_install

clean:

rm -f *.mod.c *.ko *.o module.markers modules.order module.symvers

載入模組後,向/dev/vkeyboard裡寫入要注入的事件,事件將會**到/dev/input/eventx輸入裝置檔案裡,系統會從這裡自動讀取事件。

開發虛擬串列埠驅動程式

虛擬串列埠就是當本地並沒有對應的串列埠硬體裝置,而為應用層提供串列埠裝置一樣的系統呼叫介面,以相容原本使用本地串列埠的應用軟體的 虛 裝置。本文作者給出了一種在windows平台上實現虛擬串列埠的方法,由此實現的 串列埠 具有真實串列埠完全相同的系統呼叫介面。在很多應用中需要用到虛擬串列埠,如在mo...

檢測不到相容的鍵盤驅動程式

今天剛裝的xp系統,提示檢測不到相容的鍵盤驅動程式,該對話方塊已被停用。解決辦法 只需將內容儲存成.reg檔案,然後雙擊之,將其內容注入登錄檔即可恢復 windows registry editor version 5.00 hkey local machine system currentcont...

linux 驅動程式 高階字元驅動程式

ioctl方法 驅動程式的原型實現 int ioctl struct inode inode,struct file filp,unsigned int cmd,unsigned long arg ioctl 命令選擇 位段結構 number direction ioc read ioc write...