-
-
[原创]鼠标经常在单击时变成双击,所以打算写一个鼠标过滤驱动来修复硬件的BUG
-
发表于:
2012-9-12 11:46
7744
-
[原创]鼠标经常在单击时变成双击,所以打算写一个鼠标过滤驱动来修复硬件的BUG
本来想自己从头写个鼠标过滤驱动,来实现这个功能,不过用了一下搜索引擎,发现riusksk已经在09年就已经实现了这个功能,果然惰性是人最大的天敌,既然有现成可用的代码,就不想从头再写了。
鼠标过滤驱动能修复这个Bug的原理是:
鼠标在点击时,会触发一个硬件中断,然后发消息给过滤驱动,这时我在驱动中判断两次点击的时间间隔,如果小于100ms则认为是硬件故障,屏蔽掉该此操作
关于鼠标过滤,riusksk的帖子已经写的很详细了,这里我就不多说了,这里主要说一下IRP的取消。取消IRP还真是花费了我很多时间,原因是IoCancelIrp这个函数会直接回调完成例程,然后破坏了链表的结构,导致了蓝屏。(我在MyRead例程里面把IRP插入到一个链表里面,然后在MyReadComplete里面,从链表里面移除该IRP)
这样只好,在取消IRP时,复制一个新的链表,在新的链表里面对IRP进行取消,这样总算是OK了
好了,废话说完了,大家看代码吧:
// 取消等待的IRP
VOID CancelPendingIrp()
{
PPENDING_IRP_LIST PendingList = NULL, CancelList = NULL;
PSINGLE_LIST_ENTRY pSingleListEntry = NULL;
// 获取互斥体,保护链表gFilterData.ListHead
KeWaitForMutexObject(&gFilterData.ReadMutex, Executive, KernelMode, FALSE, NULL);
pSingleListEntry = gFilterData.ListHead.Next;
while(pSingleListEntry)
{
PendingList = CONTAINING_RECORD(pSingleListEntry, PENDING_IRP_LIST, SingleListEntry);
KdPrint(("Copy Single List = 0x%x", PendingList));
// 复制链表,然后将取消IRP的操作放到新的链表中处理
CancelList = (PPENDING_IRP_LIST)ExAllocatePoolWithTag(NonPagedPool, sizeof(PENDING_IRP_LIST), POOL_TAG);
if(CancelList)
{
RtlCopyMemory(CancelList, PendingList, sizeof(PENDING_IRP_LIST));
PushEntryList(&gFilterData.CancelHead, &CancelList->SingleListEntry);
}
pSingleListEntry = pSingleListEntry->Next;
}
// 释放互斥体
KeReleaseMutex(&gFilterData.ReadMutex, FALSE);
// 之所以要复制一个新的链表来取消IRP (通过调用IoCancelIrp),
// 是因为IoCancelIrp 会调用MyReadComplete 这个完成例程回调,
// 而MyReadComplete里面又对链表进行操作,这样会破坏链表的结构
pSingleListEntry = PopEntryList(&gFilterData.CancelHead);
while(pSingleListEntry)
{
CancelList = CONTAINING_RECORD(pSingleListEntry, PENDING_IRP_LIST, SingleListEntry);
if(CancelList)
{
KdPrint(("CancelPendingIrp = 0x%x", CancelList->PendingIrp));
if(!CancelList->PendingIrp->Cancel)
{// 在这里,取出复制链表中的IRP,然后进行取消
IoCancelIrp(CancelList->PendingIrp);
}
ExFreePoolWithTag(CancelList, POOL_TAG);
pSingleListEntry = PopEntryList(&gFilterData.CancelHead);
}
}
}
参考资料:
http://www.cnblogs.com/evlon/articles/825597.html
http://bbs.pediy.com/showthread.php?t=96245&page=3
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课