|
|
15天的SETUPLDR.BIN问题解决啦!!!
发信人: peach (IDLE), 信区: NewSoftware
标 题: mulwin引导程序源代码
发信站: BBS 水木清华站 (Fri Aug 3 15:16:52 2001)
其实这个程序做的工作不多
用了不少的技巧
引导的工作不全是由自己来完成的
我简单说一下是如何工作的
首先
真正的引导程序还是win2k引导光盘的引导
这个引导程序启动时会先装入bootfix.bin
然后执行这段代码
这段代码的工作就是显示“Press any key to boot from CD-Rom...”
如果5秒内无键按下
系统将会从硬盘启动
如果用户按下一个键的话
控制权会返回给原2k引导
这时候2k引导会装入setupldr.bin
并将控制权完全交给段代码
我写的就是这个setupldr.bin
得到控制权后显示菜单,得到用户选择,然后再继续引导
这个setupldr.bin使用了原2k引导的代码
所以必须将自己复制到原2k此导代码的空间,使用同一代码段段址
至于从软盘映象启动,我写的代码没有做任何工作,完全是得到用户选择
然后将选择告诉diskemu.bin,再由diskemu.bin引导
源代码如下
.286
cseg segment
assume cs:cseg, ds:cseg,ss:cseg
;==========================================================
; 预留出0x800字节空间,这部分空间的内容将会是原
; win2k引导,以下的标号都是原win2k引导中的函数入口
; 或变量
;==========================================================
org 0h
bstart:
org 79h
LoadErr:
org 2bah
ReadDisk: ; 读光盘函数
org 3dch
LoadFile: ; 装载文件
org 499h
BootDrv db ?
org 800h
;==========================================================
; 本引导的入口,从此处已经得到引导控制权
; 首先要做的工作是将自己复制到原2k引导尾部
; 然后再继续引导工作
;==========================================================
start:
mov ax, cs ;将自己复制到07c0:800h处,然后跳转过去继
续执行
mov ds, ax
mov ax, 07c0h
mov es, ax
mov di, 800h
xor si, si
mov cx, 800h
cld
rep movsb ; 复制结束,然后远跳至es:begin处
push es
push offset begin
retf ;
Win2KVer db "PSA"
DiskEmuFile db "DISKEMUL.BIN"
SetupLdrFile db "SETUPLDR.BIN"
disknum db 0
version db 0
menu db 02, 01h, "Multi Windows Opration System Installation
Boot Menu", 0dh, 0ah, 0
db 02, 02h, 52 dup(205), 0dh, 0ah, 0
db 06, 04h, "A. Microsoft Dos6.22", 0dh, 0ah, 0
db 06, 05h, "B. Windows 98 Second Edtion [CHS]
[TBPVQ-J7R2B-MMXWY-V66HG-YTCFD]", 0dh, 0ah, 0
db 06, 06h, "C. Windows Millennium [CHS]
[K9KDJ-3XPXY-92WFW-9Q26K-MVRK8]", 0dh, 0ah, 0
db 06, 07h, "D. Win2K Professional SP2 [ENU]
[PQHKR-G4JFW-VTY3P-G4WQ2-88CTW]", 0dh, 0ah, 0
db 06, 08h, "E. Win2K Server SP2 [ENU]
[H6TWQ-TQQM8-HXJYG-D69F7-R84VM]", 0dh, 0ah, 0
db 06, 09h, "F. Win2K Advanced Server SP2 [ENU]
[H6TWQ-TQQM8-HXJYG-D69F7-R84VM]", 0dh, 0ah, 0
db 06, 0ah, "G. Win2K Professional SP2 [CHS]
[PQHKR-G4JFW-VTY3P-G4WQ2-88CTW]", 0dh, 0ah, 0
db 06, 0bh, "H. Win2K Server SP2 [CHS]
[H6TWQ-TQQM8-HXJYG-D69F7-R84VM]", 0dh, 0ah, 0
db 06, 0ch, "I. Win2K Advanced Server SP2 [CHS]
[H6TWQ-TQQM8-HXJYG-D69F7-R84VM]", 0dh, 0ah, 0
db 04, 0eh, "Please choose your favorite to install, or
type esc to boot from HD.", 0dh, 0ah, 0
db 04, 10h, "If your have got some problem or have some
good suggestions, please contact with me", 0dh, 0ah, 0
db 27h, 12h, "AUTHOR : peach@SMTH", 0dh, 0ah, 0
db 30h, 13h, "[peach@sparrows.dhs.org]", 0dh, 0ah, 0
db 0ffh, 0ffh
LoadFileErr db "Couldn't Load Setup Loader...", 0dh, 0ah,
"Press ENTER to retry, and ESC back to main menu.", 0dh, 0ah, 0
nobootablehd db "No bootable HD, press any key back to main
menu.", 0dh, 0ah, 0
wrongcd db "Wrong disk!", 0dh, 0ah, "Please insert the
disk with label MULWIN_CD"
dnum db "1 into CDROM.", 0dh, 0ah
db "And press ENTER to continue, or ESC back to
main menu", 0dh,0ah, 0
;==========================================================
; 远程跳转至此处
; 此时,引导程序已经在原2k引导的尾部了
; 继续引导工作
;==========================================================
begin:
mov ax, cs
mov ds, ax
mov es, ax
mov bh, 17h
call clearbuf ; 清键盘缓冲,因为bootfix的原故,有可能键盘缓
冲区内
; 仍有键
showmenu: ;显示主菜单
mov bh, 17h
call clrscn
mov si, offset menu
showlp:
cmp word ptr [si], 0ffffh
je getkeylp
mov dx, [si]
call setcurpos
add si, 2
call showmsg
jmp showlp
getkeylp: ;获得用户选择
xor ax, ax
int 16h
cmp al, 1bh
je l_bootfromhd ; 用户按下ESC,从硬盘启动
and al, 0dfh
cmp al, 41h
jl getkeylp
cmp al, 44h
jl bootdos ; 前三项都是从软盘映象启动
cmp al, 49h
jg getkeylp
jmp bootwin2k ; 后六项都是启动win2k
l_bootfromhd:
jmp bootfromhd
;==========================================================
; showmsg 显示字符串
; 入口:
; ds:si 字符串地址
; bl 颜色属性
;==========================================================
showmsg proc
mov al, [si]
inc si
cmp al, 0
jz exitshowmsg
mov ah, 0eh
int 10h
jmp showmsg
exitshowmsg:
ret
showmsg endp
;==========================================================
; clrscn 清屏函数
; 入口:
; bl 背景色
;==========================================================
clrscn proc
mov ax, 0600h
mov cx, 00
mov dx, 2479h
int 10h
ret
clrscn endp
;==========================================================
; clearbuf 清键盘缓冲区
;==========================================================
clearbuf proc
mov cx, 80h
mov ah, 1
int 16h
jz exitclear
mov ah, 0
int 16h
loop clearbuf
exitclear:
ret
clearbuf endp
;==========================================================
; setcurpos 设置光标位置
; 入口:
; dh 行
; dl 列
;==========================================================
setcurpos proc
mov ax, 0200h
mov bx, 0
int 10h
ret
setcurpos endp
;==========================================================
; 从软盘映象启动
; 这部分代码实际是使用diskemu.bin启动
; 所做的工作就是装入diskemu.bin
; 然后将用户的选择写入第0个字节
; 再跳到diskemu.bin的入口
;==========================================================
bootdos:
inc ax
push ax
push offset DiskEmuFile
push 0ch
push 5000h
call LoadFile ; 把diskemu.bin装入到5000:0000处
jb CannotLoadFile
add sp, 6
mov ax, 5000h ;跳转执行
mov es, ax
pop ax
mov es:[0], al ; 用户选择写至5000:0000处
push es
push 46ah
retf ; 跳至diskemu.bin的入口
CannotLoadFile:
add sp, 8h
mov si, offset LoadFileErr
call showmsg
jmp getkeylp2
;==========================================================
; 引导win2k
; 此处仍使用原2k引导,但是由于setupldr.bin在
; 其他三个目录ibta, ibts, ibtp
; 所以要先算出是哪个版本的win2k
; 然后修改原2k引导的目录数据,再用原2k引导
;==========================================================
bootwin2k:
sub al, 44h ;算出安装什么语言版本及adv,
svr, pro
mov dl, 3
and ax, 0ffh
div dl
mov word ptr disknum, ax
mov byte ptr dnum, al
add byte ptr dnum, 31h
mov bh, 17h
call clrscn
mov dx, 0
call setcurpos
ReadCD:
push offset SetupLdrFile
push 0ch
push 1080h
call LoadFile
add sp, 6
mov ax, 1000h
mov es, ax
mov al, byte ptr dnum
cmp al, byte ptr es:dnum
jne wrongdisk
mov di, offset win2kver ;正确,则装载相应的setupldr.
bin
mov al, byte ptr version
and ax, 00ffh
add di, ax
mov al, [di]
mov byte ptr ds:[498h], al ; 修改启动目录
mov byte ptr ds:[497h], 'T' ;
mov byte ptr ds:[496h], 'B'
mov dl, BootDrv
db 0EAh, 00,7Ch, 00, 00
WrongDisk:
mov si, offset wrongcd
call showmsg
getkeylp2:
xor ax, ax
int 16h
cmp al, 1bh
je exitbootwin2k
cmp al, 0dh
je readcd
jmp getkeylp2
exitbootwin2k:
jmp showmenu
;==========================================================
; 从硬盘启动
; 读入硬盘0扇区内容,然后引导
;==========================================================
bootfromhd:
mov ax, 07c0h
mov es, ax
mov bx, 0000h
mov ax, 0201h
mov cx, 0001h
mov dx, 0080h
int 13h
jnb callhd
mov si, offset nobootablehd
call showmsg
jmp showmenu
callhd:
mov dl, 080h
db 0EAh, 00,7Ch, 00, 00
org 1000h
endss:
cseg ends
end start
--
※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.172.127]
|
|