【问题标题】:Kernel mode keyboard filter intercept - double output内核模式键盘过滤器拦截 - 双输出
【发布时间】:2013-04-12 11:03:15
【问题描述】:

我已编辑 WDK kbfiltr.c 回调例程以拦截 Esc 键并将其替换为“E”。
它的工作原理是它总是用 2 个“E”替换它。
所以按 Esc 会输出 'ee'。 代码如下:

{
PKEYBOARD_INPUT_DATA pCur = InputDataStart; 

PDEVICE_EXTENSION   devExt;
WDFDEVICE   hDevice;

hDevice = WdfWdmDeviceGetWdfDeviceHandle(DeviceObject);
devExt = FilterGetData(hDevice);

while (pCur < InputDataEnd)
{
ULONG consumed = 0;

if (pCur->MakeCode == 0x01) {//Esc
pCur->MakeCode = 0x12; //E
}
else{
pCur++;
continue;
}

// indicate one packet at a time
(*(PSERVICE_CALLBACK_ROUTINE)(ULONG_PTR) 
devExt->UpperConnectData.ClassService)(
devExt->UpperConnectData.ClassDeviceObject,
pCur,
pCur+1,
&consumed);
pCur++;
}
// tell the caller you consumed everything
*InputDataConsumed = (InputDataEnd-InputDataStart);

(*(PSERVICE_CALLBACK_ROUTINE)(ULONG_PTR) devExt->UpperConnectData.ClassService)(
devExt->UpperConnectData.ClassDeviceObject,
InputDataStart,
InputDataEnd,
InputDataConsumed);
}

有人知道我做错了什么吗?

【问题讨论】:

  • 这只是一个猜测,但你得到一个按键和一个按键释放?
  • 我不这么认为,因为它似乎在按键时会这样做,并且在按住键时会重复 - 就像正常打字时一样。
  • 看看这里的定义:msdn.microsoft.com/en-gb/library/windows/hardware/… 我认为你需要检查标志,看看你是否有“makecode”或“breakcode”。
  • 我尝试通过为“make”和“break”输出不同的键来检查标志,但它似乎仍然在做同样的事情。在这个论坛上,一个成员可能会遇到类似的问题,即回调例程被调用了两次,我想知道这是否是问题所在? osronline.com/showthread.cfm?link=207941

标签: c windows winapi kernel driver


【解决方案1】:

我认为这是编码错误。 如下更改代码似乎可以使其正常工作。

    {
PKEYBOARD_INPUT_DATA pCur = InputDataStart; 

PDEVICE_EXTENSION   devExt;
WDFDEVICE   hDevice;

hDevice = WdfWdmDeviceGetWdfDeviceHandle(DeviceObject);
devExt = FilterGetData(hDevice);

while (pCur < InputDataEnd)
{
ULONG consumed = 0;

if (pCur->MakeCode == 0x01) {//Esc
pCur->MakeCode = 0x12; //E
}

// indicate one packet at a time
(*(PSERVICE_CALLBACK_ROUTINE)(ULONG_PTR) 
devExt->UpperConnectData.ClassService)(
devExt->UpperConnectData.ClassDeviceObject,
pCur,
pCur+1,
&consumed);
pCur++;
}
// tell the caller you consumed everything
*InputDataConsumed = (InputDataEnd-InputDataStart);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2020-12-16
    • 2011-04-24
    相关资源
    最近更新 更多