【问题标题】:How do you get Graphics in Native NT Text-Mode?如何在 Native NT 文本模式下获得图形?
【发布时间】:2011-06-04 22:38:51
【问题描述】:

显然,EASEUS Partition Master 程序可以在 Windows GUI 启动之前显示图形(即,它与 CheckDisk 在启动时运行的同时运行)。

已经知道

  1. 这可能需要记录不充分的函数。我没关系。

  2. 我已经知道如何编译本机 NT 可执行文件,因此请随意在回复中省略它。

问题:

  1. 如何在一切启动之前显示图形? (即你使用什么函数/库?)

  2. 它如何在屏幕上显示格式化和对齐的文本?
    我知道NtDisplayString 能够编写文本,但它不能以格式化的方式绘制内容,如下所示。您使用什么函数来复制以下行为?

【问题讨论】:

  • 我在那张图片中看到的唯一图形是VirtualBox,其余的可以使用扩展ASCII字符集中的行和框字符来完成。
  • @Ben:你怎么做一个蓝色像素,然后是一个白色像素,然后是一个黑色像素,然后是一个灰色像素,只是使用扩展的 ASCII 字符? (查看进度条的边框。)字体不是比那个大一点吗?
  • @Mehrdad:如果使用扩展 ASCII 完成,进度条轮廓很可能是深蓝色,与进度条本身相同。我认为我无法在您的屏幕截图上分辨出区别。我认为您是对的,这张图片不仅仅是文字,而且文字可以为您提供所有具有相似外观的图形元素,即使不完全相同。
  • @Ben:好吧,还有另一个问题,即使我忽略了:如何向上移动光标?您可以通过打印退格键或使用NtDisplayString\r 移动它向左,但它们肯定使用不同的方法将内容打印到屏幕的不同部分。
  • @Mehrdad:IIRC,启动时 chkdsk 甚至在最新版本的 Windows 上以图形模式显示。

标签: winapi graphics nt nt-native-api native-executable


【解决方案1】:

我现在回答自己的问题有点傻,但是 Ben 的提示帮助我弄清楚了:

它使用了一个驱动程序,而驱动程序又在BootVid.dll中使用这些函数:

VidBufferToScreenBlt
VidScreenToBufferBlt
VidBitBlt

【讨论】:

  • 您可能可以通过查看 virtualbox 来计算正在使用的分辨率 - 它可能会是标准的东西,例如 640x480 或 800x600。编写一些输出单行字节的代码将帮助您计算宽度,通过尝试不同的值,您可能也可以计算出像素的组织(我会在 virtualbox 中完成所有这些)。
【解决方案2】:

也许它正在使用低级 VGA 调用来切换到图形模式并操作视频内存。

【讨论】:

  • 哇真的?!所以你认为它可能根本没有使用操作系统功能?
  • 实际上,我真的很怀疑这种情况——他们使用与 Windows 相同的字体和分辨率,所以怀疑这是否真的发生了。
  • @Mehrdad:也许它正在使用 windows 用于图形加载屏幕的任何调用(它出现在启动时 chkdsk 之前,并且自 Win2000 以来一直存在)。它没有使用通常的图形驱动程序,因为如果不锁定系统分区(注册表安装的读写等)就无法加载这些驱动程序。
  • @Ben:这很可能,但那些电话?它们在哪些 DLL 中,它们是哪些函数?
  • @Mehrdad:你有没有通过dependency walker运行文件?
猜你喜欢
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-28
  • 2012-04-14
  • 2018-07-09
  • 1970-01-01
相关资源
最近更新 更多