申请会员ID:SuuXaxLZtQDNxLR
1、申请ID:SuuXaxLZtQDNxLR2、个人邮箱: 610644034@qq.com
3、原创技术文章
由于以前的账号太久没有登陆,现在已经找不回了,想重新注册,希望看到申请的管理员帮个忙。
一、原创技术文章 https://bbs.kanxue.com/thread-212994.htm
二、翻了一下硬盘,就地发个以前自己撸的源码,由于没有上传附件的权限,整个项目包括一个VB修改MBR工具源码没有办法上传,所以就核心源码直接发:
功能: 多分区选择引导启动 MBR
描述: MBR 引导显示 Enter 1 2 3 4 Load Dbr: 的时候输入数字从对应主分区引导启动系统。
asm 文件源码如下:
data segment
data ends
stack segment
stack ends
code segment
assume cs:code,ds:data,ss:stack
start:
;寄存器环境准备
xorax,ax; 准备寄存器 33 C0
movss,ax; 准备堆栈段寄存器 8E D0
; 33 C0 8E D0 给出MBR特征码提供搜索MBR程序,提取MBR用
sti; 允许中断 FB
;=====================================================================================================================
movsp, 07C00h; 准备堆栈寄存器BC 00 7C
movsi, sp; mbr 准备复制的源地址 8B F4
movdi, 0600h; mbr 准备复制的目的地址 BF 00 06
push ax; 50
movcl , 0; B1 00 正好在 0fh 偏移量位置,方便以后查找和修改 ******************
popes; 准备代码段寄存器 07
push ax; 50
popds; 准备数据段寄存器 1F
cld; rep 指令si di 自加1FC
;起始代码不变
;=====================================================================================================================
;准备寄存器环境
;cl 为 原始MBR的扇区号
;sp 7C00h
;si 7C00h
;di 0600h
;ax 0
;bp 指向 0600h 的分区表
;bx 指向 07C00h 的分区表
;dl 为 BIOS 环境磁盘驱动器 号
;每次 pusha popa 都恢复这个环境
mov bp ,00600h + 01beh ; bp 指向 00600h 的分区表
mov bx ,07C00h + 01beh ; bx 指向 07C00h 的分区表
db 1h dup(60h); pusha 寄存器全部保存 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
;------------------------------------------------
;修正 FAT32 引导扇区号 + 6
;mov bp , bx
;mov cl , 4
Scan_Set_DPT_Fat32_Boot_Loop:
; cmp byte ptr , 0efh; fat32 分区标识
; jz Scan_Set_DPT_Fat32_Boot_SetFat32 ;
; cmp byte ptr , 0bh; fat32 分区标识
; jz Scan_Set_DPT_Fat32_Boot_SetFat32 ;
; cmp byte ptr , 0ch; fat32 分区标识
; jnz Scan_Set_DPT_Fat32_Boot_Check_byte1 ;
Scan_Set_DPT_Fat32_Boot_SetFat32:
; add byte ptr , 6 ; fat32 分区引导扇区在分区第6扇区 + 6
; add byte ptr , 6 ; fat32 分区引导扇区在分区第6扇区 + 6
; adc byte ptr , 0 ; fat32 分区引导扇区在分区第6扇区
Scan_Set_DPT_Fat32_Boot_Check_byte1:
; add bp, 10h
;loop Scan_Set_DPT_Fat32_Boot_Loop;
;------------------------------------------------
;拷贝MBR 从 07C00h 到 0600h
movcx,200h;复制的字节数
rep movsb; 复制 mbr 拷贝 ds:si 到 es:di上,长度为cx
;也就是将MBR从07C00h处拷贝到 0600h,长度为200h 即512字节
;------------------------------------------------
;跳转到 0600h 的 Check_F_Mbr: 执行
db 6Ah,00h ; push word 00h
movsi , offset Check_F_Mbr - offset start + 00600h
push si
retf; 跳转到 0600h 的 Check_F_Mbr:执行
;=====================================================================================================================
Check_F_Mbr: ;检查没有 原始MBR
db 1h dup(61h); popa寄存器全部恢复 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
db 1h dup(60h); pusha 寄存器全部保存 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
cmp cl , 0; cl 原始MBR 的扇区号
jne Load_Boot_Mbr; 有 原始MBR
;------------------------------------------------
Look_Boot_Dbr: ;寻找活动分区启动
movcx , 4 ;
Look_Boot_Dbr_Loop:
cmp byte ptr , 0; 判断分区活动状态
jlLook_Boot_Dbr_Read_Dbr;
add bp , 010h;
Loop Look_Boot_Dbr_Loop
;-----------------------------------------------
Error_Boot:
hlt ;处理器暂停
jmp Error_Boot ;
;-----------------------------------------------
Look_Boot_Dbr_Read_Dbr:
call Read_Disk_Proc ;
jb Error_Boot ;读扇区失败
cmp word ptr[ si + 510 ] , 0aa55h
jneError_Boot ;读扇区没有55aa标志
db 1h dup(61h) ; popa寄存器全部恢复 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
db 6Ah,00h ; push word 00h
push si;
retf;
;-----------------------------------------------
Load_Boot_Mbr: ;加载原始mbr
xor ch , ch;
mov word ptr , 00080h;
mov , cx;
mov , ax;
inc cl
mov , cx;
call Read_Disk_Proc;读原始MBR扇区
jbError_Boot;
db 1h dup(61h); popa寄存器全部恢复 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
db 1h dup(60h); pusha 寄存器全部保存 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
cmp word ptr[ si + 510 ] , 0aa55h
jneError_Boot ;读扇区没有55aa标志
movbp , bx
movcx , 4 ;
Cel_DPT_Boot:
movbyte ptr , 0; 取消所有分区活动状态
addbp , 010h
Loop Cel_DPT_Boot
Boot_Loop:
;-----------------------------------------------
mov si , offset init_msg - offset start + 0600h;
mov cx , 019h;
Show_Char_A: ;循环显示一个字符
lodsb;
mov bx, 7;
mov ah, 0Eh;
int 10h;
loop Show_Char_A;
;-----------------------------------------------
xor ax,ax;
int 16h;捕捉键盘输入
cmp al,'1';
jeBoot_Tab ;键盘输入 1 跳到0分区表项引导
cmp al,'2';
jeBoot_Tab ;键盘输入 2 跳到1分区表项引导
cmp al,'3';
je Boot_Tab ;键盘输入 3 跳到2分区表项引导
cmp al,'4';
jne Boot_Loop; 键盘输入 4 跳到3分区表项引导 否则重新提示输入
;-----------------------------------------------
;捕捉到键盘输入(1/2/3/4键)后定位对应的分区表位置
Boot_Tab:
push ax;
movbx, 7 ; 显示键盘输入
movah, 0Eh
int10h;
popcx ; cl 获取键盘输入码
subcl , '1';
moval , 10h;
mulcl ; ax 为 选中分区表项的 分区表偏移量
movbp , ax;
addbp , 7C00h + 01beh;
movbyte ptr , 080h; 设置选中分区活动状态
db 1h dup(61h); popa寄存器全部恢复 si 7C00h 、di 0600h 、bp 指向 00600h 的分区表 、bx 指向 07C00h 的分区表 、ax 0 、 cl 为原始mbr扇区号、dl 为 BIOS 环境磁盘驱动器 号
db 6Ah,00h ; push word 00h
db 68h,00h,7Ch ; push word 7C00h
retf;
; ---------------------------------------------------------------------------
;参数 bp 指向 分区表项 DPT , 返回 jnb 到读取成功处理
Read_Disk_Proc:
; ---------------------------------------------------------------------------
mov byte ptr , 5
mov , dl
Read_Disk_Mode_Sel: ;选择扇区读寻址方式
db 1h dup(60h); pusha 寄存器全部保存
call Disk_Read_Sel_Mode
db 1h dup(61h); popa 寄存器全部恢复
db 1h dup(60h); pusha 寄存器全部保存
jb Disk_Read_SHS
Read_Disk_LBA: ;LBA 方式区读寻址方式
db 6Ah,00h ; push word 00h
db 6Ah,00h ; push word 00h
push word ptr
push word ptr
db 6Ah,00h ; push word 00h
db 68h,00h,7Ch ; push word 7C00h保存数据地址
db 6Ah,01h ; push word 01h 读多少扇区
db 6Ah,10h ; push word 010h
mov ah, 42h ;
mov dl,
mov si, sp
int 13h
lahf
add sp, 10h
jmp Disk_Read_Check_Exit
; ---------------------------------------------------------------------------
Disk_Read_SHS: ;SHS 方式区读寻址方式
mov ax, 201h ; al 读多少扇区
mov bx, 7C00h ; 保存数据地址
mov dl,
mov dh,
mov cl,
mov ch,
int 13h
lahf
Disk_Read_Check_Exit:
call Disk_Read_Reset;
db 1h dup(61h); popa 寄存器全部恢复
sahf
jnb Disk_Read_On
dec byte ptr
jnz Disk_Read_Check_Exit_Error
cmp byte ptr , 80h
jz Disk_Read_Check_Exit_Error
mov byte ptr , 80h
jmp Read_Disk_Mode_Sel
; ---------------------------------------------------------------------------
Disk_Read_Check_Exit_Error:
stc;
Disk_Read_On:
retn;
; ---------------------------------------------------------------------------
Disk_Read_Sel_Mode: ;获取磁盘寻址模式
push bp
mov dl,
mov ah, 8
int 13h
pop bp
jb Disk_Read_Sel_Mode_SHS
mov dl,
mov bx, 55AAh
mov ah, 41h
int 13h
jb Disk_Read_Sel_Mode_SHS
cmp bx, 0AA55h
jnz Disk_Read_Sel_Mode_SHS
test cl, 1
jnz Disk_Read_Sel_Mode_LBA
Disk_Read_Sel_Mode_SHS:
stc;
retn;jnb LBA模式
Disk_Read_Sel_Mode_LBA:
clc;
retn;jnb LBA模式
; ---------------------------------------------------------------------------
Disk_Read_Reset: ; 磁盘复位
xor ah, ah
mov dl,
int 13h
retn;
; ---------------------------------------------------------------------------
init_msgdb 0dh,0ah,'Enter 1 2 3 4 Load Dbr:'
;Error_msg db 'Error Dbr',0dh,0ah,0h
;boot_msgdb 0dh,0ah,'boot Look Dbr X'
db 200H dup(0);全0标志
code ends
end start
以上asm文件编译链接出来的MBR为:
33 C0 8E D0 FB BC 00 7C 8B F4 BF 00 06 50 B1 00 <- 该值指定原始MBR的扇区号,0为无原始MBR或者不进行原始MBR引导,非0则会加载对应扇区继续引导启动,可根据需要修改
07 50 1F FC BD BE 07 BB BE 7D 60 B9 00 02 F3 A4
6A 00 BE 27 06 56 CB 61 60 80 F9 00 75 23 B9 04
00 80 7E 00 00 7C 08 83 C5 10 E2 F5 F4 EB FD E8
83 00 72 F8 81 BC FE 01 55 AA 75 F0 61 6A 00 56
CB 32 ED C7 46 00 80 00 89 4E 08 89 46 0A FE C1
89 4E 02 E8 5F 00 72 D4 61 60 81 BC FE 01 55 AA
75 CA 8B EB B9 04 00 C6 46 00 00 83 C5 10 E2 F7
BE 53 07 B9 19 00 AC BB 07 00 B4 0E CD 10 E2 F6
33 C0 CD 16 3C 31 74 0C 3C 32 74 08 3C 33 74 04
3C 34 75 DC 50 BB 07 00 B4 0E CD 10 59 80 E9 31
B0 10 F6 E1 8B E8 81 C5 BE 7D C6 46 00 80 61 6A
00 68 00 7C CB C6 46 11 05 88 56 00 60 E8 55 00
61 60 72 22 6A 00 6A 00 FF 76 0A FF 76 08 6A 00
68 00 7C 6A 01 6A 10 B4 42 8A 56 00 8B F4 CD 13
9F 83 C4 10 EB 15 B8 01 02 BB 00 7C 8A 56 00 8A
76 01 8A 4E 02 8A 6E 03 CD 13 9F E8 3D 00 61 9E
73 12 FE 4E 11 75 0C 80 7E 00 80 74 06 C6 46 00
80 EB A9 F9 C3 55 8A 56 00 B4 08 CD 13 5D 72 17
8A 56 00 BB AA 55 B4 41 CD 13 72 0B 81 FB 55 AA
75 05 F6 C1 01 75 02 F9 C3 F8 C3 32 E4 8A 56 00
CD 13 C3 0D 0A 45 6E 74 65 72 20 31 20 32 20 33
20 34 20 4C 6F 61 64 20 44 62 72 3A 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
你好,请尝试邮箱重置密码找回,如果无法找回我们再走申请方式,需要在看雪论坛给hmilywen发一条短消息,确认这个申请是本人发布的,然后回复我进行审核。
页:
[1]