下面的代码是KbFilter_ServiceCallback
WDK kbfiltr.c示例中的(修改后的)例程。事实上,它构建得很好,但是当我取消注释时IRP *irp;
,它会导致错误:
1>目录 c:\winddk\kbfiltr\sys 1>c:\winddk\kbfiltr\sys\kbfiltr.c(827) 中的错误:错误 C2220:警告视为错误 - 未生成“对象”文件 1>链接:错误LNK1181: 无法打开输入文件 'c:\winddk\kbfiltr\sys\objchk_wxp_x86\i386\kbfiltr.obj'
这对我不是很有帮助。我已经读过,在块声明中需要在任何语句之前,我确信我已经完成了,所以我对此感到非常困惑。
VOID
KbFilter_ServiceCallback(
IN PDEVICE_OBJECT DeviceObject,
IN PKEYBOARD_INPUT_DATA InputDataStart,
IN PKEYBOARD_INPUT_DATA InputDataEnd,
IN OUT PULONG InputDataConsumed
)
{
KEYBOARD_INPUT_DATA *kbDat;//Apparently declarations need to be before any statements
ULONG consumed;
//IRP *irp;
PDEVICE_EXTENSION devExt;
WDFDEVICE hDevice;
hDevice = WdfWdmDeviceGetWdfDeviceHandle(DeviceObject);
devExt = FilterGetData(hDevice);
kbDat = kbDat = InputDataStart;
while (kbDat < InputDataEnd)
{
consumed = 0;
if (kbDat->MakeCode == 0x01) {//Esc
if((kbDat->Flags & KEY_MAKE) == KEY_MAKE){
//SEND IRP ...IoBuildDeviceIoControlRequest(IOCTL_KEYBOARD_SET_INDICATORS,...
}
}
else{
kbDat++;
continue;
}
(*(PSERVICE_CALLBACK_ROUTINE)(ULONG_PTR)
devExt->UpperConnectData.ClassService)(
devExt->UpperConnectData.ClassDeviceObject,
kbDat,
kbDat+1,
&consumed);
kbDat++;
}
*InputDataConsumed = (InputDataEnd-InputDataStart);
(*(PSERVICE_CALLBACK_ROUTINE)(ULONG_PTR) devExt->UpperConnectData.ClassService)(
devExt->UpperConnectData.ClassDeviceObject,
InputDataStart,
InputDataEnd,
InputDataConsumed);
}
当我在这里时,我还需要帮助填写
//SEND IRP ...IoBuildDeviceIoControlRequest(IOCTL_KEYBOARD_SET_INDICATORS,...
。我想发送一个ioctl * irp * 来获取灯的状态并在按下NumLock时切换它。Esc某处(此处)已完成,DeviceIoControl
但这需要windows.h,当包含在kbfiltr.c中时会导致许多其他错误。所以我想用
irp = IoBuildDeviceIoControlRequest(IOCTL_KEYBOARD_SET_INDICATORS,...
IoCallDriver( ..., irp );
但我还没有设法让这个工作。在过去的几天里,我一直在讨论这个问题,所以我非常感谢任何帮助。