Board logo

标题: msdos710软盘启动以后自动调用硬盘上win98的方法探讨 [打印本页]

作者: dos时代菜鸟     时间: 2003-7-11 00:00    标题: msdos710软盘启动以后自动调用硬盘上win98的方法探讨
斑竹的msdos710启动盘很好用,但是如果要想运行硬盘上的windows98就需要手动进入windows98安装路径,运行之,小女子写了一个ndos的批处理程序用来自动调用硬盘中的win98.
工作原理如下:程序先找到c:\msdos.sys,然后通过循环方式对msdos.sys文件中的每一行文字进行一一排查,如果找到“WinDir=”语句,就将其设置为变量,并退出循环,根据windir的对应值找到win98的安装路径,并运行win98.

在此抛砖引玉,希望大家多多努力。这个程序也可以使用xset代替ndos完成。

其中涉及到的几个ndos内部函数如下:
%@lines 用于返回文件的行数
%@line 用于返回文件指定行的内容
%@len 用于返回字符串的长度
%@eval 用于返回+-*/运算的结果
%@substr 用于返回字符串起始位置开始的n个字符
%变量名称% 返回变量内容

要想在msdos710环境运行可以输入“ ndos /c loadwin ” 运行

loadwin.bat 程序内容如下:
*********************************************
@echo off
setlocal
if not exist c:\msdos.sys goto error
set x=%@lines
set y=0
:loop
set winx1=%@line
if %y%*==%x%* goto error
set l=%@eval-7]
set winx=%@substr
if #%winx%#==#WinDir# goto setdir
set y=%@eval
goto loop

:setdir
set winx2=%@substr
set winx3=%@substr
%winx3%
cd %winx2%
path %winx2%;%winx2%\command
set x=
set y=
set l=
set winx1=
set winx2=
set winx3=
set winx=
WIN /D:N
:error
echo ERROR ! windows_9x_Path unknowed !!!
echo 1.THERE IS NOT C:\MSDOS.SYS!
ECHO 2.C:\MSDOS.SYS can not load Windows9x!
ECHO Press any key to continue!
PAUSE>NUL
goto end
:end
endlocal
quit
***************************************************

作者: Wengier     时间: 2003-7-11 00:00
看了您的帖子,我刚才也自己写了一个FINDWIN.BAT批处理程序,专门用来在DOS下直接自动搜索硬盘上的所有的Win3.x/9x/Me(是不需windir变量的那种)。即使WIN.COM已被改名(我的就是),它也可以找到的呢~~这个批处理程序需要三个文件,分别是STRINGS.COM、XFIND.EXE,以及LOCATE.COM(这三个文件都已在我的MS-DOS 7.10启动盘中)。而且它在找到搜索结果后,结果如果发现硬盘中有多于一个WIN的话,会让用户进行选择合适的WIN以进入。不过,由于是自动搜索,所以搜索时速度当然还是有点儿慢呢。。以下是批处理的内容:

@echo off
set n=
set m=0
if exist verfiles.dat del verfiles.dat
if exist winfiles.dat del winfiles.dat
echo DOS-based Windows(Win3.x/9x/Me) Finder + Loader
echo.
echo Now searching for Windows on your hard drives...
locate win.ini /r /n /np > verfiles.dat
strings s=filesize verfiles.dat
if %s%==0 goto nowin
strings n=linesize verfiles.dat
strings n=add %n%,1
:loop
strings m=add %m%,1
strings s=read verfiles.dat,%m%
strings c=filedrive %s%
strings d=filedir %s%
xfind /C " ALT+ENTER " %c%%d%\*.com >> winfiles.dat
if %m%==%n% goto next
goto loop
:nowin
echo.
echo Warning: Can''''''''t find any possible Windows on your hard drives!
goto end
:wrong
echo Wrong input! Please reenter!
goto input
:next
strings n=linesize winfiles.dat
strings n=add %n%,1
set m=
strings m=sub %n%,10 > nul
if not %m%#==# echo Warning: Too many possible Windows found. Only first 9 will be shown.
if not %m%#==# set n=9
echo.
echo There are %n% possible Windows on your hard drives:
echo.
if %n%==1 strings s=read winfiles.dat,1
if %n%==1 goto start
set m=0
:read
strings m=add %m%,1
strings s=read winfiles.dat,%m%
echo %m%: %s%
if not %m%==%n% goto read
echo.
:input
set k=
set m=
echo Please enter the number of Windows you want to enter (1-%n%,ESC=Exit):
strings k=getkey
if %k%#==# goto end
if %k%==27 goto end
strings m=sub %k%,48 >nul
if %m%#==# goto wrong
if %m%#==0# goto wrong
set k=%m%
set m=
strings m=sub %n%,%k% >nul
if %m%#==# goto wrong
strings s=read winfiles.dat,%k%
if not exist %s% goto wrong
echo %k%
:start
strings c=filedrive %s%
strings d=filedir %s%
echo Now trying to start Windows from: %s%
pause
%c%
cd %d%
%s%
cd\
:end
echo.
echo Done.
echo.
if exist verfiles.dat del verfiles.dat
if exist winfiles.dat del winfiles.dat
set n=
set m=
set s=
set c=
set d=
set k=
rem Made by Wengier, China DOS Union. All rights reserved.

欢迎提出建议哦~~



作者: savioler     时间: 2003-7-11 00:00
好,研究一下先

作者: 如是大师     时间: 2003-7-11 00:00
wengier厉害。。

作者: yiyesong     时间: 2003-7-11 00:00
呵呵,今天提出来好象有点晚了吧。WENEIER写的太复杂。

作者: 电吉入侵     时间: 2003-7-11 00:00
说说我的意见:
上面的批处理我还没看懂呢....
我的是光盘启动, 启动win之后虚拟盘会消失, 所以用启动盘启动不了win; 现在看到你们的帖, 我想可不可以这样呢: 用户肯定知道机器上有没有win ,先检查C 盘根目录有没有msdos.sys ,如果有就从那里调用启动win ,如果没有就搜索win 在那个盘(一般在C 盘, 多系统可以在D \E) ;然后根据win 的位置, 创建一个适合的msdos.sys ,再调用启动...

这样也适合修复硬盘上的win 启动, 大家给点意见吧....

作者: Wengier     时间: 2003-7-11 00:00
以下是引用yiyesong在2003-7-11 13:44:32的发言:
呵呵,今天提出来好象有点晚了吧。WENEIER写的太复杂。


YYS的特别版的启动盘中的那个在我的电脑上根本无法成功,是乱码后死机,只好按Ctrl+Alt+Del键重启。而且YYS的那个程序的局限性太大(完全依赖于LOCATE很不好),只支持Win98SE的中文版(其实我的系统中也有Win98SE的中文版,但它搜索时却总是死机)。所以我刚才自编了一个。

作者: yiyesong     时间: 2003-7-11 00:00
WENGIER,你说的对,我那个批处理只为WIN98SE设计的,包括OEM版和零售版。因为现在用WIN3X和WIN98第一版已经很少了。我用DOS,但从不用WIN3X和WIN98第一版。如果要支持后二者,只要把LOCATE条件放宽就行了。
如果你是用我的启动盘启动的,出现乱码和死机只有一种可能,就是你在启动WIN98时把启动盘取出了。






作者: Wengier     时间: 2003-7-11 00:00
以下是引用yiyesong在2003-7-11 21:29:18的发言:
WENGIER,你说的对,我那个批处理只为WIN98SE设计的,包括OEM版和零售版。因为现在用WIN3X和WIN98第一版已经很少了。我用DOS,但从不用WIN3X和WIN98第一版。如果要支持后二者,只要把LOCATE条件放宽就行了。
如果你是用我的启动盘启动的,出现乱码和死机只有一种可能,就是你在启动WIN98时把启动盘取出了。


没有!我没有把启动盘取出!是一直放在软驱中的。

LOCATE的条件放宽并非那么容易的,因为WIN.COM的大小和时间是可以随意更改的。比如说,如果我把WIN.COM中的内嵌LOGO换一个的话(就像我们做的MiniWin3.x就是这样的),那它的大小和时间就完全变了;而且,各种国际语言版本的WIN.COM的大小和时期也并非相同,这些就绝不是LOCATE所能处理的了。而且,那个功能不支持硬盘中有多个WIN的情况下进行手工选择。而我上面的那个批处理则都能完成。



作者: Wengier     时间: 2003-7-13 00:00
以下是引用电吉入侵在2003-7-11 14:06:30的发言:
说说我的意见:
上面的批处理我还没看懂呢....
我的是光盘启动,  启动win之后虚拟盘会消失,  所以用启动盘启动不了win;  现在看到你们的帖,  我想可不可以这样呢:  用户肯定知道机器上有没有win ,先检查C 盘根目录有没有msdos.sys ,如果有就从那里调用启动win  ,如果没有就搜索win 在那个盘(一般在C 盘, 多系统可以在D \E) ;然后根据win  的位置,  创建一个适合的msdos.sys ,再调用启动...

这样也适合修复硬盘上的win 启动, 大家给点意见吧....


哪些地方还没有看懂呢?
大家倒可以对我上面编的那个批处理文件加入更多的功能,以进行进一步的完善呢。。

作者: Roy     时间: 2003-7-13 00:00
還有一項是不能忽略的,是排除"啟動"Windows NT/2000/XP的功能.
大家是知道,Windows NT/2000/XP都是有win.com的,可是這個win.com不能被MS-DOS所執行,而是被NTLDR執行的.

作者: Wengier     时间: 2003-7-13 00:00
以下是引用Roy在2003-7-13 8:49:01的发言:
還有一項是不能忽略的,是排除"啟動"WindowsNT/2000/XP的功能.
大家是知道,WindowsNT/2000/XP都是有win.com的,可是這個win.com不能被MS-DOS所執行,而是被NTLDR執行的.


是呀。。我上面的那个批处理就能自能排除WinNT/2K/XP的“假”WIN.COM的,而只搜索Win3.x/9x/ME的。(说明:我的硬盘上既有Win3.x,又有Win9x,又有WinME,又有Win2K,用它自动搜索的效果就很理想的。。)


作者: 电吉入侵     时间: 2003-7-13 00:00
我在多重启动的光盘上怎样也启动不了win98 , 用软盘和单重启动光盘就可以; 但单重光盘启动后软驱里有一个虚拟软盘, 用不了真软驱了....

大家有没有办法在多重启动光盘上实现启动win9X呢?

作者: 电吉入侵     时间: 2003-7-13 00:00
Wengier 你不是说只要有

WinBootDir=.

就可以了吗? 但我的不行啊一定要

WinDir=a:\
WinBootDir=.
HostWinBootDrv=a

才可以啊, 为什么?


作者: Wengier     时间: 2003-7-14 00:00
以下是引用电吉入侵在2003-7-13 19:52:55的发言:
Wengier你不是说只要有

WinBootDir=.

就可以了吗?但我的不行啊一定要

WinDir=a:\
WinBootDir=.
HostWinBootDrv=a

才可以啊,为什么?


那是因为没有windir项时,系统启动时将不自动加载IFSHLP.SYS文件的原因吧。。这时手工在命令行上加载就行了,例如用DEVICE/DEVLOAD/ADDEV命令。然后再WIN就一切OK了。或者加入windir当然也行。而HostWinBootDrv通常则完全不需要,除非有DBLSPACE/DRVSPACE之类的磁盘压缩程序。



作者: Wengier     时间: 2003-7-15 00:00
以下是引用电吉入侵在2003-7-13 19:41:26的发言:
我在多重启动的光盘上怎样也启动不了win98  , 用软盘和单重启动光盘就可以; 但单重光盘启动后软驱里有一个虚拟软盘,  用不了真软驱了....

大家有没有办法在多重启动光盘上实现启动win9X呢?


不是说是虚拟机的问题吗?

作者: 电吉入侵     时间: 2003-7-16 00:00
我知道了, 谢谢Wengier!

对了, 我昨天一天上不了论坛啊; 我以为是论坛空间出了问题,你怎么能回帖呢?
现在用的空间是哪里的呢? 唉!对于聯盟, 我还真不知道可以帮得了什么呢.....

顺便问一下, 有没有关于返回值的文章介绍呢? 就是用IF ERRORLEVEL 的时候用的. 我搞不懂啊, 是不是所有程序的返回值都是作者设的? 如执行成功了不成功等...



作者: dos时代菜鸟     时间: 2003-7-20 00:00
Wengier 的bat不错嘛,我这几天由于很忙,没有来,没想到大家这么关心这个话题耶