zhangting00_200
驱动牛犊
驱动牛犊
  • 注册日期2005-05-15
  • 最后登录2005-11-29
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1859回复:8

为何我做的USB鼠标过滤驱动不能捕获IRP?

楼主#
更多 发布于:2005-05-15 19:32
小弟最近做了一个过滤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====================


最新喜欢:

shevstenshevst...
圣经.雅歌
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-05-16 10:33
仅仅VA_AddDevice是不够的,你处理了internIoctrl的ioctl_internel_mouse_connect了吗?hook了callback函数了吗?
如果没做,肯定是收不到鼠标的动作通知的
zhangting00_200
驱动牛犊
驱动牛犊
  • 注册日期2005-05-15
  • 最后登录2005-11-29
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-05-17 08:54
zhaock师兄:
小弟的目的是想在普通的USB鼠标上增加一个按键,
然后把这按键的数据过滤出来,实现像罗技USB鼠标那样的特殊
功能,比如按键的时候可以直接打开网页什么的。

您能在百忙之中抽点时间,解释一下实现这样功能的整体流程吗?
小弟也是刚刚才做驱动程序的,道行尚浅,以前做应用层的软件,
比如会使用MFC等等。

正如您所讲,我没有做hook callback回调函数和internIoctrl的处理,因为我没有一个整体概念的思路!

小弟期待着您的回复
圣经.雅歌
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-05-17 11:02
你看一下ddk例子中的input目录下moufilter的例子,你只需要在MouFilter_ServiceCallback中处理就可以了。原理是有数据的时候,底层驱动会调用Mouse Class  Driver设置的回调函数,在这里
我们进行了hook,先于Mouse Class处理鼠标的数据,按键,移动
你先看看,非常简单,有问题在问吧
给点分先,呵呵
zhangting00_200
驱动牛犊
驱动牛犊
  • 注册日期2005-05-15
  • 最后登录2005-11-29
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-05-17 14:45
zhaock师兄:
按照你的提醒,我经过两个小时的分析和阅读
DDK里的例子,已经成功解决了该问题,能抓到
所有经过该堆栈的所有IRP了,
在此表示真诚的谢意!
还恳请在下一步的学习中,遇到问题时多多指教!
圣经.雅歌
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2005-05-17 17:02
这个问题你算是问对人了,我以前在一家台湾鼠标公司北京软件研发部当总工,呵呵,做过各个平台的鼠标驱动,什么mac,linux,ce呀。
lejianz
驱动中牛
驱动中牛
  • 注册日期2003-03-05
  • 最后登录2023-11-15
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望145点
  • 贡献值0点
  • 好评度116点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2005-05-18 15:27
高人
一起交流,共同提高!
yantianhe2001
驱动牛犊
驱动牛犊
  • 注册日期2005-05-18
  • 最后登录2006-01-23
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-05-18 17:11
受益匪浅啊!多谢
ackeep
驱动牛犊
驱动牛犊
  • 注册日期2007-04-24
  • 最后登录2007-06-05
  • 粉丝0
  • 关注0
  • 积分140分
  • 威望15点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-05-17 11:53
zhaock: 请问要把视频功能做到driver里面,使capture filter属性页可以选择视频处理功能,是否可以做成filter driver的形式,还是一定要做成minidriver?
游客

返回顶部