以下のコードは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どこか(ここ)で行われましたが、それにはwindows.hDeviceIoControl
が必要で、 kbfiltr.cに含まれると他の多くのエラーが発生します。だから私は使いたい
irp = IoBuildDeviceIoControlRequest(IOCTL_KEYBOARD_SET_INDICATORS,...
IoCallDriver( ..., irp );
しかし、私はこれを機能させることができませんでした。私はここ数日、これと一緒に行ってきたので、何か助けていただければ幸いです.