Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15498052
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: LINUX

2009-07-15 16:26:55

浅析如何向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) |
给主人留下些什么吧!~~

gliethttp2009-07-28 13:52:58

也可以直接使用libusb提供的usb_detach_kernel_driver_np();usb_claim_interface();usb_set_altinterface();来断开内核自动匹配上的driver.