Ниже приведен код (изменен) 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 );
но мне не удалось заставить это работать. Я ходил кругами с этим в последние несколько дней, поэтому я очень ценю любую помощь.
Задача ещё не решена.
Других решений пока нет …