当前位置:技 术首页 >> 编程相关 >> 自己编程实现多引导的方法讲解
自己编程实现多引导的方法讲解 (2)
2008-02-10 12:59:34  作者:  来源:互联网  浏览次数:2  文字大小:【】【】【
  •    如果你是一个计算机用户相信你一定安装过操作系统,当你用久了一个操作系统,你可能会安装一个新的操作系统,但你往往希望保留现在的操作系统。比如当你有了一个windows98,你可以在上面再安装windows2K或是 ...
系统引导之前获得执行权,从而实现多引导。因为这是个扇区程序,有别于一般的程序文件,其格式类似于COM文件,在此我是采用DEBUG程序,从EXE文件中提取的方法来实现的,源程序如下:
;多引导程序(SYSGUIDE.DAT),需要从以下源程序(模块一)产生的程序文件中提取
CODE SEGMENT
   ASSUME CS:CODE,DS:CODE,ES:CODE ;这一段是将整个硬盘锁从0000:7c00移至0000:0600,以免被后来读入的代码覆盖
START:
db    256 dup (00h)
PUSHDS                                
PUSHES                                
MOVCX,0100h                            
MOVDI,0600h                            
MOVAX,0000h                            
MOVDS,AX                              
MOVES,AX                              
MOVSI,7C00h                            
REPNZ  MOVSW                                  
mov   ax,0686h
JMPax  ;长跳转至移动后的代码,也就是从screen处开始执行  
words  db 'Please choose the partition for guide.'
     db 10 dup (20h)
     db '(1)partition 1;(2)partition 2;(3)partition 3;(4)partition 4;',00h
screen:
     MOVAX,0600h                            
     MOVBH,0F0h                              
     MOVCX,0000h                            
     MOVDX,184Fh                            
     INT10h        ;初始化屏幕(前景为黑色,背景为灰白,字符闪烁)                        
     MOVDL,1Ah                              
     MOVSI,0619h     ;从0619H处显示字符(因为程序将被读入了0000:0600处,
                      ;实际显示的也就是现在的words处开始的字符串)        

DISPLAY:
    MOV AH,02H
    MOV DH,10H    
    MOV BH,00H
    INT 10H
    MOV AL,[SI]
    CMP AL,00H
    JE readMBS
    MOV AH,09H
    MOV CX,01H
    MOV BH,00H
    MOV BL,70H
    INT 10H      
    INC DL
    INC SI
    JMP DISPLAY
readMBS:
MOVAX,0201h                            
MOVCX,0001h                          
MOVDX,0080h                          
MOVBX,1000h                            
INT13h             ;将主引导区(即本SYSGUIDE.DAT)读出到0000:1000H处
 MOV ax,0201h                            
 MOV cx,0006h       ;读0 0 6扇,(即原来的MBS)                    
 MOV dx,0080h                            
 MOV bX,07C00h                          
 int 013h
readkey:
MOV AH,00H
INT 16H
CMP AL,'1'        ;是1么?
JE  number1
CMP AL,'2'
JE  number2
CMP AL,'3'
JE  number3
CMP AL,'4'
JE  number4
jmp readkey
number1:
 db 0a0h,0c2h,11h     ;相当于mov al,[011c2h],因为用mov al,[011c2h]不能编译
 cmp al,00h
 je  error1
 cmp al,05h
 je  error1
 cmp al,0fh
 je  error1
 mov ah,080h
 db 88h,26h,0beh,11h   ;相当于mov [011beh],ah
 mov ah,00h
 db 88h,26h,0ceh,11h      ;mov [11ceh],ah
 db 88h,26h,0deh,11h      ;mov [11deh],ah
 db 88h,26h,0eeh,11h      ;mov [11eeh],ah
 jmp ok
number2:
 db 0a0h,0d2h,11h      ;mov al,[11d2h]            
 cmp al,00h
 je  error1
 cmp al,05h
 je  error1
 cmp al,0fh
 je  error1
 mov ah,80h
 db 88h,26h,0ceh,11h  ;mov [11ceh],ah
 mov ah,00h
 db 88h,26h,0beh,11h  ;mov [11beh],ah
 db 88h,26h,0deh,11h  ;mov [11deh],ah
 db 88h,26h,0eeh,11h  ;mov [11eeh],ah
 jmp ok
 
error1:
 jmp readkey
               
number3:
 db 0a0h,0e2h,11h     ;mov al,[11e2h]
 cmp al,00h
 je  error1
 cmp al,05h
 je  error1
 cmp al,0fh
 je  error1
 mov ah,80h
 db 88h,26h,0deh,11h  ;mov [11deh],ah
 mov ah,00h
 db 88h,26h,0beh,11h  ;mov [11beh],ah
 db 88h,26h,0ceh,11h  ;mov [11ceh],ah
 db 88h,26h,0eeh,11h  ;mov [11eeh],ah

 jmp ok
number4:
 db 0a0h,0f2h,11h     ;mov al,[11f2h]
 cmp al,00h
 je  error1
 cmp al,05h
 je  error1
 cmp al,0fh
 je  error1
 mov ah,80h
 db 88h,26h,0eeh,11h  ;mov [11eeh],ah
 mov ah,00h
 db 88h,26h,0ceh,11h  ;mov [11ceh],ah
 db 88h,26h,0deh,11h  ;mov [11deh],ah
 db 88h,26h,0beh,11h  ;mov [11beh],ah
 jmp ok
ok:
 mov   ax,0301h
 mov   cx,0001h
 mov   dx,0080h
 mov   bx,1000h
 int   13h           ; 将改变了引导标示的分区表,写回0 0 1扇  
MOVCX,040h                            
MOVDI,7dbeh                            
MOVSI,11beh                            
REPNZ  MOVSW                                
 MOV ax,0301h                            
 MOV cx,0006h       ;将改变了引导标示的分区表,写回0 0 6扇                    
 MOV dx,0080h                            
 MOV bX,07C00h                          
 int 013h
 MOV   bx,7c00h     ;交执行权给0000:7C00处
 JMP bx   ;长跳转至原MBR代码处执行 CODE ENDS
   END START
代码到此就讲完了,程序本身不复杂,只要你了解了实现原理,在实现时才会得心应手,好了,赶快把我们的源代码编译链接一下,把模块二得到的程序取名为SYSGUIDE.EXE,从模块一所得的程序中提取出我们要的程序取名叫SYSGUIDE.DAT,提取方法如下:
1、在DOS方式下,输入“DEBUG GUIDE.EXE”,其中GUIDE.EXE是我们用模块一得到的程序文件(在此强烈警告千万不要运行这个GUIDE.EXE程序),
2、在DEBUG提示符下输入:R CX(回车) 1BD(回车) N(回车) SYSGUIDE.DAT(回车)  W(回车)Q(回车)。这样你就会发现在你当前的目录中就有了一个名为SYSGUIDE.DAT的文件,着就是我们将用来写入硬盘第一扇区的扇区程序文件了,赶快把它和SYSGUIDE.EXE文件拷贝到一个文件夹下吧。
好了,我们要的程序已经得到了,就让我们来用用看,在我们最后安装的WIN98中执行吧,当看到以下提示时,键入数字键“1”。
'Please choose the number (1)Install the SYSGUIDE                
(2) Delete the SYSGUIDE
然后重新启动,怎么样,是不是看到了引导选择提示?不过界面是不太好看了^_^,但是没什么,毕竟这是我们自己写的多引导程序哦!好了,我们选择“1”试试,是不是进了我们先前安装的WINXP?然后重新启动,再选择“2”试试,是不是进了我们后来安装的WIN98了!
对了我们好象还有一个BOOTMAGIC的功能没有实现哦,就是程序自动识别操作系统的功能,我想这个功能就留到我们读者自己去扩充吧!我在这大致的说明一下原理,又回到我们的表3,看到其中偏移04的那个字节么?其实BOOTMAGIC就是利用了这个原理来实现智能化的识别操作系统的,那具体要怎么做呢?我不说,自己去想^_^。

到了说886的时候了,再写下去编辑可不会用了哦!就这样吧,有兴趣来讨论,联系方法到我的源程序中找。程序可以到http://lsky.net/download/soft.asp?id=35下载。
该文在<<黑客X档案>>增刊上发表,如有转载请注明WWW.LSKY.NET(天龙在线),作者

0

顶一下

0

踩一下
[1] [2] [3]
相关文章
    {tag_首页栏目_经典案例}
    {tag_首页栏目_技术文章}