2010-05-17, 03:14 PM | #1 | |
注册日期: 2003-10-22
帖子: 11,053
积分:6
精华:24
现金:14348金币
资产:29325305金币
|
虚拟软盘vfloppy源代码发布
背景介绍---为什么需要虚拟软盘 经常有人提出这样或者类似的问题: 我光驱、软驱都坏了,但想在DOS下重装2000,有什么方法吗?帮帮忙,怎么样都行,可不 可以删掉一些2000的系统文件,在启动时让它进不了2000,直接跳到DOS方式? 现在大家的PC机上大部分安装的是Windows2000或者windows xp等系统,直接使用NTLoader 作为启动管理器,NTLoader这个启动管理器的优点是直接安装在分区的引导扇区上,不影响 主引导扇区,不会被误判为病毒,NTLoader可以直接在NTFS分区上运行,而且由于是window s自带的,使用比较 方便,所以大部分windows的用户都直接使用NTLoader,不少人除2000/ XP系统外没装其他系统。 同时比较新的PC机通常都取消了软驱,而比较老的PC机的软驱又坏了(如我的老机器),而 且软盘也容易损毁,所以需要软驱的机会不太多了,但是软盘在某些时候还是会发挥比较大 的作用的,如在没有cdrom的机器上安装新的操作系统,杀毒,或者测试引导用的 镜像等等 情形。 综合上面所说的两种情形,可以看出我们需要某种方法可以通过NTLoader加载其他的操作系 统的启动盘,为什么说要加载其他操作系统的启动盘,而不是启动文件,因为NTLoader只能 在Fat和NTFS分区上运行,而其他的操作系统绝大多数不能在NT FS上运行,并且大多数操作 系统可以从软盘启动,通过加载启动镜像文件的方法,可以完全隔离操作系统之间文件的干 扰,文件系统的格式也完全独立于主操作系统。 类似的工具 那么有没有其他的引导程序可以完成类似的工作呢? lilo 需要在linux 下安装,并且不能虚拟软盘 diskemu 是在光盘上运行的,不支持fat ,ntfs,仅仅支持ISO9660。 BootScriptor 也是光盘上运行的,不支持fat ,ntfs,仅仅支持ISO9660。 isolinux 也是光盘上运行的,不支持fat ,ntfs,仅仅支持ISO9660。 syslinux 可以在硬盘运行,支持fat16 ,fat12 ,但是不支持fat32 ,ntfs grub 通过syslinux 的memdisk可以做到类似的工作,但是memdisk要求镜像文件必须在硬盘 上连续存放。 虚拟软盘的使用 虚拟软盘由3个文件组成,vfloppy.exe,vloader.bin,vmemdsk.bin,其中vfloppy.exe是W in32的控制台程序,vloader.bin是一个512字节的引导代码,vmemdsk.bin是真正的用内存 中加载 的软盘镜像文件来虚拟一个软驱的代码。 另外还需要一个镜像文件,可以是1.44M的或者2.88M大小,该镜像文件必须可以启动,就是 把这个文件写道软盘后,可以从该软盘启动计算机。 假设 vfloppy 放在 c:\boot ,c盘可以是fat16 fat32 ntfs 分区格式 在 c:\boot.ini 中 加入一项 c:\boot\vloader.bin ="any os floppy " 重新启动系统后,在ntloader的菜单上选择virtual floopy 就会加载 c:\boot\anyos.img 这个镜像,并运行,就好像从一个软驱中启动一样。 特点: 1 安全,虚拟软盘是只读的,不向引导区写代码,不会破坏系统,无需会恢复mbr 2 方便,可以随时重新启动系统,进入别的操作系统,如DOS6.22 dos7 ,linux等dos环境 ,而不需要独立的分区。 3 完全用内存虚拟软盘,加载后可以格式化存放原来的引导镜像的硬盘,或者进行ghost操 作。 注意事项: 1.如果C:用的NTFS,并且使用了磁盘压缩的请确保C:\Boot目录及其下面的文件没有被压缩 。 2.运行vfloppy,只是根据你的硬盘情况生成相应的引导文件vloader.bin和虚拟软盘vmemds k.bin文件,绝对不会重写MBR。 3.vmemdsk.bin定位磁盘镜像anyos.img时是直接通过该文件所在的磁盘扇区,而不是通过文 件系统,所以能很容易的实现对NTFS,fat32,fat的支持。即使删除了该文件,只要所在扇 区的数据还没有被覆盖,或许仍然能够启动该磁盘镜 像,但进行磁盘整理后可能造成无法 启动,只需要重新运行一下vfloppy即可。 4. vfloppy.exe 的参数可以是绝对路径,如 vfloppy -1 c:\ttt\vloader.bin -2 c:\kkk\vmemdsk.bin -i c:\img\dos.img 应用实例 ghost :用ghost 恢复系统的时候,需要一个软盘或者光盘来启动,而使用vfloppy可以方 便的在仅有硬盘启动的时候,用备份的ghost文件覆盖当前的系统分区。 Knoppix:Vfloppy一个用途就是可以把在光盘上运行的Knoppix 系统方便的放到硬盘上,而 不需要对系统重新分区.只需要把Knoppix光盘上的文件直接拷贝到硬盘,然后让NT Loader 通过虚拟软盘的方式加载Knoppix的启动镜像文件就可以了. 如果cdrom的盘符是E,我们想在D盘上运行KNOPIX,则 cd E:\KNOPPIX mkdir D:\KNOPPIX copy KNOPPIX D:\KNOPPIX\ 从NT Loader 加载的虚拟软盘启动后,KNOPPIX会自动在硬盘上扫描KNOPPIX文件夹和KNOPPI X文件。 这样既可以享受knoppix的便捷,很方便的更新knoppix到最新版本,又不需要刻录光盘,而 且光盘运行knoppix会比硬盘慢。 NTLoadr的特点 MS的NTLOADER除了可以加载winNT,win2k,xp等等,还可以运行以前安装的Windows98,Win dows 98 启动的过程是: 1 bios自检后,加载硬盘的主引导纪录-MBR,运行MBR的代码。 2 MBR的代码检测分区表,然后加载活动分区的引导纪录-DBR,运行DBR的代码。 NTLOADER加载windows98的原理是,安装win2k的时候,保存了Windows98的引导纪录DBR文件 --Bootsect.dos,然后安装Win2k自己的引导记录DBR, 用NTLoader启动windows98的过程是: 1 bios自检后,加载硬盘的主引导纪录-MBR,运行MBR的代码。 2 MBR的代码检测分区表,然后加载活动分区的引导纪录-DBR,运行DBR的代码,该代码是NT loader的代码。 3 NTloader的DBR的代码加载相关的程序,然后显示启动菜单,接受用户的命令-启动window s 98。 4 NTloader的DBR的代码加载保存下来的windows98的DBR文件-Bootsect.dos,运行该DBR的 代码。 5 windows98的DBR的代码查找IO.sys,启动WIndows98。 从上面2个过程的对比可以看出,NTloader在加载Windows98的时候,仅仅是一个传递引导控 制的过程,把计算机启动代码运行过程传递到一个文件(Bootsect.dos)中,然后由这个文 件继续引导操作系统。 从上面的分析过程,可以看出,NTloader可以加载一个引导文件,然后把控制转移到该引导 文件上,平时常见的用NTloader加载linux就是类似的原理。 虚拟软盘的原理 同前面的过程类似,就是生成一个引导扇区文件DBR,让NTloader加载并运行,然后这个DB R文件加载硬盘上的磁盘镜像文件anyos.img,最后把控制权引导到该镜像文件。 虚拟软盘的代码分为3个部分, 引导扇区文件的代码,用内存模拟软驱的代码,计算镜像文 件的扇区地址的代码。分别对应着 虚拟软盘的3个文件组成,vloader.bin,vmemdsk.bin,vfloppy.exe, 运行如下语句的时候: vfloppy -1 vloader.bin -2 vmemdsk.bin -i anyos.img , vfloppy执行如下2个操作: 1 vfloppy 计算anyos.img镜像文件在磁盘上所占用的绝对扇区地址,把扇区地址写入到vme mdsk.bin中的预定位置, 这样在引导系统的时候,就不需要操作系统的支持而读取anyos.i mg镜像文件。 2 vfloppy 计算vmemdsk.bin文件在磁盘上所占用的绝对扇区地址,然后把扇区地址写入到v memdsk.bin和vloader.bin中的预定位置。 用NTLoader启动vfloppy的过程是: 1 bios自检后,加载硬盘的主引导纪录-MBR,运行MBR的代码。 2 MBR的代码检测分区表,然后加载活动分区的引导纪录-DBR,运行DBR的代码,该代码是NT loader的代码。 3 NTloader的DBR的代码加载相关的程序,然后显示启动菜单,接受用户的命令-启动vflopp y。 4 NTloader的DBR的代码加载vfloppy的启动代码vloader.bin,转移控制到vloader.bin中。 5 vloader.bin根据执行vfloppy.exe时记录的vmemdsk.bin文件的扇区地址,加载vmemdsk.b in,转移控制到vmemdsk.bin中。 6 vmemdsk.bin根据执行vfloppy.exe时记录的anyos.img文件的扇区地址,读入anyos.img文 件。 7 vmemdsk.bin的代码把对软驱的访问重定向到内存,也就是用内存模拟一个软驱。 8 vmemdsk.bin的代码加载模拟软驱的引导代码,从模拟软驱开始引导系统。 和PQMAGIC 与 Drive Image自带的虚拟软盘对比 如果用过PQMAGIC的人就知道, 他运行时如果是对系统分区进行调整,是重启之后启动到DO S后才开始工作的, NT内核系统如win2k,xp等同样如此,据分析, PQMAGIC有一个程序能将 系统启动到虚拟软盘中, 这种虚拟软盘用的实际就是IMG格式的未压缩的映像, 可以使用win image来编辑,Drive Image同样带有类似的虚拟软盘。 那么为什么我不直接使用PQMAGIC的虚拟软盘呢? 因为: 1 安全,pqmagic 的虚拟软盘的引导程序是放在mbr中的,并且占据磁盘开始的3个扇区,也 就是说vfloppy.sys安装的时候,需要向从mbr开始的3个扇区写数据,这样如果此时发生错 误,将可能使得系统无法引导。 2 冲突,由于"向从mbr开始的3个扇区写数据",有可能和其他的启动管理程序冲突,如Sm art Boot Manager 也需要这些扇区空间,pqmagic 的虚拟软盘的安装代码将会覆盖它,并 且是永久覆盖,不会恢复。 3 不灵活,pqmagic 的虚拟软盘执行前,将会恢复主引导记录MBR,从而在系统启动的时候 ,我们无法选择需要启动的操作系统。 虚拟软盘的源代码 参考了grub0.93 的源代码和pqmagic 的vfloppy.sys 的反汇编代码后,实现的一个类似pqm agic 的vfloppy.sys的虚拟软盘系统。 主要分为3个模块: 1 引导扇区文件vloader.bin的代码:在vfloppy\loader目录的vloader.asm中,作用就是根 据vfloppy.exe记录在该文件内部的关于vmemdsk.bin文件的扇区列表,加载vmemdsk.bin, 并执行。这个模 块的代码必须限制在512个字节以内,也就是一个硬盘扇区的大小,这样Nt loader才能加载这个引导扇区文件。由于512字节空间大小的限制,如果vmemdsk.bin很大的 话,有可能空间不足,所以这里引导扇区文件仅仅记录了vmemdsk.bi n文件第一个扇区的地 址,然后通过vmemdsk.bin文件第一个扇区继续加载vmemdsk.bin的其他扇区。 2 模拟软驱vmemdsk.bin的代码:在vfloppy\loader目录的vmemdsk_start.asm和vfloppy.sy s中,其中vfloppy.sys文件来自pqmagic7的虚拟软盘的文件,vmemdsk_start.bin负 责继续 vloader的工作,加载vmemdsk.bin文件中剩余字节。这个剩余的字节就是pqmagic原来的vfl oppy.sys文件,vmemdsk.bin= vmemdsk_start.bin + vfloppy.sys ,这种加载机制很容易 扩充,用来加载很大的文件,我给它命名为"链式加载机制"。vfloppy.sys负责读取镜像 文件,并虚拟一个软驱。 3 计算镜像文件的扇区列表vfloppy.exe的代码: 主要由vfloppy\loader目录的install.c ,fat_blocklist.c,ntfs_blocklist.c,blocklist.c,win32.c 等文件组成。lode_lero y( lode_leroy@hotmail.com)利用linux下ntfs的驱动给grub增加了对NTFS分区的支持, 我从中抽取了部分读取ntfs 和 fat的代码,所以很多头文件都在grub的目录下面,为了方 便,我把vfloppy的源代码放在grub的vfloppy目录下面。vfloppy.exe除了计算镜像文件的 扇区列表外,还要给pqmagic的vfloppy.sys传递镜像文件的参数 ,说明如下: 0x09:起始指令。 0x0c: 共5761*4 字节,镜像文件的扇区位置列表,零字节结束,所能代表最大镜像文件为 ( 5760*512/1000)M=2.88M 0x5dd3: 1字节,为0,表示不恢复MBR,为1,表示恢复MBR。需要设置为0,否则为导致MBR 被覆盖。 0x5dd4-0x4fd4: 512 字节,备份的MBR,没有用处了。 0x5dc3:1字节,0表示1.44M软盘,1表示2.88M软盘。 0x5dc4:2字节,扇区总数,1.44M软盘有2880扇区,2.88M软盘有5760扇区。 0x5dc6:1字节,每柱面扇区数,1.44M软盘每柱面有18个扇区,2.88M软盘36个扇区。 寄存器ch:镜像文件所在硬盘的BIOS序号,0x80表示第一块硬盘,0x81表示第二块硬盘。 设置好这些参数后,就可以从pqmagic的vfloppy.sys的0x09字节处的指令开始执行了。 源代码用mingw32和nasmw编译就可以了,这些工具都是免费的。附上的文件包括了打了iso9 660和ntfs补丁的grub0.93以及vfloppy的所有源代码。 vfloppy的展望 1 win9x和dos版本,源代码中包括了一个精简的dos版本,仅仅支持fat ,可以在dos和win9 x下面运行,需要dpmi的支持,还需要进一步的测试。 2 重写模拟软驱vmemdsk.bin的代码,支持128G以上的硬盘(需要bios的支持),支持大的 镜像文件,支持iso文件,支持磁盘切换,支持内存写盘,支持保存内存盘的修改,这部分 代码仅仅在扇区级别处理,没有涉及文件系统,所以不是很困难。 3 直接处理文件系统,类似于一个精简版本的grub,比较难。 附件[Grub93&vfloppy.rar]: http://blog.blogchina.com/upload/200...1517279877.rar |
|
|
||
|