(这条文章已经被阅读了 255 次) 时间:2000-06-19 00:59:32 来源:20603 (邹咏钟) 原创-IT
分析WINDOWS 98启动盘的一个批处理程序
透视微软的市场策略
邹咏钟
安装WINDOWS 98时,安装向导会询问我们要不要创建启动盘,即使当时没有创建启动盘,事后也可在“控制面版”→“添加/删除程序”项下创建一张启动盘。系统启动出问题时可用启动盘启动机器来进行诊断。
查看启动盘的文件目录,我们会发现一个名为“autoexec.bat”的批处理文件,这个文件在启动系统时被自动执行。用记事本打开这个文件,其内容如下:(笔者注:如果你不懂,批处理程序部分可以跳过不看!)
@ECHO OFF
set EXPAND=YES
SET DIRCMD=/O:N
set LglDrv=27 * 26 Z 25 Y 24 X 23 W 22 V 21 U 20 T 19 S 18 R 17 Q 16 P 15
set LglDrv=%LglDrv% O 14 N 13 M 12 L 11 K 10 J 9 I 8 H 7 G 6 F 5 E 4 D 3 C
cls
call setramd.bat %LglDrv%
set temp=c:
set tmp=c:
path=%RAMD%:;a:;%CDROM%:
copy command.com %RAMD%: > NUL
set comspec=%RAMD%:command.com
copy extract.exe %RAMD%: > NUL
copy readme.txt %RAMD%: > NUL
:ERROR
IF EXIST ebd.cab GOTO EXT
echo Please insert Windows 98 Startup Disk 2
echo.
pause
GOTO ERROR
:EXT
%RAMD%:extract /y /e /l %RAMD%: ebd.cab > NUL
echo The diagnostic tools were successfully loaded to drive %RAMD%.
echo.
IF “%config%”==”NOCD” GOTO QUIT
IF “%config%”==”HELP” GOTO HELP
LH %ramd%:MSCDEX.EXE /D:mscd001 /L:%CDROM%
echo.
GOTO QUIT
:HELP
cls
call help.bat
echo Your computer will now restart and the startup menu will appear.
echo.
restart.com
GOTO QUIT
:QUIT
echo To get help, type HELP and press ENTER.
echo.
rem clean up environment variables
set CDROM=
set LglDrv=
逐行分析这个批处理文件,我们可以了解启动盘在启动系统过程中所执行的程序和执行顺序。这个批处理在运行过程中主要做了如下工作:
1、由于在配置文件“config.sys”中利用驱动程序Ramdrive.sys在内存建立了一个虚拟盘,虚拟盘驱动器号被分配在最后一个硬盘物理分区之后,所以“autoexec.bat”要干的第一件事是寻找这个虚拟驱动器,也就是寻找这个驱动器的盘符。“autoexec.bat”首先定义了一个环境变量“LglDrv”,然后外调执行一个批处理文件“setramd.bat”,参数为“%LglDrv%”,目的是找出虚拟盘的驱动器盘符“%RAMD%”和光驱盘符“%CDROM%”。
2、定义程序直接运行的路径“path”和重定向命令解释程序“command.com”到虚拟驱动盘。
3、将磁盘工具和系统检测程序包“ebd.cab”解压缩到虚拟盘。
4、用“MSCDEX.EXE ”装载光驱驱动程序到指定位置(盘符被分配在虚拟驱动盘之后)。
在此笔者对“autoexec.bat”所做的第一项工作提出质疑。为了寻找虚拟驱动盘,“autoexec.bat”外调了另一个批处理程序“setramd.bat”,我们再来看一看“setramd.bat”,其内容如下:
@echo off
set RAMD=
set CDROM=
echo.
echo Preparing to start your computer.
echo This may take a few minutes. Please wait…
echo.
a:findramd
if errorlevel 255 goto no_ramdrive
if not errorlevel 3 goto no_ramdrive
goto do_shift
:loop
if errorlevel %1 goto no_shift
:do_shift
set cdrom=%2
shift
shift
if not %1*==* goto loop
goto no_ramdrive
:no_shift
set ramd=%2
if “%RAMD%”==”C” goto c_drive
goto success
:c_drive
echo Windows 98 has detected that drive C does not contain a valid FAT or
echo FAT32 partition. There are several possible causes.
echo.
echo 1. The drive may need to be partitioned. To create a partition on the drive,
echo run FDISK from the MS-DOS command prompt.
echo.
echo 2. You may be using third-party disk-partitioning software. If you are using
echo this type of software, remove the Emergency Boot Disk and restart your
echo computer. Then, follow the on-screen instructions to start your computer from
echo a floppy disk.
echo .
echo 3. Some viruses also cause your drive C to not register. You can use a virus
echo scanning program to check your computer for viruses.
echo.
goto success
:no_ramdrive
echo The Windows 98 startup disk could not create a temporary drive for the
echo diagnostic tools. This may be because this computer has less than the
echo minimum required extended memory.
echo.
:success
我们看到在这个批处理中为了确认虚拟驱动盘的盘符,又外调了一个可执行程序“findramd.exe”,“findramd.exe”在执行时返回一个errorlevel值,由此判定“%LglDrv%”参数中第几个字母为虚拟驱动盘的盘符。如果盘符为“C”,则会有一段说明,提醒你硬盘可能不是FAT32分区或需要重新分区或需要查杀病毒。
由此可见为了判定虚拟驱动盘的盘符,微软的工程师们花费了多少周折。其实大可不必,动一动脑筋,我们发现只需在“autoexec.bat” 中加上几行代码,完全不必外调两个程序,即可顺利找到虚拟盘!笔者将“autoexec.bat”修改如下:
@ECHO OFF
set EXPAND=YES
SET DIRCMD=/O:N
if %1==z goto z
autoexec z y x w v u t s r q p o n m l k j i h g f e d c
:z
if not exist autoexec.bat goto ok
shift
%2:
goto z
:ok
set CDROM=%1
set RAMD=%2
set temp=c:
set tmp=c:
path=%RAMD%:;a:;%CDROM%:
copy a:command.com > NUL
set comspec=%RAMD%:command.com
copy a:extract.exe > NUL
copy a:
eadme.txt > NUL
:ERROR
IF EXIST a:ebd.cab GOTO EXT
echo Please insert Windows 98 Startup Disk 2
echo.
pause
GOTO ERROR
:EXT
extract /y /e /l %RAMD%: a:ebd.cab > NUL
echo The diagnostic tools were successfully loaded to drive %RAMD%.
echo.
IF “%config%”==”NOCD” GOTO QUIT
IF “%config%”==”HELP” GOTO HELP
LH MSCDEX.EXE /D:mscd001 /L:%CDROM%
echo.
GOTO QUIT
:HELP
cls
call help.bat
echo Your computer will now restart and the startup menu will appear.
echo.
restart.com
GOTO QUIT
:QUIT
echo To get help, type HELP and press ENTER.
echo.
rem clean up environment variables
set CDROM=
set LglDrv=
修改原第4-7行得到的这个批处理程序同样可以完成判定虚拟驱动盘和光驱盘符的任务,如果需要加上原“setramd.bat”的说明文字,则可在上述批处理文件的第13行“set RAMD=%2”后加上如下几行:
if “%RAMD%”==”C” goto c_drive
goto success
:c_drive
echo Windows 98 has detected that drive C does not contain a valid FAT or
echo FAT32 partition. There are several possible causes.
echo.
echo 1. The drive may need to be partitioned. To create a partition on the drive,
echo run FDISK from the MS-DOS command prompt.
echo.
echo 2. You may be using third-party disk-partitioning software. If you are using
echo this type of software, remove the Emergency Boot Disk and restart your
echo computer. Then, follow the on-screen instructions to start your computer from
echo a floppy disk.
echo .
echo 3. Some viruses also cause your drive C to not register. You can use a virus
echo scanning program to check your computer for viruses.
echo.
:success
这就将“setramd.bat”中的说明文字插入到新的批处理中去了。
新的批处理并没有对原文件的冗余代码进行压缩,只是换了一个角度实现一项任务,即省去了近10000比特的磁盘空间,省却了两个毫无必要的文件“setramd.bat”和“findramd.exe”,为“autoexec.bat”及其相关文件瘦身超过80%!如果对大量冗余代码进行精简,还可节省更多比特,最终文件长度可控制在1000字节以内。
WINDOWS没有公开源代码,我们无法考察整个WINDOWS的内核,相信如果仔细分析微软软件的源代码,我们会发现很多上述的例子,我想至少可以为WINDOWS 98节省30%以上的磁盘空间,同时大大提高WINDOWS 98的运行速度,且丝毫不会削弱其所有功能。
在这里笔者无意炫耀自己的批处理技巧,事实上笔者在编程上的技术还是很不成熟的,即使这样,笔者仍然发现了微软如此严重的程序“缺陷”。笔者更无意证明微软的软件工程师都是草包,世界级的软件人才都聚集在那里,我们没有任何理由去怀疑他们的技术水平。但是事情就是这样,微软的软件补丁越打越多,运行速度越来越慢。对于WINDOWS 98的任何一个附带应用程序,我们几乎都可以找到与之对应的,别的程序员编写的,功能类似或更强大,但却代码更紧凑、字节更少、运行速度更快的替代品。
笔者以为,这正是微软的市场策略使然。微软的任何一项产品的开发计划,都是将开发时间放在第一位。只要能测试通过,表面上看不到BUG,它就绝对不会将时间浪费在压缩冗余代码和节省用户的磁盘空间上。至于软件产品的品质,微软从来就认为其外在功能要比内在质量更重要。所以微软每一次产品的升级,都是功能上的升级。这一切导致的直接后果是,微软的产品总是走在别人前面,总能抢占市场至高点,不论是系统软件的升级还是应用软件的开发,微软都是以迅雷不及掩耳之势推向市场。WINDOWS操作系统、OFFICE办公软件的更新换代自是令人目不暇接,当网景以其Nascape浏览器逐步占领整个互联网市场时,微软更是以令人难以想象的速度开发出Internet Explorer,并以免费发送和捆绑销售的方式迅速挤跨Nascape。
强烈的市场意识,是微软至今称霸全球软件业的至胜法宝,这是从比尔·盖茨当初为IBM编写DOS时就已确立的。当他发现软件可以卖钱的时候,他的每一个步骤都是围绕市场在作业。当计算机硬盘的容量还很有限时,比尔·盖茨的DOS尚且会顾忌到用户的硬盘空间,每一行程序代码至少都相对紧凑;当硬盘容量以“百兆”和“G”为单位时,他再也不会为了节省用户的磁盘空间而去牺牲宝贵的市场机会了,尽管这影响了程序运行速度,但计算机硬件技术的突飞猛进使电脑CPU的处理速度越来越快、内存越来越充足,多少可以提高微软一系列冗长软件的运行效率。
反观国产软件,大多是功能强大、短小精悍、运行速度快、占用资源少的“优秀”软件,WPS 2000最小安装仅需8-9M空间,却具备了强大的图文混排、制表、数据处理等集成功能,CCED 2000更是只占用不足2M的磁盘空间囊括了WORD和EXCEL的大部分功能,FOXMAIL、超级解霸等软件同样是短且精,这样的例子不甚枚举。国产程序员常常为哪怕减少几个字节而伤透脑筋,若能在程序编写过程中发现一个更好的逻辑算法可以节省大量代码,他会为此兴奋不已。但是即使节省1M或者10M字节,对于几个G甚至十多G的硬盘空间来说有何意义呢?往往节省的是无谓的硬盘空间,浪费的是切入市场的最佳时机。
并不是说软件的质量不重要,一款软件产品其内在质量和外在功能是同样重要的。笔者亦不赞成微软那样完全不顾忌软件产品的内在质量,产品进入市场后BUG一个接着一个。但在保证软件产品没有原则性错误的前提下,程序编写是否更科学却不是质量范畴内的事。避开质量问题,微软在开发程序的思路上还是值得我们学习的。我们的程序员认为一段程序编写得越紧凑就越科学,内在的逻辑关系越强就越优秀;而微软则不这样认为,它不会为一段程序在不同的编写方式上做更多的比较,它可能更具随意性,它按照对程序的最初理解来编写,而不会更深入地去考虑别的编写途径,这可能会增加程序的长度,但却少用了更多的脑细胞,省去了更多的时间。所以我们不如说,在市场经济体制里,在激烈的竞争环境下,微软的编程思路可能更科学——如果它肯再花些时间捉虫子的话。
2000.6.18于深圳
分析WINDOWS%2098启动盘的一个批处理程序%20%20透视微软的市场策略 - 牛角尖 - 2000-06-21 10:13:53
太深奥了!玩文字游戏的我们怎么能看懂,不过我们这里的人认识很多ceo,给你推荐一下? 希望尽快看到你的下一篇升级版本。祝:好!