阅读:2736回复:8
在ctrl2cap中如何得到当前是哪个程序在使用键盘?
我在ctrl2cap的Ctrl2capDispatchRead中加入了在filemon中得到当前进程的函数,但返回的进程名全是csrss.exe,这是为什么?代码:
FilemonGetProcess( name ); ///////////////// DbgPrint(("********procname:%s\n", name)); |
|
沙发#
发布于:2005-06-21 11:32
使用 PsGetCurrentProcessId看看是csrss.exe的ID吗
|
|
|
板凳#
发布于:2005-06-21 15:46
谢谢AllenZh!
我用PsGetCurrentProcessId看了看,确实得到的都是csrss.exe的ID。 而csrss.exe的说明: csrss.exe 这个是用户模式Win32子系统的一部分。csrss代表客户/服务器运行子系统而且是一个基本的子系统必须一直运行。csrss 负责控制windows,创建或者删除线程和一些16位的虚拟MS-DOS环境。 所以,是不是因为csrss.exe一直在运行,返回的当前进程就一直是它了? 那么,在驱动中如何知道当前是哪个应用程序在接受键盘输入呢? |
|
地板#
发布于:2005-06-23 12:03
键盘输入要由OS决定分发给 某个具有焦点的 UI线程。。当然先交给OS的某组件处理了 就是CSRSS...
|
|
地下室#
发布于:2005-06-24 17:23
下面是引用threebags于2005-06-21 15:46发表的: 这个问题我最近在仔细研究,其实键盘驱动不管是port驱动、过滤驱动、class驱动,因为只要在一个设备堆栈中只有一个安全权限,是需要信任的子系统才能存取的,而Windows中目前只有一个信任子系统,那就是Win32子系统,这就是你上面的问题所在。而且用户的任何程序同样不能通过简单的方法与键盘堆栈的任何程序通讯,所以这是个相对复杂的问题 不过我已经用另外一种方法在做,已经取得了一些重大进展。。。 |
|
|
5楼#
发布于:2005-06-25 21:41
下面是引用bmyyyud于2005-06-24 17:23发表的: 这个到还真的没有研究过,等有时间调试一下 对了bmyyyud兄是不是从IRP中得到的呢? |
|
|
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。 |
|
7楼#
发布于:2007-03-01 16:15
呵呵,其实还有一个进程打开键盘。
就是终端服务所在的进程。 键盘是由终端服务进程分发给csrss的 |
|
|
8楼#
发布于:2010-06-12 11:46
请问一下如何在内核中获得当前使用键盘的进程名
|
|
|