关于MS-DOS 7.x的内嵌LOGO,我刚才在网上找到了以下资料:
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 ,4D42
12B9:DE12 0F DB 0F
12B9:DE13 854801 TEST CX,
12B9:DE16 83C60E ADD SI,+0E
-u de19
12B9:DE19 833C28 CMP WORD PTR ,+28
-u de20
12B9:DE20 837C0C01 CMP WORD PTR ,+01
-u de28
12B9:DE28 837C0E08 CMP WORD PTR ,+08
-u de30
12B9:DE30 817C044001CMP WORD PTR ,0140
-u de39
12B9:DE39 817C089001CMP WORD PTR ,0190
-u de42
12B9:DE42 837C1000 CMP WORD PTR ,+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的文件,但没有通过上述所有检查,则拒绝显示并且也不再显示内部嵌入的徽标封面。
四、撤销对LOGO.SYS的格式检查并形成抖动变色的徽标封面
用上述方法显示的外部封面图像是静止的,而IO.SYS中的图像下面具有一个滚动的颜色条,如?的方法则可以使图像颜色变化抖动?,如果去掉引导目录下的 LOGO.SYS,则IO.SYS内嵌的图像也可以做到整幅图面"彩云流动",具有很强的动感。位图的抖动变色是由IO.SYS处理的,其有关处理标志嵌入到上面对LOGO.SYS 的判断语句内,因此将相关的语句作一下改动即可。方法为:用PCTOOLS或其它工具(DEBUG等)找到下面有下划线的部分,将其均改写为16进制机器代码90(nop不作任何操作的空指令),在首尾之间共60字节,其中含有一些代码在上文的反汇编中并未列出。
debug io.sys
-d de00
12B9:DE00 00 93 BA 02 00 E8 D6 02 -0F 82 52 01 8B F2 81 3C ..........R....
12B9:DE10 42 4D 0F 85 48 01 83 C6 -0E 83 3C 28 0F 85 3E 01 BM..H.....
12B9:DE20 83 7C 0C 01 0F 85 36 01 -83 7C 0E 08 0F 85 2E 01 .|....6..|.....
12B9:DE30 81 7C 04 40 01 0F 85 25 -01 81 7C 08 90 01 0F 85 .|.@...%..|....
12B9:DE40 1C 01 83 7C 10 00 0F 85 -14 01 8B 44 24 1E 2E 8E ...|.......D$..
12B9:DE50 1E 3E 0F A2 D8 02 F6 D8 -04 FF A2 D9 02 84 E4 74 .>.............
12B9:DE60 06 A3 DA 02 A3 DC 02 1F -2E C6 06 F2 8E 00 16 07 ...............
12B9:DE70 83 EC 26 8B FC BD 5F 03 -E8 45 02 B9 00 80 E8 E9 ..&..._..E.....
对IO.SYS作上述改动后,可以显示任何位图,但由于显示是根据系统显示驱动程序及屏幕调整图形大小,因此尺度上仍以原设定为好。若想做改动应先测试,结果可能会失真,但不影响显示及运行。经过上述改动后,在没有外部LOGO.SYS的情况下,内嵌的封面可以抖动和变色。若将LOGOS.SYS或LOGOW.SYS命名为LOGO.SYS并放在引导目录下即可代替内部封面而且具有变化的色彩。但若对这两个位图进行了编辑或是用Paintbrush形成的新文件一般不能变色,这是由于Paintbrush形成的文件实际用到的色彩很少,位图颜色表大部分是空的。要形成一个新的变色徽标应该:
1.用Paintbrush等形成一个普通256色位图;
2.使形成的位图具有完全的256颜色索引表,这可以从LOGOW.SYS或LOGOS.SYS 的颜色索引表中得到,即复制LOGOW.SYS或LOGOS.SYS文件偏移36H~436H的域到新文件相同的域。注意不要改动位图前0~36H字节。将新文件命名为LOGO.SYS并放在引导目录下即可。
五、撤销WIN.COM及USER.EXE对LOGOS.SYS 和LOGOW.SYS的格式检查
方法与前面类似,此处不再一一详述。
由于引导文件非常重要,在做改动时一定要在拷贝上改动,现在DOS7用IFSHLP.SYS可以处理长达255B的文件名,而此文件名的存储是将目录项属性字节改为0FH,即系统(04)+隐藏(02)+只读(01)+卷标(08)=VFAT的文件名属性(0FH),并利用多个目录项区将长文件名连续存放。为了防止数据丢失,DOS7屏蔽了绝对磁盘写INT 26H, 而PCTOOLS等工具的EDIT功能是调用INT 26H进行写盘的的,若在硬盘上改动会造成系统死锁而取消写盘,在软盘上则没有这个问题,因此建议对IO.SYS的修改在系统软磁盘上进行。
对DOS7的系统软盘形成很容易,在DOS7下初始化的磁盘,只将IO.SYS、MSDOS.SYS、COM-MAND.COM拷进即可引导Windows 95,这是由于DOS7有更精巧的 BOOT引导区,引导文件IO.SYS可以不连续存放、不占起始簇、文件名项不是第一目录项。
附录: 位图文件结构
本文涉及到的位图文件首部重要域
偏移 长度(Bytes) 标识信息
00H 2 424DH 即 "BM"
0EH 4 位图信息头大小 28H=40字节
12H 4 位图宽度像素数 4001H=320个像素
16H 4 位图高度像素数 9001H=400个像素
1AH 2 位图目标设备位面数 1
1CH 2 位图阵列每像素所需位数,可取值为
1:单色,4:16色,8:256色,24:16兆色
1EH 4 位图压缩标志,可取值:0:未压缩,1:行程压缩8位位图,2:4位压缩位图
因此本文IO.SYS所读的位图LOGO.SYS是非压缩、位面数为1、 256色、宽320像素、高400像素的位图。
對不起啊,我不懂用dblspace.
hunome:其实内嵌LOGO的添加工作可以做到,我已基本实现,但操作起来却相当复杂,所以不怎么实用。至于启动不同DOS显示不同LOGO,其实修改IO.SYS中的相应字符串就可以做到。