内核模式键盘滤波器拦截 - 双输出

时间:2013-04-12 11:03:15

标签: c windows winapi kernel driver

我已经编辑了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);
}

任何人都知道我做错了什么?

1 个答案:

答案 0 :(得分: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);

}