zhangxxxxx
驱动牛犊
驱动牛犊
  • 注册日期2003-03-24
  • 最后登录2009-06-19
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望56点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:1756回复:0

请教:关于键盘过滤驱动中获取进程名的问题

楼主#
更多 发布于:2009-06-17 13:24
我想在ctrl2cap的基础上加上判断是那个程序接受按键的功能,修改Ctrl2capReadComplete如下
但是获得的进程名称始终不对 IRP里面获取的始终是csrss.exe    PsGetCurrentProcess获取到的有几中可能 Idle explorer.exe monitor.exe csrss.exe
请有经验的人帮帮忙,谢谢!
 (虚拟机 WinXP系统SP2,DriverMonitor调试)
NTSTATUS Ctrl2capReadComplete(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    )
{
    PIO_STACK_LOCATION        IrpSp;
    PKEYBOARD_INPUT_DATA      KeyData;
    int                       numKeys, i;

                     //方法1 从IRP获得进程
    PETHREAD pthread=Irp->Tail.Overlay.Thread;
    PEPROCESS pProcess=PsGetThreadProcess(pthread);
    PEPROCESS pProcess1=PsGetCurrentProcess( );
    //方法2 从PsGetCurrentProcess获得进程
                    IrpSp = IoGetCurrentIrpStackLocation( Irp );
                     if( NT_SUCCESS( Irp->IoStatus.Status ) ) {
                      _asm int 3;
                     KeyData = (PKEYBOARD_INPUT_DATA)Irp->AssociatedIrp.SystemBuffer;
                     numKeys = Irp->IoStatus.Information / sizeof(KEYBOARD_INPUT_DATA);
                    for( i = 0; i < numKeys; i++ ) {
                               DbgPrint(("ScanCode: %x ", KeyData.MakeCode ));
                               DbgPrint(("%s   :", KeyData.Flags ? "Up" : "Down" ));
             PCHAR pProcPath =(PCHAR)((ULONG)pProcess+0x174);
             DbgPrint(("IRP进程名:%s     /",pProcPath));
             PCHAR pProcPath1 =(PCHAR)((ULONG)pProcess1+0x174);
             DbgPrint(("PsGetCurrentProcess进程名:%s     \n",pProcPath1));
        }
    }
    // Mark the Irp pending if required
    if( Irp->PendingReturned ) {

        IoMarkIrpPending( Irp );
    }
    return Irp->IoStatus.Status;
}
游客

返回顶部