键盘驱动过滤

leftbackfielder 2013-08-29 10:31:39
小弟刚刚接触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驱动开发群,麻烦发一下
...全文
291 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
leftbackfielder 2013-10-08
  • 打赏
  • 举报
回复
引用 2 楼 brucedp 的回复:
我也在看这本书, 这个驱动好像有个问题, 好像拔出后要按一下按才会卸载..
恩.是的
leftbackfielder 2013-10-08
  • 打赏
  • 举报
回复
引用 1 楼 benbupt 的回复:
我的USB过滤驱动,检测PNP设备的挂载是在add_Device分发函数里面。。
WDM的驱动支持即插即用..我的这个是NT的
GoToSkyBird1 2013-09-30
  • 打赏
  • 举报
回复
我也在看这本书, 这个驱动好像有个问题, 好像拔出后要按一下按才会卸载..
benbupt 2013-09-29
  • 打赏
  • 举报
回复
我的USB过滤驱动,检测PNP设备的挂载是在add_Device分发函数里面。。

21,595

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧