首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

键盘驱动过滤,该如何处理

2013-10-13 
键盘驱动过滤本帖最后由 leftbackfielder 于 2013-08-29 10:33:54 编辑小弟刚刚接触WINDOWS驱动开发,写程

键盘驱动过滤
本帖最后由 leftbackfielder 于 2013-08-29 10:33:54 编辑 小弟刚刚接触WINDOWS驱动开发,写程序的时候,遇到几个问题,希望大家给解答一下
主功能:键盘驱动过滤
添加功能:监测键盘插拔
我现在的思路是:在PNP分发函数,在这里面,可以监测键盘的拔出,但是插入监测不到
PNP函数中的代码,如下


NTSTATUS c2pPnP( 
                     IN PDEVICE_OBJECT DeviceObject, 
                     IN PIRP Irp 
                     ) 

    PC2P_DEV_EXT devExt; 
    PIO_STACK_LOCATION irpStack; 
    NTSTATUS status = STATUS_SUCCESS; 
    KIRQL oldIrql; 
    KEVENT event; 

    // 获得真实设备。
    devExt = (PC2P_DEV_EXT)(DeviceObject->DeviceExtension); 
    irpStack = IoGetCurrentIrpStackLocation(Irp); 

    switch (irpStack->MinorFunction) 
  { 
  case IRP_MN_START_DEVICE:
      KdPrint(("insert Device\n")):
      break;
    case IRP_MN_REMOVE_DEVICE: 
        KdPrint(("IRP_MN_REMOVE_DEVICE\n")); 

        // 首先把请求发下去
        IoSkipCurrentIrpStackLocation(Irp); 
        IoCallDriver(devExt->LowerDeviceObject, Irp); 
        // 然后解除绑定。
        IoDetachDevice(devExt->LowerDeviceObject); 
        // 删除我们自己生成的虚拟设备。
        IoDeleteDevice(DeviceObject); 
        status = STATUS_SUCCESS; 
        break; 

    default: 
        // 对于其他类型的IRP,全部都直接下发即可。 
        KdPrint(("Other IRP"\n));
        IoSkipCurrentIrpStackLocation(Irp); 
        status = IoCallDriver(devExt->LowerDeviceObject, Irp); 
    } 
    return status; 
}

这段代码,是在网上COPY的.看到代码中,监测到键盘拔出之后,会解除绑定.所以,把解除绑定那块的代码给去掉了.但是,依然不好使.
现像是这样的: 第一次拔掉键盘的时候,会进入case IRP_MN_REMOVE_DEVICE,但是,也同样会进到default中.之后,再插入和拔出,都不会再进入到PNP的函数中了.但是,会进到驱动的dispatch中.
我的疑问:
1进入default中是什么IRP
2第一次之后的插拔,为什么会进入dispatch中,但是,进不到PNP的处理中?
3根据测试的情况知道,这个驱动,不会因为键盘的拔出而卸载,那么,我们建立的那个设备对象,如果不Delete,当键盘再次插入的时候,会不会主动Attach到键盘上呢?
4怎么才能正确的监测键盘的插入?
哪位有WINDOWS驱动开发群,麻烦发一下
[解决办法]
我的USB过滤驱动,检测PNP设备的挂载是在add_Device分发函数里面。。
[解决办法]
我也在看这本书, 这个驱动好像有个问题, 好像拔出后要按一下按才会卸载..

热点排行