Фильтр kb ядра ioctl IRP / ошибка объявления переменной

Ниже приведен код (изменен) 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 );

но мне не удалось заставить это работать. Я ходил кругами с этим в последние несколько дней, поэтому я очень ценю любую помощь.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]