threebags
驱动牛犊
驱动牛犊
  • 注册日期2004-07-01
  • 最后登录2012-04-10
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望12点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:2736回复:8

在ctrl2cap中如何得到当前是哪个程序在使用键盘?

楼主#
更多 发布于:2005-06-21 08:17
  我在ctrl2cap的Ctrl2capDispatchRead中加入了在filemon中得到当前进程的函数,但返回的进程名全是csrss.exe,这是为什么?代码:

FilemonGetProcess( name );
  
/////////////////
DbgPrint(("********procname:%s\n", name));
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-06-21 11:32
使用 PsGetCurrentProcessId看看是csrss.exe的ID吗
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
threebags
驱动牛犊
驱动牛犊
  • 注册日期2004-07-01
  • 最后登录2012-04-10
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望12点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-21 15:46
谢谢AllenZh!
我用PsGetCurrentProcessId看了看,确实得到的都是csrss.exe的ID。
而csrss.exe的说明:

csrss.exe

这个是用户模式Win32子系统的一部分。csrss代表客户/服务器运行子系统而且是一个基本的子系统必须一直运行。csrss 负责控制windows,创建或者删除线程和一些16位的虚拟MS-DOS环境。

所以,是不是因为csrss.exe一直在运行,返回的当前进程就一直是它了?

那么,在驱动中如何知道当前是哪个应用程序在接受键盘输入呢?
tanjer
驱动牛犊
驱动牛犊
  • 注册日期2005-06-20
  • 最后登录2005-09-28
  • 粉丝0
  • 关注0
  • 积分28分
  • 威望6点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-06-23 12:03
键盘输入要由OS决定分发给 某个具有焦点的 UI线程。。当然先交给OS的某组件处理了 就是CSRSS...
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-06-24 17:23
下面是引用threebags于2005-06-21 15:46发表的:
谢谢AllenZh!
我用PsGetCurrentProcessId看了看,确实得到的都是csrss.exe的ID。
而csrss.exe的说明:

csrss.exe
.......

这个问题我最近在仔细研究,其实键盘驱动不管是port驱动、过滤驱动、class驱动,因为只要在一个设备堆栈中只有一个安全权限,是需要信任的子系统才能存取的,而Windows中目前只有一个信任子系统,那就是Win32子系统,这就是你上面的问题所在。而且用户的任何程序同样不能通过简单的方法与键盘堆栈的任何程序通讯,所以这是个相对复杂的问题
不过我已经用另外一种方法在做,已经取得了一些重大进展。。。
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-06-25 21:41
下面是引用bmyyyud于2005-06-24 17:23发表的:

这个问题我最近在仔细研究,其实键盘驱动不管是port驱动、过滤驱动、class驱动,因为只要在一个设备堆栈中只有一个安全权限,是需要信任的子系统才能存取的,而Windows中目前只有一个信任子系统,那就是Win32子系统,这就是你上面的问题所在。而且用户的任何程序同样不能通过简单的方法与键盘堆栈的任何程序通讯,所以这是个相对复杂的问题
不过我已经用另外一种方法在做,已经取得了一些重大进展。。。

这个到还真的没有研究过,等有时间调试一下
对了bmyyyud兄是不是从IRP中得到的呢?
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
threebags
驱动牛犊
驱动牛犊
  • 注册日期2004-07-01
  • 最后登录2012-04-10
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望12点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-06-27 15:26
这个问题困扰了我很久,前几天看JIURL,发现在<JIURL键盘驱动 2 >中已经说得很清楚了:

键盘驱动的使用者是线程 win32k!RawInputThread 。线程 win32k!RawInputThread 的进程是 csrss.exe。

    我最早是通过 WinDbg 的 !irpfind 命令看到了这一点。后来看键盘驱动时,观察kbdclass!KeyboardClassRead,kbdclass!KeyboardClassCreate 的 call stack 也看到了这一点。

    kbdclass!KeyboardClassCreate 是,键盘设备栈最顶端的设备对象的驱动中处理 IRP_MJ_CREATE 的函数。所以当有人使用 CreateFile 来打开键盘设备栈上的某个设备对象的句柄的时候,CreateFile 最终会发一个 IRP_MJ_CREATE 的 IRP 给键盘设备栈最顶端的设备对象,这将导致 kbdclass!KeyboardClassCreate 被调用。于是我们在这个函数上下断点,看看是谁引起了这个函数的调用。看看是谁要得到键盘的句柄。

    在系统初始化的末期,在 kbdclass!KeyboardClassCreate 上发生了打断,进入调试器。首先我们看看这时的当前线程是谁。
 
看到 Start Address 为 win32k!RawInputThread。说明线程 win32k!RawInputThread 在通过 CreateFile 来获得键盘的句柄。

看到 Cid 为 a0.bc 。说明线程的进程为 a0。

我们看看 a0 进程是谁。

kd> !process a0 0
Searching for Process with Cid == a0
PROCESS fe43b760 SessionId: 0 Cid: 00a0 Peb: 7ffdf000 ParentCid: 0090
DirBase: 03642000 ObjectTable: fe43b6c8 TableSize: 53.
Image: csrss.exe

看到 a0 进程的 Image 为 csrss.exe。

    kbdclass!KeyboardClassRead 是,键盘设备栈最顶端的设备对象的驱动中处理 IRP_MJ_READ 的函数。所以当有人使用 ReadFile 来要求读入数据的时候,ReadFile 最终会发一个 IRP_MJ_Read 的 IRP 给键盘设备栈最顶端的设备对象,这将导致 kbdclass!KeyboardClassRead 被调用。于是我们在这个函数上下断点,看看是谁引起了这个函数的调用。看看是谁要求从键盘读入数据。

    在 kbdclass!KeyboardClassCreate 上发生打断后,进入调试器。我们看看这时的当前线程是谁。

kd> !thread
THREAD fe42e5e0 Cid a0.bc Teb: 00000000 Win32Thread: e194a9e8 RUNNING
...
Start Address win32k!RawInputThread (0xa000e7cd)
...

看到 Start Address 为 win32k!RawInputThread。说明线程 win32k!RawInputThread 在通过 ReadFile 来要求从键盘读取数据。

看到 Cid 为 a0.bc 。说明线程的进程还是 a0。

这些足以说明键盘驱动的使用者是线程 win32k!RawInputThread 。线程 win32k!RawInputThread 的进程是 csrss.exe。
punk
驱动小牛
驱动小牛
  • 注册日期2001-04-07
  • 最后登录2018-06-01
  • 粉丝0
  • 关注0
  • 积分621分
  • 威望164点
  • 贡献值0点
  • 好评度60点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-03-01 16:15
呵呵,其实还有一个进程打开键盘。
就是终端服务所在的进程。
键盘是由终端服务进程分发给csrss的
不停学习
yeaiping
驱动牛犊
驱动牛犊
  • 注册日期2007-07-29
  • 最后登录2014-07-06
  • 粉丝3
  • 关注6
  • 积分86分
  • 威望629点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2010-06-12 11:46
请问一下如何在内核中获得当前使用键盘的进程名
授人以鱼不如授人以渔,反之,求鱼不如求渔
游客

返回顶部