阅读:1501回复:8
请问一下Ctrl2cap的这个驱动为什么不能抓到多媒体键盘扩展键的信息?
这个驱动程序我下载后安装,把ps/2的多媒体键盘接上去,可以抓到扩展键的信息,但是当我换上USB的以后,就只能抓到普通键的信息,那些多媒体键都抓不到,是为何?
还请大家多多赐教!!!! |
|
沙发#
发布于:2004-03-05 15:20
把你抓键盘的那段代码贴出来看看。。。。。。
|
|
|
板凳#
发布于:2004-03-05 15:26
我在网站http://www.sysinternals.com上直接下载下来的,没有改过,我用的系统是windows xp
很高兴能与你联系上 [编辑 - 3/5/04 by webstartlove] |
|
地板#
发布于:2004-03-05 15:36
不会吧,那上面CTRL2CAP我也研究过,只是把CAPSLOCK改为LCONTROL而已,你的是如何实现的???
|
|
|
地下室#
发布于:2004-03-05 16:07
你所说的怎么实现的,是指的什么功能呀?
我确实没有改动代码,只是按照说明安装而已 |
|
5楼#
发布于:2004-03-05 16:11
倒,自己看代码啊,CTRL2CAP已经是我看到键盘过滤驱动里最简单的了,代码也少,也比较好理解的。
|
|
|
6楼#
发布于:2004-03-05 16:16
我想问你一下,这个程序读的是i8042 port的数据,所以ps/2的多媒体键值可以抓到,但是usb键盘的数据是不通过i8042 port的,直接通过URB传输数据的,所以抓不到数据,是吗? 你认为我理解的对不对?
|
|
7楼#
发布于:2004-03-05 16:22
L"\Device\KeyboardClass0"
你认为是i8042 port,看看 JIURL的键盘驱动,看看键盘设备栈的层次是如何的?? 下面我们来讲讲设备栈。一个物理设备的驱动任务,通常由几个驱动程序一层一层的共 同完成。每层一个设备对象,他们联系在一起,组成一个设备栈。一个设备栈上的设备 对象,从上自下,联系在一起。从下自上,也联系在一起。我们以 ps/2 键盘驱动为例 ,使用 WinDbg 来观察它的设备栈,以及他们如何联系在一起。 ps/2 键盘驱动的设备栈,大概就是这个样子 kd> !devstack fe4f5020 !DevObj !DrvObj !DevExt ObjectName fe4f5df0 \Driver\Kbdclass fe4f5ea8 KeyboardClass0 > fe4f5020 \Driver\i8042prt fe4f50d8 fe4dd730 \Driver\ACPI fe507468 0000000e !DevNode fe4fed68 : DeviceInst is "ACPI\PNP0303\4&5289e18&0" ServiceName is "i8042prt" 最上面的 DEVICE_OBJECT 地址为 fe4f5df0,属于驱动 \Driver\Kbdclass 中间的 DEVICE_OBJECT 地址为 fe4f5020,属于驱动 \Driver\i8042prt 最下面的 DEVICE_OBJECT 地址为 fe4dd730,属于驱动 \Driver\ACPI 下面我们看这3个设备对象,如何联系在一起。 最上面一层的 DEVICE_OBJECT kd> !devobj fe4f5df0 Device object (fe4f5df0) is for: KeyboardClass0 \Driver\Kbdclass DriverObject fe4f6330 Current Irp fe43a1c8 RefCount 0 Type 0000000b Flags 00002044 DevExt fe4f5ea8 DevObjExt fe4f5fd8 ExtensionFlags (0000000000) AttachedTo (Lower) fe4f5020 \Driver\i8042prt Device queue is busy -- Queue empty. 看到这个设备对象有名字,叫 KeyboardClass0 ,属于驱动 Kbdclass kd> !strct device_object fe4f5df0 struct _DEVICE_OBJECT (sizeof=184) +00 int16 Type = 0003 +02 uint16 Size = 01e8 +04 int32 ReferenceCount = 00000000 +08 struct _DRIVER_OBJECT *DriverObject = FE4F6330 // 正是 kbdclass 的 DRIVER_OBJECT 的地址 +0c struct _DEVICE_OBJECT *NextDevice = 00000000 +10 struct _DEVICE_OBJECT *AttachedDevice = 00000000 // 为空结束,表示上面没有其它设备对象了 +14 struct _IRP *CurrentIrp = FE43A1C8 ... +ae uint16 Spare1 = 0000 +b0 struct _DEVOBJ_EXTENSION *DeviceObjectExtension = FE4F5FD8 // 它的 DEVOBJ_EXTENSION 在 FE4F5FD8 +b4 void *Reserved = 00000000 kd> !strct DEVOBJ_EXTENSION FE4F5FD8 struct _DEVOBJ_EXTENSION (sizeof=36) +00 int16 Type = 000d +02 uint16 Size = 0000 +04 struct _DEVICE_OBJECT *DeviceObject = FE4F5DF0 +08 uint32 PowerFlags = 00000010 +0c *Dope = 00000000 +10 uint32 ExtensionFlags = 00000000 +14 void *DeviceNode = 00000000 +18 struct _DEVICE_OBJECT *AttachedTo = FE4F5020 // 下面一层的设备对象为 FE4F5020 +1c struct _LIST_ENTRY FileObjectList +1c struct _LIST_ENTRY *Flink = 00000000 +20 struct _LIST_ENTRY *Blink = 00000000 中间层的 DEVICE_OBJECT kd> !devobj fe4f5020 Device object (fe4f5020) is for: \Driver\i8042prt DriverObject fe4f69f0 Current Irp 00000000 RefCount 0 Type 00000027 Flags 00002004 DevExt fe4f50d8 DevObjExt fe4f5358 ExtensionFlags (0xc0000000) Unknown flags 0xc0000000 AttachedDevice (Upper) fe4f5df0 \Driver\Kbdclass AttachedTo (Lower) fe4dd730 \Driver\ACPI Device queue is not busy. 看到这个设备对象没有名字,属于驱动 i8042prt kd> !strct device_object fe4f5020 struct _DEVICE_OBJECT (sizeof=184) +00 int16 Type = 0003 +02 uint16 Size = 0338 +04 int32 ReferenceCount = 00000000 +08 struct _DRIVER_OBJECT *DriverObject = FE4F69F0 // 正是 i8042prt 的 DRIVER_OBJECT 的地址 +0c struct _DEVICE_OBJECT *NextDevice = 00000000 +10 struct _DEVICE_OBJECT *AttachedDevice = FE4F5DF0 // 上面一层的设备对象 +14 struct _IRP *CurrentIrp = 00000000 ... +ae uint16 Spare1 = 0001 +b0 struct _DEVOBJ_EXTENSION *DeviceObjectExtension = FE4F5358 // 它的 DEVOBJ_EXTENSION 在 FE4F5358 +b4 void *Reserved = 00000000 kd> !strct DEVOBJ_EXTENSION FE4F5358 struct _DEVOBJ_EXTENSION (sizeof=36) +00 int16 Type = 000d +02 uint16 Size = 0000 +04 struct _DEVICE_OBJECT *DeviceObject = FE4F5020 +08 uint32 PowerFlags = 00000000 +0c *Dope = 00000000 +10 uint32 ExtensionFlags = c0000000 +14 void *DeviceNode = 00000000 +18 struct _DEVICE_OBJECT *AttachedTo = FE4DD730 // 下面一层的设备对象 +1c struct _LIST_ENTRY FileObjectList +1c struct _LIST_ENTRY *Flink = 00000000 +20 struct _LIST_ENTRY *Blink = 00000000 最下面一层的 DEVICE_OBJECT kd> !devobj fe4dd730 Device object (fe4dd730) is for: 0000000e \Driver\ACPI DriverObject fe4e8ad0 Current Irp 00000000 RefCount 1 Type 00000032 Flags 00001040 DevExt fe507468 DevObjExt fe4dd7e8 DevNode fe4fed68 ExtensionFlags (0000000000) AttachedDevice (Upper) fe4f5020 \Driver\i8042prt Device queue is not busy. 看到这个设备对象有名字,叫 0000000e ,属于驱动 acpi kd> !strct device_object fe4dd730 struct _DEVICE_OBJECT (sizeof=184) +00 int16 Type = 0003 +02 uint16 Size = 00b8 +04 int32 ReferenceCount = 00000001 +08 struct _DRIVER_OBJECT *DriverObject = FE4E8AD0 // 正是 acpi 的 DRIVER_OBJECT 的地址 +0c struct _DEVICE_OBJECT *NextDevice = FE4DD850 +10 struct _DEVICE_OBJECT *AttachedDevice = FE4F5020 // 上面一层的设备对象 +14 struct _IRP *CurrentIrp = 00000000 ... +ae uint16 Spare1 = 0001 +b0 struct _DEVOBJ_EXTENSION *DeviceObjectExtension = FE4DD7E8 // 它的 DEVOBJ_EXTENSION 在 FE4DD7E8 +b4 void *Reserved = 00000000 kd> !strct DEVOBJ_EXTENSION FE4DD7E8 struct _DEVOBJ_EXTENSION (sizeof=36) +00 int16 Type = 000d +02 uint16 Size = 0000 +04 struct _DEVICE_OBJECT *DeviceObject = FE4DD730 +08 uint32 PowerFlags = 00000010 +0c *Dope = 00000000 +10 uint32 ExtensionFlags = 00000000 +14 void *DeviceNode = FE4FED68 +18 struct _DEVICE_OBJECT *AttachedTo = 00000000 // 为空结束,表示下面没有其它设备对象了 +1c struct _LIST_ENTRY FileObjectList +1c struct _LIST_ENTRY *Flink = 00000000 +20 struct _LIST_ENTRY *Blink = 00000000 从上自下。\Device\KeyboardClass0(DRIVER_OBJECT 是 kbdclass)可以找到 没有名 字地址为fe4f5020的DEVICE_OBJECT(DRIVER_OBJECT 是 i8042prt)。没有名字地址为 fe4f5020的DEVICE_OBJECT(DRIVER_OBJECT 是 i8042prt)可以找到 \Device\0000000e (DRIVER_OBJECT 是 ACPI)。 从下自上。\Device\0000000e(DRIVER_OBJECT 是 ACPI) 可以找到 没有名字地址为 fe4f5020的DEVICE_OBJECT(DRIVER_OBJECT 是 i8042prt)。没有名字地址为fe4f5020 的DEVICE_OBJECT(DRIVER_OBJECT 是 i8042prt)可以找到 \Device\KeyboardClass0( DRIVER_OBJECT 是 ACPI)。 现在我们对设备栈上的设备对象之间的联系,做一个总结, 设备栈上的设备对象,从上自下,通过 DEVICE_OBJECT 的 DEVOBJ_EXTENSION 的 +18 struct _DEVICE_OBJECT *AttachedTo 联系在一起。 设备栈上的设备对象,从下自上,通过 DEVICE_OBJECT 的 +10 struct _DEVICE_OBJECT *AttachedDevice 联系在一起。 在观察键盘驱动的初始化过程中,我们看到了设备栈是如何建立起来的。 驱动 i8042prt ,驱动 kbdclass 分别调用 IoAttachDeviceToDeviceStack ,把自己相 应的设备对象加入到键盘设备栈中。IoAttachDeviceToDeviceStack 会设置 DEVICE_OBJECT 的 DEVOBJ_EXTENSION 的 +18 struct _DEVICE_OBJECT *AttachedTo 和 DEVICE_OBJECT 的 +10 struct _DEVICE_OBJECT *AttachedDevice ,把两个对象联系在 一起。并设置新加入的设备对象的 +30 char StackSize。 [编辑 - 3/5/04 by wowocock] |
|
|
8楼#
发布于:2004-03-05 17:03
首先非常感谢wowocock
由于刚学驱动,看了你的帖子,有很多地方没有看懂,但是我大致明白你的意思。 我想对于ps/2 键盘的设备栈 有如下结构, 最顶层的设备对象是 驱动 Kbdclass 的设备对象。 中间层的设备对象是 驱动 i8042prt 的一个设备对象。 最底层的设备对象是 驱动 ACPI 的一个设备对象。 是这样的吗? 但不管是USB还是PS/2它还是会加载驱动 Kbdclass.sys ,我尝试过替换掉 Kbdclass.sys ,我自己写一个Kbdclass.sys ,但是还是无法截取多媒体键的信息,只有普通键的,为何? |
|