如何在本机NT文本模式下获取图形?

8

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

我已经知道的:

  1. 这可能需要一些文档不太完备的功能。我可以接受。

  2. 我已经知道如何编译本机NT可执行文件,因此可以在回复中省略该部分。

问题:

  1. 你如何在所有东西都启动之前显示图形?(即,你使用哪些函数/库?)

  2. 它如何在屏幕上显示格式化和对齐的文本?
    我知道NtDisplayString能够写入文本,但无法以格式化的方式绘制东西,正如您下面所看到的。你使用什么函数来复制下面的行为?

Screenshot


我在那张图片中看到的唯一图形是VirtualBox,其余部分可以使用扩展ASCII字符集中的线条和方框字符完成。 - Ben Voigt
1
@Ben:你如何使用扩展ASCII字符来实现一个蓝色像素,接着是一个白色像素,然后是一个黑色像素,最后是一个灰色像素?(参见进度条的边框。)字体不是有点大了吗? - user541686
@Mehrdad:如果使用扩展ASCII完成,进度条轮廓很可能会是深蓝色,与进度条本身相同。我不认为我能在你的屏幕截图上看出区别。我认为你是对的,这个图像不仅仅是文本,但即使不完全相同,文本也可以给你所有这些具有类似外观的图形元素。 - Ben Voigt
@Mehrdad:如果我没记错的话,在最近版本的Windows上,启动时的chkdsk甚至可以在图形模式下显示。 - Ben Voigt
@Ben:我猜我无法确定它是否真正处于文本模式,但假设它处于图形模式。那么你要如何绘制呢? - user541686
显示剩余2条评论
2个回答

7

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

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

VidBufferToScreenBlt
VidScreenToBufferBlt
VidBitBlt

你可以通过查看VirtualBox来确定分辨率,它可能是标准分辨率如640x480或800x600。编写一些输出单行字节的代码将有助于您确定宽度,并通过尝试不同的值,您可能还可以确定像素的排列方式(我建议您在VirtualBox中完成所有这些工作)。 - Stuart Axon

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

哇,真的吗?所以你认为它可能根本没有使用操作系统功能? - user541686
实际上,我非常怀疑这是真的 - 他们使用的字体和分辨率与Windows相同,所以我怀疑这实际上并没有发生。 - user541686
@Mehrdad:也许它正在使用Windows用于图形加载屏幕的任何调用(出现在启动时chkdsk之前,并且自Win2000以来一直存在)。它不是使用通常的图形驱动程序,因为那些驱动程序无法加载而不锁定系统分区(注册表挂载为读写等)。 - Ben Voigt
@Ben:我无法弄清楚这段代码的作用——反汇编似乎有错误。我只能看到这个 DLL 的名称是“EuEpmGdi.dll”,但我无法弄清它在做什么——除了我看不到任何导入的东西,唯一相关的函数是“ZwDisplayString”。(编辑:我还看到了“NtLoadDriver”...也许它正在加载驱动程序...) - user541686
@Ben:其实,我已经想通了,看看我的回答吧。 :-) - user541686
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接