阅读:1427回复:6
没办法了
键盘过滤驱动(ctrl2cap)如何实现只为我的应用程序服务???
比如说当我的应用程序活动时,按下F12键等于按下F1键,而在系统中的其它程序则正常运行(F12还是F12). 网上jiurl说过键盘驱动的使用者是线程 win32k!rawinputthread ,线程 win32k!rawinputthread 的进程是 csrss.exe。 即是:csrss ->win32k!rawinputthread ->ReadFile->发送IRP_MJ_READ包->IRP包处于PENGING状态->一旦有键按下->驱动触发IRP_MJ_READ例程->调用完成例程->转换F12为F1键->通知win32k!rawinputthread 完成->循环. 但是这个流程是对于整个系统程序的,我想实现的是只在我的程序中F12为F1键. 想来想去都想不出个好办法来,希望高手能给个能行的方法. |
|
沙发#
发布于:2007-07-17 12:13
幸好我不是高手,不用支招了,帮顶一下
|
|
板凳#
发布于:2007-07-17 13:44
create 另 一个device, createsymbolic name,在应用程序中用deviceiocontrol控制,apc发送
|
|
地板#
发布于:2007-07-17 13:44
不懂你就慢慢的查
|
|
地下室#
发布于:2007-07-17 16:39
引用第2楼hollyranch于2007-07-17 13:44发表的 : 驱动:建立另一个设备->建立符号链接->等待... 取IRP包->case IRP_MJ_DEVICE_CONTROL -> 取控制码->处理... 这个控制码是自己定义的,还是系统中有读数据的控制码?? 还有这个apc是指用户应用程序还是指apc_level??? 用户:CreateFile -> DeviceIoControl发送控制码 |
|
5楼#
发布于:2007-07-18 05:10
没办法了,百度、GooGle搜了N天,连根具体实现例子的毛都找不到...
Ctrl2cap代码改了再改,还是一个鸟样,真失败,莫非是我太笨了... 代码如下: NTSTATUS Ctrl2capDispatchGeneral (IN PDEVICE_OBJECT DeviceObject,IN PIRP pIrp) { NTSTATUS ntStatus=STATUS_SUCCESS; ULONG IoControlCodes=0; //I/O控制代码 PIO_STACK_LOCATION IrpStack=NULL; //IRP堆栈 PIO_STACK_LOCATION nextIrpStack=NULL; //设置IRP状态 pIrp->IoStatus.Status=STATUS_SUCCESS; pIrp->IoStatus.Information=0; IrpStack=IoGetCurrentIrpStackLocation(pIrp); //得到当前调用者的IRP nextIrpStack = IoGetNextIrpStackLocation(pIrp); switch (IrpStack->MajorFunction) { case IRP_MJ_READ: *nextIrpStack = *IrpStack; IoSetCompletionRoutine( pIrp, Ctrl2capReadComplete, DeviceObject, TRUE, TRUE, TRUE ); return IoCallDriver( kbdDevice, pIrp ); break; case IRP_MJ_CREATE: DbgPrint("IRP_MJ_CREATE\n"); break; case IRP_MJ_CLOSE: DbgPrint("IRP_MJ_CLOSE\n"); break; case IRP_MJ_DEVICE_CONTROL: DbgPrint("IRP_MJ_DEVICE_CONTROL\n"); //取得I/O控制代码 IoControlCodes=IrpStack->Parameters.DeviceIoControl.IoControlCode; switch (IoControlCodes) { case START: //这部分不知要怎样改才能实现?大虾们帮帮忙啊!!! DbgPrint("Starting\n"); break; case STOP: DbgPrint("Stoping\n"); break; default: pIrp->IoStatus.Status=STATUS_INVALID_PARAMETER; break; } break; default:break; } ntStatus=pIrp->IoStatus.Status; IoCompleteRequest(pIrp,IO_NO_INCREMENT); return ntStatus; } |
|
6楼#
发布于:2007-07-18 11:19
引用第5楼runrune于2007-07-18 05:10发表的 : 建议搂主从DDK的第一章看起! |
|
|