键盘驱动过滤,该如何处理
键盘驱动过滤
小弟刚刚接触WINDOWS驱动开发,写程序的时候,遇到几个问题,希望大家给解答一下
主功能:键盘驱动过滤
添加功能:监测键盘插拔
我现在的思路是:在PNP分发函数,在这里面,可以监测键盘的拔出,但是插入监测不到
PNP函数中的代码,如下
这段代码,是在网上COPY的.看到代码中,监测到键盘拔出之后,会解除绑定.所以,把解除绑定那块的代码给去掉了.但是,依然不好使.
现像是这样的: 第一次拔掉键盘的时候,会进入case IRP_MN_REMOVE_DEVICE,但是,也同样会进到default中.之后,再插入和拔出,都不会再进入到PNP的函数中了.但是,会进到驱动的dispatch中.
我的疑问:
1进入default中是什么IRP
2第一次之后的插拔,为什么会进入dispatch中,但是,进不到PNP的处理中?
3根据测试的情况知道,这个驱动,不会因为键盘的拔出而卸载,那么,我们建立的那个设备对象,如果不Delete,当键盘再次插入的时候,会不会主动Attach到键盘上呢?
4怎么才能正确的监测键盘的插入?
哪位有WINDOWS驱动开发群,麻烦发一下
------解决方案--------------------
我的USB过滤驱动,检测PNP设备的挂载是在add_Device分发函数里面。。
------解决方案--------------------
我也在看这本书, 这个驱动好像有个问题, 好像拔出后要按一下按才会卸载..
小弟刚刚接触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分发函数里面。。
------解决方案--------------------
我也在看这本书, 这个驱动好像有个问题, 好像拔出后要按一下按才会卸载..