浅析如何向usbhid的quirk黑名单中添加vid和pid
适用2.6.25内核,
ubuntu 8.10系统
对于2.6.30内核已经修改了该方法的使用方式.
尝试查找/sys/的attribute来添加quirk黑名单无路,只能尝试查找/etc/下udev设备加载时的信息,
仍然没有usbhid的,所以可能向原来android下的init一样,将insmod集成到模个udev处理程序中了,
那就无语了,ubuntu 8.10倒是有/etc/modprobe.d/blacklist,但是添加到里面的全都是
不需要使用或者不希望使用的ko驱动,很明显我们不能把usbhid添加到里面,
因为手工卸载之后,接在pc上的全都是usb鼠标和usb键盘,所以usbhid.ko一旦
卸载,那么只能vnc或者ssh了,手头又只有一台pc,所以没的办法,
所以只能编写程序来添加quirk黑名单了,代码很简单就2行.
luther@gliethttp:~$ cat /sys/module/usbhid/parameters/quirks
,,,
luther@gliethttp:~$
我期望填入黑名单的hid-mouse
vid=0x0461
pid=0x4d22
quirks=vendorID:productID:quirks
#define HID_QUIRK_IGNORE 0x00000004 // 忽略该设备
(思路来自kernel的static char *quirks_param;[luther.gliethttp])
#include
#include
#include
int usbhid_ko_exist(void);
int main(void)
{
if (usbhid_ko_exist() == 0) {
int ret;
ret = system("rmmod /lib/modules/`uname -r`/kernel/drivers/hid/usbhid/usbhid.ko");
ret = system("insmod /lib/modules/`uname -r`/kernel/drivers/hid/usbhid/usbhid.ko quirks=0x0461:0x4d22:0x04");
} else
printf("[luther.gliethttp] root user should be used.\n");
return 0;
}
int usbhid_ko_exist(void)
{
FILE* fp = NULL;
char *sp,*ep;
#define LINE_BUF_MAX 1024
char line_buf[LINE_BUF_MAX];
char file_name[LINE_BUF_MAX];
fp = fopen ("/proc/version", "r");
fgets(line_buf, LINE_BUF_MAX, fp);
sp = strstr(line_buf, "2.6.");
ep = strchr(sp, ' ');
if (ep) *ep = 0;
if (sp) {
file_name[0] = 0;
strcat(file_name, "/lib/modules/");
strcat(file_name, sp);
strcat(file_name, "/kernel/drivers/hid/usbhid/usbhid.ko");
if (access(file_name , R_OK|W_OK) == 0) {
return 0;
} else {
return -1;
}
}
}
luther@gliethttp:/vobs/tmp$ gcc usbhid-quirks.c
luther@gliethttp:/vobs/tmp$ ./a.out
[luther.gliethttp] root user should be used.
luther@gliethttp:/vobs/tmp$ sudo ./a.out
鼠标立即就不能用了
luther@gliethttp:~$ cat /sys/module/usbhid/parameters/quirks
0x0461:0x4d22:0x04,,,I
PS:可以使用,来分割多个vid:pid:mod,但最多可以定义4个quirks,比如:
sudo insmod /lib/modules/`uname -r`/kernel/drivers/hid/usbhid/usbhid.ko quirks=0x1234:0x5678:0x04,0x1000:0x2000:0x04,0x1:0x2:0x3,0x4:0x5:0x3
阅读(3964) | 评论(1) | 转发(0) |