无忧启动论坛

标题: dos下判断光驱盘符的大概原理学习 [打印本页]

作者: yjqd    时间: 2016-10-15 18:06
标题: dos下判断光驱盘符的大概原理学习
dos下判断光驱盘符所用批处理: AUTOEXEC.BAT和SETRAMD.BAT
所用文件:OAKCDROM.SYS ramdrive.sys(这两个文件在CONFIG.SYS中加载) findramd.exe(在SETRAMD.BAT)

了解一下%1这样的参数的定义,就明白了为什么要用两个批处理,同时要了解shift的用法
findramd.exe是用来判断是否存在虚拟磁盘,并返回一个值,这个值如果和AUTOEXEC.BAT中的LglDrv中的某一个数字相等,那么某一个数字后面的字母就是虚拟磁盘的盘符
判断光驱盘符其实是间接判断的,是判断了虚拟磁盘盘符同时就判断出了光驱盘符

AUTOEXEC.BAT:
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
这两段内容可以写成:
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  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

除了27 *以外,都1个数字后跟1个字母,数字是用来和findramd.exe运行后的返回值比较,字母就是表示盘符

set LglDrv=后面的内容
为什么要倒着排列,是因为要判断光驱,根据dos分配盘符规则,光驱盘符是在虚拟磁盘盘符后的一个盘符
为什么要27 *这组数,如果不要27 *这组数,SETRAMD.BAT中两次shift执行下来,%2所对应的字母是Y,而虚拟磁盘盘符有可能是Z
为什么25后是Y 24后是X... 这可能跟 findramd.exe有关
---------------------------------------------------------------------------------------------
SETRAMD.BAT:
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

%1对应的是AUTOEXEC.BAT中的LglDrv中的数字  %2对应的是字母
先设置光驱盘符为%2, if条件循环配合shift使得%1和%2的参数值不断变化,当%1和findramd的返回值相等时就跳出循环,去设置虚拟磁盘的盘符
当%1和findramd的返回值相等时,shift前面的%2就是光驱的盘符,后面的%2就是虚拟磁盘的盘符

作者: vaf    时间: 2016-10-15 20:22
坐像个沙发吧




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3