windows 控制台子系统如何工作?

How does windows console subsystem work?

那么控制台子系统是如何工作的呢?我了解诸如 windows 之类的高级内容会自动为程序创建控制台 window,然后为控制台 window 提供句柄,您可以使用 WriteConsole 和 ReadConsole 对其进行写入和读取,但是 window 本身有效吗? windows 使用 GDI 将字符绘制到控制台中吗?还是一些隐藏的内部功能?幕后发生了什么?

这个问题太模糊了,无法详细回答,但我会试一试。

32 位控制台至少有 3 种不同的实现方式Windows:

  • Windows95/98/ME
  • 中的 MS-DOS 框
  • CSRSS 在 NT4/2000/XP/2003/Vista
  • 上拥有的控制台 windows
  • ConHost 拥有的控制台 windows 7 及更高版本

基于 NT 的控制台使用 IPC 在客户端应用程序和控制台所有者进程之间进行通信。 ReadFileWriteFile 函数有一个特殊的 hack,并且在给定控制台句柄时也与控制台所有者通信(而不是像使用 "normal" 句柄那样调用内核)。

控制台 window 是一个普通的 HWND,大部分使用普通的 GDI。

较旧的控制台还支持本机硬件全屏模式,它可能直接使用 BIOS/VGA 东西。在 windowed 模式下,我相信它使用了未记录的 GdiConsoleTextOut 函数。因为 CSRSS 是一个核心进程,他们可能会调用一些未记录的 NT 函数来避免加载更高级别的 DLL,但实际的绘图代码并没有什么特别之处。

在 Windows 的较新版本中,由于 DWM and a unprivileged process (ConHost.exe) owns the console window to prevent shatter attacks against CSRSS. ConHost.exe imports PolyTextOutW 全屏模式已被删除,所以我假设它是用来绘制文本的。

NT 控制台还支持未记录的位图图形模式,我假设它也使用纯 GDI。

当然,所有这些都是未记录的实施细节,可能随时更改。最接近官方文档的可能是 this blog post where they also reveal that the IPC method used is the undocumented LPC 功能。