【问题标题】:How does windows console subsystem work?Windows 控制台子系统如何工作?
【发布时间】:2017-08-01 15:49:33
【问题描述】:

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

【问题讨论】:

  • 您提出的问题只有微软才能回答。这是一个封闭的系统,所以人们只能猜测发生了什么。
  • @EmettSpeer 是的,但是这里有很多问题“只能由微软回答”,例如“什么是 HANDLE?”已经在这里回答了,为什么要投反对票?
  • 这个问题太大了,任何不参与该项目的人都无法回答。我也没有否决您的问题,但这可能是因为您提出了一个大问题。

标签: windows internal internals


【解决方案1】:

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

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

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

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

控制台窗口是一个普通的 HWND 并且大部分使用普通的 GDI。

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

在较新版本的 Windows 中,全屏模式已被删除,因为 DWM 和非特权进程 (ConHost.exe) 拥有控制台窗口以防止 shatter attacks 对抗 CSRSS。 ConHost.exe 导入PolyTextOutW,所以我假设它是用来绘制文本的。

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

当然,所有这些都是未记录的实现细节,并且可能随时更改。最接近官方文档的可能是this blog post,其中还显示使用的 IPC 方法是未记录的LPC 功能。

【讨论】:

    猜你喜欢
    • 2013-04-14
    • 2011-12-06
    • 1970-01-01
    • 2013-06-19
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    相关资源
    最近更新 更多