首页
社区
课程
招聘
[旧帖] 关于键盘模拟驱动,KeyboardClassServiceCallback 扩展键的问题,请大牛们指点迷津 0.00雪花
发表于: 2013-9-18 04:17 8409

[旧帖] 关于键盘模拟驱动,KeyboardClassServiceCallback 扩展键的问题,请大牛们指点迷津 0.00雪花

2013-9-18 04:17
8409
在通过回调函数模拟键盘按键的过程中,遇到一个问题,请教大家

void SetKey(DWORD scan, BOOL isDown, BOOL isExtern)
{
        DWORD dwBytesReturned;
        DWORD keyType;
        if(isExtern)
                keyType = isDown?IOCTL_KEY_E0:IOCTL_KEY_E1;
        else
                keyType = isDown?IOCTL_KEY_DOWN:IOCTL_KEY_UP;
        DeviceIoControl(m_hControl, keyType,
                &scan, sizeof(ULONG), NULL, 0, &dwBytesReturned, NULL);
}

我调用 SetKey(MapVirtualKey(VK_LEFT), TRUE, TRUE);
模拟按下方向左键,这个得到了正确的执行效果

但是调用 SetKey(MapVirtualKey(VK_LEFT), FALSE, TRUE);
模拟松开方向左键,确没有效果,非常奇怪,

驱动层代码如下,没有做其他变化,
dprintf("[KeyMouse] KeymouseDispatchDeviceControl IOCTL_KEY_E1 = 0x%x\n", lKeyCode)
;这个一句得到了正确的执行,参数也是正确的

case IOCTL_KEY_E1:
                {
                        if (ioBuf)
                        {
                                lKeyCode = *(ULONG*)ioBuf;
                                dprintf("[KeyMouse] KeymouseDispatchDeviceControl IOCTL_KEY_E1 = 0x%x\n", lKeyCode);
                                dwSize = sizeof(KEYBOARD_INPUT_DATA);
                                __asm {
                                        push eax
                                                mov        kid.UnitId,0                ; 构造 KEYYBOARD_INPUT_DATA
                                                mov        eax,lKeyCode
                                                mov        kid.MakeCode,ax
                                                mov        kid.Flags,KEY_E1        ;模拟松开
                                                mov        kid.Reserved,0
                                                mov        kid.ExtraInformation,0

                                                lea        eax,dwRet
                                                push        eax
                                                lea        eax,kid
                                                add        eax,dwSize
                                                push        eax
                                                lea        eax,kid
                                                push        eax
                                                push        g_kbDeviceObject
                                                call        orig_KeyboardClassServiceCallback        ;利用 KeyboardClassServiceCallback 模拟按键

                                                pop eax
                                }
                                status = STATUS_SUCCESS;
                        }
                        break;

百思不得其解,忘大牛们指点迷津,我现金不多了,全部奉上,再次感谢!

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
kid.Flags = KEY_E1 = 4  而检测键盘松开VK_LEFT时 kid.Flags却等于3。用你的程序发送的是4,而物理键盘发送的是3。不知道为什么
2013-9-18 11:47
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
难道是 KEY_BREAK | KEY_E0
2013-9-18 11:51
0
雪    币: 28
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我是模拟DNF 的走路动作,可以开始走路,但是没办法停下,真不知道为何
2013-9-19 02:25
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
mov  kid.Flags,3  ;模拟松开   这样能行不
2013-9-21 20:21
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
既然你能使用驱动,不如直接向端口写数据
2013-9-23 12:54
0
游客
登录 | 注册 方可回帖
返回
//