阅读:1859回复:8
为何我做的USB鼠标过滤驱动不能捕获IRP?
小弟最近做了一个过滤USB鼠标的上层过滤型驱动程序,使用INF安装,能正确地安装上,也能正确地进入DriverEntry,然后还也调用了VA_AddDevice例程,设备也绑到堆栈上去了,可是当我按鼠标键的时候DriverMonitor上就没有连续的输出了,是怎么回事呢?有谁帮帮我?
AddDevice例程内容如下: NTSTATUS VA_AddDevice ( IN PDRIVER_OBJECT driverObj, IN PDEVICE_OBJECT physicalDevObj ) { NTSTATUS status; PDEVICE_OBJECT filterDevObj = NULL; PAGED_CODE(); DBGOUT((\"VA_AddDevice: 驱动对象=%ph, 物理设备对象=%ph\", driverObj, physicalDevObj)); status = IoCreateDevice( driverObj, sizeof(struct DEVICE_EXTENSION), NULL, // name for this device FILE_DEVICE_MOUSE, 0, // device characteristics FALSE, // not exclusive &filterDevObj); // our device object if ( NT_SUCCESS(status) ){ struct DEVICE_EXTENSION *devExt; ASSERT( filterDevObj ); /* * Initialize device extension for new device object */ devExt = ( struct DEVICE_EXTENSION * )filterDevObj->DeviceExtension; RtlZeroMemory( devExt, sizeof(struct DEVICE_EXTENSION) ); devExt->signature = DEVICE_EXTENSION_SIGNATURE; devExt->state = STATE_INITIALIZED; devExt->filterDevObj = filterDevObj; devExt->physicalDevObj = physicalDevObj; devExt->pendingActionCount = 0; KeInitializeEvent( &devExt->removeEvent, NotificationEvent, FALSE ); #ifdef HANDLE_DEVICE_USAGE KeInitializeEvent(&devExt->deviceUsageNotificationEvent, SynchronizationEvent, TRUE); #endif // HANDLE_DEVICE_USAGE /* * Attach the new device object to the top of the device stack. */ devExt->topDevObj = IoAttachDeviceToDeviceStack(filterDevObj, physicalDevObj); ASSERT(devExt->topDevObj); DBGOUT((\"创建的过滤设备对象: %ph 挂接到设备对象堆栈: %ph.\", filterDevObj, devExt->topDevObj)); // // As a filter driver, we do not want to change the power or I/O // behavior of the driver stack in any way. Recall that a filter // driver should \"appear\" the same (almost) as the underlying device. // Therefore we must copy some bits from the device object _directly_ // below us in the device stack (notice: DON\'T copy from the PDO!) // /* Various I/O-related flags which should be maintained */ /* (copy from lower device object) */ filterDevObj->Flags |= DO_BUFFERED_IO; filterDevObj->Flags |= (devExt->topDevObj->Flags & (DO_POWER_INRUSH | DO_POWER_PAGABLE )); #ifdef HANDLE_DEVICE_USAGE if ((devExt->topDevObj->Flags & DO_POWER_PAGABLE)){ }else{ DBGOUT(( \"LOCKing some driver code (non-pageable) (b/c init conditions)\" )); devExt->initUnlockHandle = MmLockPagableCodeSection( VA_Power ); // some func that\'s inside the code section that we want to lock ASSERT( NULL != devExt->initUnlockHandle ); } devExt->initialFlags = filterDevObj->Flags & ~DO_DEVICE_INITIALIZING; #endif // HANDLE_DEVICE_USAGE filterDevObj->Flags &= ~DO_DEVICE_INITIALIZING; RegistryAccessSample(devExt, devExt->physicalDevObj); } ASSERT(NT_SUCCESS(status)); return status; } 用INF内容如下: ;*************************************************** ;Zt_Usb_Mouse_Filter Driver\'s Inf file * ;name: ztmouse.inf * ;Date: 4/20/2005 * ;Composer: ting_Zhang * ;version 1.00.0.0 * ;*************************************************** ;=========The \"[Version]\" begin================>> [Version] Signature=\"$Windows NT$\" SignOS=Windows 2000 Provider=%ProviderName% Class=Mouse ClassGUID={4D36E96F-E325-11CE-BFC1-08002BE10318} DriverVer=04/20/2005,1.0.0.0 ;<<=========The \"[Version]\" end================== [DestinationDirs] DefaultDestDir = 12 [Manufacturer] %USBDBE%=USBDBEINS [USBDBEINS] %HID.DeviceDesc% = yyz,HID\\VID_ba13&PID_b100 ;HID\\VID_046D&PID_C50B&Mi_01&Col01 ;=================================== ; Win2000 Installation sections ;=================================== [yyz.NT] Include = msmouse.inf Needs = HID_Mouse_Inst.NT CopyFiles = yyz.CopyFiles [yyz.CopyFiles] yyx.sys [yyz.NT.Services] Addservice = yyx,0x00000002, yyz_Service_Inst Include=msmouse.inf Needs=HID_Mouse_Inst.NT.Services [yyz.NT.HW] AddReg = yyz_HW_AddReg Include=msmouse.inf Needs=HID_Mouse_Inst.NT.HW [yyz_Service_Inst] DisplayName = %HID.DeviceDesc% ServiceType = 1 StartType = 3 ErrorControl = 1 LoadOrderGroup = Pointer Port ServiceBinary = %12%\\yyx.sys [yyz_HW_AddReg] ;HKR,,\"LowerFilters\",0x00010000,\"yyx\" HKR,,\"UpperFilters\",0x00010000,\"yyx\" [SourceDisksNames] 1 = %DiskId1% [SourceDisksFiles] yyx.sys = 1 ;=================the \"[strings]\" begin================>> [strings] USBDBE = \"YongRui Electronics Co.,Ltd\" HID.ClassName = \"Human Input Devices (HID)\" HID.DeviceDesc = \"USB Mouse Fliter\" HID.DefaultDevice = \"HID Default Device\" REG_SZ = 0x00000000 REG_MULTI_SZ = 0x00010000 REG_EXPAND_SZ = 0x00020000 REG_BINARY = 0x00000001 REG_DWORD = 0x00010001 ;SERVICEROOT = \"System\\CurrentControlSet\\Services\" DiskId1 = \"Mouse Fliter Installation Disk #1 \" ProviderName = \"YongRui Develop Department\" ;<<================the \"[strings]\" end==================== |
|
最新喜欢:![]()
|
沙发#
发布于:2005-05-16 10:33
仅仅VA_AddDevice是不够的,你处理了internIoctrl的ioctl_internel_mouse_connect了吗?hook了callback函数了吗?
如果没做,肯定是收不到鼠标的动作通知的 |
|
板凳#
发布于:2005-05-17 08:54
zhaock师兄:
小弟的目的是想在普通的USB鼠标上增加一个按键, 然后把这按键的数据过滤出来,实现像罗技USB鼠标那样的特殊 功能,比如按键的时候可以直接打开网页什么的。 您能在百忙之中抽点时间,解释一下实现这样功能的整体流程吗? 小弟也是刚刚才做驱动程序的,道行尚浅,以前做应用层的软件, 比如会使用MFC等等。 正如您所讲,我没有做hook callback回调函数和internIoctrl的处理,因为我没有一个整体概念的思路! 小弟期待着您的回复 |
|
|
地板#
发布于:2005-05-17 11:02
你看一下ddk例子中的input目录下moufilter的例子,你只需要在MouFilter_ServiceCallback中处理就可以了。原理是有数据的时候,底层驱动会调用Mouse Class Driver设置的回调函数,在这里
我们进行了hook,先于Mouse Class处理鼠标的数据,按键,移动 你先看看,非常简单,有问题在问吧 给点分先,呵呵 |
|
地下室#
发布于:2005-05-17 14:45
zhaock师兄:
按照你的提醒,我经过两个小时的分析和阅读 DDK里的例子,已经成功解决了该问题,能抓到 所有经过该堆栈的所有IRP了, 在此表示真诚的谢意! 还恳请在下一步的学习中,遇到问题时多多指教! |
|
|
5楼#
发布于:2005-05-17 17:02
这个问题你算是问对人了,我以前在一家台湾鼠标公司北京软件研发部当总工,呵呵,做过各个平台的鼠标驱动,什么mac,linux,ce呀。
|
|
6楼#
发布于:2005-05-18 15:27
高人
|
|
|
7楼#
发布于:2005-05-18 17:11
受益匪浅啊!多谢
|
|
8楼#
发布于:2007-05-17 11:53
zhaock: 请问要把视频功能做到driver里面,使capture filter属性页可以选择视频处理功能,是否可以做成filter driver的形式,还是一定要做成minidriver?
|
|