Windows 95的引导图形界面及抖动变色图像的形成(一)

摘要 该文剖析了Windows 95 的部分文件,给出了人们很感兴趣的用户定做启动徽标和关机图像的方法,并使其显示启动徽标抖动和变色。

一、引言
Windows 95以更新更好的界面展现在用户面前,而给人印象最深的是表明其是"彻底"图形界面的引导及结束时的标志图形。Windows 95使系统由图形引导启动并在图形界面中关闭,系统在显示微软启动徽标的同时进行初始化,在显示等待信息的同时完成系统退出并以一个图形化的提示信息结束系统工作。此外,Windows 95还为旧DOS程序的运行设计了很好的图形化界面, 从而使系统的整个工作过程完全可以脱离过去的命令行方式。本文介绍这些界面图形的定制和使启动封面图形抖动变色的方法。

二、Windows 95的三幅界面图
Windows 95用三幅图完成其初始化和关闭传递信息工作,即启动徽标(封面)、封底1(显示 "Please wait while your computer shuts down")、封底2(显示 "It's now safe toturn off your computer") 。其中封底1和封底2的图形是两个256色的位图文件,名字分别为LOGOW.SYS和LOGOS.SYS,存放在Windows的工作目录下,负责这两个图形显示的程序分别是USER.EXE和WIN.COM,它们在打开相应的图形文件后分别作文件格式检查。
WIN.COM的检查段代码为:
debug win.com
-u 3b68 3b83
0AF4:3B68 813F424D CMP WORD PTR [BX],4D42
0AF4:3B6C F9 STC
0AF4:3B6D 75B9 JNZ 3B28
0AF4:3B6F BBCE40 MOV BX,40CE
0AF4:3B72 833F28 CMP WORD PTR [BX],+28
0AF4:3B75 75F5 JNZ 3B6C
0AF4:3B77 837F0C01 CMP WORD PTR [BX+0C],+01
0AF4:3B7B 75EF JNZ 3B6C
0AF4:3B7D 837F0E08 CMP WORD PTR [BX+0E],+08
0AF4:3B81 75E9 JNZ 3B6C
0AF4:3B83 60 DB 60
寄存器BX中装的是打开成功的文件LOGOS.SYS首地址的偏移值,通过对比位图文件的首部结构,我们可以立即得到所打开的文件LOGOS.SYS是一个非压缩、位面数是1、256色的位图图像文件(关于位图文件的头部标志域可见附录1 的简述)。实际上LOGOS.SYS文件确实是一个完整的位图文件,可以用Paintbrush编辑,它显示封底2的信息。因此我们可产生相应格式的位图文件取代,试验证明完全可行。
USER.EXE对LOGOW.SYS也作类似处理,只是对位图标志域检查对比的部分语句不连续,其各项检查如下:
ren user.exe userexe
debug userexe
-u 5ada:abb8
5ADA:ABB8 813F424D CMP WORD PTR [BX],4D42
-u 5ada:abc4
5ADA:ABC4 833F28 CMP WORD PTR [BX],+28
-u 5ada:abcb
5ADA:ABCB 837F0C01 CMP WORD PTR [BX+0C],+01
-u 5ada:abd3
5ADA:ABD3 837F0E08 CMP WORD PTR [BX+0E],+08
其中寄存器BX中为打开的LOGOW.SYS存储首址。由此可见,可以用相应格式的位图来取代LOGOW.SYS用作封底1的显示。
值得注意的是,显示时自动按设定的屏幕分辨率来做全屏幕显示,对640×480、256色的屏幕,其位图大小最好设定为320×400像素。

三、启动徽标封面的定做方法
Windows 95的封面没有独立文件形式的位图文件,这与WIN.COM对LOGOS.SYS的处理和USER.EXE对LOGOW.SYS的处理不同。笔者在剖析引导文件IO.SYS的过程中发现,Windows 95的启动封面徽标是嵌入在引导文件IO.SYS中的,并经DBLSPACE压缩过,图像数据区长度为64KB。在笔者剖析的Windows 95版本中,图像数据占据IO.SYS(文件长度223748B)217~344扇区,数据内部有多处"DS"标识,这是DBLSPACE压缩文件的标志,由于DBLSPACE是分段校验压缩文件,因此,即使此区内有一个字节的改动也会造成图像的大幅破坏。在上述IO.SYS中,图像显示执行
代码部分起始于以"DBLSBIN$\LOGO.SYS"标志的地方并占据110-112扇区。由于DBLSPACE的压缩文件很复杂并分段校验,使我们不能像对Windows3.1的WIN.COM 那样通过改动组合文件或重编WIN.COM的部分代码来定做启动封面,但可以在MSDOS.SYS中以Logo=0来消隐显示。关于配置文件MSDOS.SYS的设定已有文献可查,本文附录2简述了其配置设定选择。
实际上,启动封面也是可以定做的。笔者在分析IO.SYS的过程中发现,IO.SYS在显示内部嵌入封面前先试图打开一个在引导目录下名为LOGO.SYS的文件(利用DOS功能调用INT 21H,AH=3DH子功能),若打开失败(此文件不存在)则转显示内部嵌入封面(在WIN.COM及USER.EXE中打开文件失败时则不显示图形,而代之以文本显示有关信息),若打开成功则做文件格式检查,其要求的格式比WIN.COM对LOGOS.SYS的检查条件苛刻。
IO.SYS对LOGO.SYS检查的代码如下:
debug io.sys
-u de0e
12B9:DE0E 813C424D CMP WORD PTR [SI],4D42
12B9:DE12 0F DB 0F
12B9:DE13 854801 TEST CX,[BX+SI+01]
12B9:DE16 83C60E ADD SI,+0E
-u de19
12B9:DE19 833C28 CMP WORD PTR [SI],+28
-u de20
12B9:DE20 837C0C01 CMP WORD PTR [SI+0C],+01
-u de28
12B9:DE28 837C0E08 CMP WORD PTR [SI+0E],+08
-u de30
12B9:DE30 817C044001CMP WORD PTR [SI+04],0140
-u de39
12B9:DE39 817C089001CMP WORD PTR [SI+08],0190
-u de42
12B9:DE42 837C1000 CMP WORD PTR [SI+10],+00
从以上代码我们可以立即看出,所打开的文件是一个非压缩、幅度320×400、位面数为
1、256色的位图文件。因此,可以用Paintbrush等工具形成一个256色非压缩、320像素×400像素的位图文件并命名为LOGO.SYS,将其放在引导目录下即可。要求的LOGO.SYS格式恰好与LOGOS.SYS及LOGOW.SYS的格式一致。作为验证,可将LOGOS.SYS或LOGOW.SYS命名为LOGO.SYS并放在引导目录下,实验证明完全可行。如果引导目录下有名为LOGO.SYS的文件,但没有通过上述所有检查,则拒绝显示并且也不再显示内部嵌入的徽标封面。