runrune
驱动牛犊
驱动牛犊
  • 注册日期2007-06-28
  • 最后登录2007-08-11
  • 粉丝0
  • 关注0
  • 积分170分
  • 威望18点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
阅读:1427回复:6

没办法了

楼主#
更多 发布于:2007-07-17 04:19
键盘过滤驱动(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键.

想来想去都想不出个好办法来,希望高手能给个能行的方法.
GNiDiA
驱动小牛
驱动小牛
  • 注册日期2006-10-11
  • 最后登录2017-10-09
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望145点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2007-07-17 12:13
幸好我不是高手,不用支招了,帮顶一下
hollyranch
驱动牛犊
驱动牛犊
  • 注册日期2004-04-23
  • 最后登录2015-07-18
  • 粉丝0
  • 关注0
  • 积分661分
  • 威望95点
  • 贡献值0点
  • 好评度73点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-07-17 13:44
create 另 一个device, createsymbolic name,在应用程序中用deviceiocontrol控制,apc发送
hollyranch
驱动牛犊
驱动牛犊
  • 注册日期2004-04-23
  • 最后登录2015-07-18
  • 粉丝0
  • 关注0
  • 积分661分
  • 威望95点
  • 贡献值0点
  • 好评度73点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-07-17 13:44
不懂你就慢慢的查
runrune
驱动牛犊
驱动牛犊
  • 注册日期2007-06-28
  • 最后登录2007-08-11
  • 粉丝0
  • 关注0
  • 积分170分
  • 威望18点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-07-17 16:39
引用第2楼hollyranch于2007-07-17 13:44发表的  :
create 另 一个device, createsymbolic name,在应用程序中用deviceiocontrol控制,apc发送


驱动:建立另一个设备->建立符号链接->等待...

   取IRP包->case IRP_MJ_DEVICE_CONTROL -> 取控制码->处理...
   
   这个控制码是自己定义的,还是系统中有读数据的控制码??

   还有这个apc是指用户应用程序还是指apc_level???

用户:CreateFile -> DeviceIoControl发送控制码
runrune
驱动牛犊
驱动牛犊
  • 注册日期2007-06-28
  • 最后登录2007-08-11
  • 粉丝0
  • 关注0
  • 积分170分
  • 威望18点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
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;
}
我最老实
驱动小牛
驱动小牛
  • 注册日期2005-09-11
  • 最后登录2010-01-27
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望253点
  • 贡献值0点
  • 好评度189点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-07-18 11:19
引用第5楼runrune于2007-07-18 05:10发表的  :
没办法了,百度、GooGle搜了N天,连根具体实现例子的毛都找不到...
Ctrl2cap代码改了再改,还是一个鸟样,真失败,莫非是我太笨了...

代码如下:

.......


建议搂主从DDK的第一章看起!
养牛专业户
游客

返回顶部