在我的 Windows XP SP3 启动并且所有 CPU 活动 Dimm 之后,我观察了当我在桌面上的空白处以圆圈移动鼠标时发生的情况:首先exporer.exe
调用,然后csrss.exe
。
在里面维基百科文章它csrss.exe
说的是类似
当用户模式进程调用涉及控制台窗口、进程/线程创建或并行支持的函数时,Win32 库(kernel32.dll、user32.dll、gdi32.dll)不会发出系统调用,而是向 CSRSS 进程发送进程间调用,该进程会在不影响内核的情况下完成大部分实际工作。[1] 窗口管理器和 GDI 服务由内核模式驱动程序(win32k.sys)处理。[2]
这让我相信鼠标移动也是由win32k.sys
- 处理的,但也许我误解了。
有人能把这些碎片拼凑起来吗?我很好奇打电话的具体原因。谢谢。
答案1
我不记得在哪里读到过,但是 csrss.exe 确实负责渲染鼠标指针。让 csrss.exe 来处理这个任务可能是最合理的,因为它可以很好地向任何 win32 应用程序传递消息,因为所有 win32 应用程序都在它“之下”运行。
答案2
incsrss
代表csrss.exe
客户端/服务器子系统。它是与哪个子系统通信的部分win32k.sys
- 在该子系统移入内核模式(以前在 NT 3.51 中处于用户模式)之后 - 负责(顾名思义)Win32 子系统的大部分“GUI”功能(包括窗口消息)。
Windows 中存在多个子系统,默认情况下,当您在桌面上工作或运行 Windows 服务时,您将使用与 Win32 子系统绑定的程序。除其他事项外,这意味着kernel32.dll
将在启动时加载(作为第一个或第二个 DLL,取决于确切的 Windows 版本)到程序中。
大多数kernel32.dll
调用最终都会进入内核本身(通过ntdll.dll
用户模式进入ntoskrnl.exe
内核模式),而来自的调用user32.dll
最常进入win32k.sys
。不同的功能,它们最终到达的位置也不同。这也是为什么你的鼠标移动会导致对客户端-服务器子系统的调用的最终解释。csrss.exe
是这Win32 子系统,因此负责所有特定于 Win32 子系统的细节,例如窗口消息。字体、窗口等不是内核中的一等公民,而互斥、事件、文件则是。但前者的处理仍然通过其扩展转移到内核,该扩展win32k.sys
甚至拥有自己的系统服务描述符表 (SDT 或 SSDT),用于以安全的方式从用户模式调用内核服务。
顺便说一句:如果你碰巧有一个反汇编程序或类似的工具dumpbin
(Visual Studio 附带),你可以自己检查一下:
for %i in (user32.dll ntdll.dll kernel32.dll ntoskrnl.exe win32k.sys) do @(echo %i & dumpbin /headers %i|findstr subsystem)
在 Windows 7 x64 上将给出(从内部运行时C:\Windows\System32
):
user32.dll
6.01 subsystem version
2 subsystem (Windows GUI)
ntdll.dll
6.01 subsystem version
3 subsystem (Windows CUI)
kernel32.dll
6.01 subsystem version
3 subsystem (Windows CUI)
ntoskrnl.exe
6.01 subsystem version
1 subsystem (Native)
win32k.sys
6.01 subsystem version
1 subsystem (Native)
“本机”子系统实际上意味着不Windows 中的子系统。即它直接与本机 API 对话(它没有 Win32 API 的很多限制)。内核模式驱动程序没有子系统,即“本机子系统”。此外,一些在winlogon.exe
实际smss.exe
生成的程序之前运行的程序winlogon.exe
也是“本机程序”。一个很好的例子是,autochk.exe
它负责检查文件系统上的“脏”标志,并在设置该标志时运行文件系统检查。
本机 API 的一个例子是NtCreateFile
与 Win32 相对应CreateFile
。但是,解释细节需要一本书。请参阅 Russinovich 的“Windows Internals”了解概述,并参阅 Nebbett 的“Windows NT/2000 本机 API 参考”了解一些细节。另请参阅未记录.ntinternals.net和未公开的 Windows 2000 秘密...