информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Портрет посетителяГде водятся OGRыSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Tailscale окончательно забанила... 
 Прекращение работы антивируса Касперского... 
 Microsoft Authenticator теряет... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / operating systems
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
самый последний Int13 забей нопами и не будет запоминать 16.01.06 18:31  Число просмотров: 4259
Автор: z0 <z0> Статус: Member
<"чистая" ссылка>
> Как сделать загрузку Win ВСЕГДА по умолчанию при
> использовании загрузчика FreeBSD?
> А то выбор меняется при прошлом выборе операционной
> системы...
> В man написано только о загрузки уже после выбора BSD...

самый последний Int13 забей нопами и не будет запоминать

вот дизассембированный фришный MBR с моими комментариями - поможет найти

.8086

BIOS_entry_offset equ 07c00h
MBR_work_offset equ 00600h

magic_number equ 0aa55h

partition_start_head equ 001h
partition_start_sector_cylinder equ 002h
partition_type equ 004h

partition_flag_boot equ 080h

partition_type_absent equ 000h
partition_type_extended equ 005h

jmpf macro dest_selector,dest_offset
db 0eah
dw offset dest_offset
dw dest_selector
endm

MBR segment use16 byte private 'code'
assume cs:MBR
assume ds:MBR

org MBR_work_offset
;This part of programm sets used segment registers ES,DS,SS to selector 00000
;and copies all MBR to work offset. Work offset is the lowest address of
;free memory = interrupt vector table size (00400h) + BIOS communication area
;size (00100h) + (00100h).
MBR_start:
xor ax,ax
mov es,ax
mov ds,ax
mov ss,ax
mov sp,BIOS_entry_offset
cld
mov si,sp
mov di,MBR_work_offset
mov cx,00100h
repnz movsw
jmpf 00000h,MBR_real_start

MBR_continue:
mov dx,bp
pop ax
mov current_default,al
cmp al,'5' ;another disk selected
je load_MBR_from_another_disk
;this code converts letter number in al to offset of proper partition record.
;(al*10h = 310h/320h/330h/340h) + 4aeh = 7beh/7ceh/7deh/7eeh
mov ah,010h
mul ah
add ax,004aeh
mov si,ax
;another one check
cmp byte ptr [si][partition_type],partition_type_absent
je print_partition_table
cmp byte ptr [si][partition_type],partition_type_extended
je print_partition_table
mov byte ptr [si],partition_flag_boot
call save_changes
mov dh,[si][partition_start_head]
mov cx,[si][partition_start_sector_cylinder]
jmp short BIOS_read

load_MBR_from_another_disk:
call save_changes ;dh is set to 0 here
mov cx,00001h ;cylinder 0, head 0, sector 1
xor dl,cl ;080h->081h 081h->080h
BIOS_read:
mov bx,BIOS_entry_offset
mov ax,00201h
;BIOS disk call.
;ah 002h read sector(s)
;al 001h sectors number
;es:bx 00000:BIOS_entry_offset buffer address
;dh 000h/???h head
;dl 080h/081h drive
;ch 000h/???h cylinder_low
;cl 001h/???h [0-5]: sector
; [6-7]: cylinder_high
int 013h
jc print_partition_table
cmp word ptr [bx][001feh],magic_number
jne print_partition_table
jmpf 00000h,BIOS_entry_offset

MBR_real_start:
;NOTE: dh is assumed to be 0
cmp dl,081h
je BIOS_drive_ok
mov dl,080h
BIOS_drive_ok:
mov bp,dx
;this code converts BIOS drive number in dl to opposite letter number
;(assuming only 2 disks may be present): 080h->'2' 081h->'1'
inc dx
xor dl,080h or '0' or 001h or 002h
;disk_n will not be used if only one disk is present
mov disk_n,dl
print_partition_table:
mov di,offset p0_boot
mov cx,00004h ;4 partitions in the table
mov partition_n,'1'
xor dh,dh ;bootable partition number
print_partition:
mov [di],ch ;partition boot flag
mov al,[di][partition_type]
cmp al,partition_type_absent
je next_partition
cmp al,partition_type_extended
je next_partition
inc dh ;bootable partition number
mov si,offset partition_string
call print
mov si,(offset partition_index)-2
next_partition_type:
inc si
inc si
mov bx,[si]
or bh,bh
jz unknown_partition
xor bh,[di][partition_type]
jnz next_partition_type
unknown_partition:
lea si,[bx][offset partition_names]
call print
next_partition:
add di,010h
inc partition_n
loop print_partition

cmp byte ptr ds:[00475h],002h ;BIOS comarea -> HDD number
je print_for_2_disks
mov si,offset default_string
or dh,dh
jnz print_for_1_disk
int 018h
jmp short print_partition_table

print_for_2_disks:
mov si,offset partition_string
call print
print_for_1_disk:
call print
input_start:
xor ah,ah
;BIOS time
;ah 000h get time
int 01ah
mov bx,dx
add bx,060h
timeout_cycle:
mov ah,001h
;BIOS key
;ah 001h check for key pressed
int 016h
mov ah,000h
jnz key_pressed
;BIOS time
;ah 000h get time
int 01ah
cmp dx,bx
jb timeout_cycle
input_stop:
mov al,current_default
jmp short check
key_pressed:
;BIOS key
;ah 000h get key
int 016h
mov al,ah
cmp al,01ch ;ENTER
je input_stop
;this code converts F? key to partition letter number:
;F1->'1' F2->'2' F3->'3' F4->'4'
add al,0f6h
check:
cmp al,'1'
jb input_start
cmp al,'5'
ja input_start
push ax
mov si,offset empty_string
mov bx,offset MBR_continue
push bx
print:
cld ;dimension flag is already cleared
lodsb
push ax
and al,07fh
mov ah,00eh
int 010h
pop ax
test al,080h
je print
retn ;not RETN but jump near to MBR_continue

save_changes:
push si ;not needed
mov ax,00301h
mov bx,MBR_work_offset
mov cx,00001h
xor dh,dh
;BIOS disk call:
;ah 003h write sector(s)
;al 001h sectors number
;es:bx 00000:MBR_work_offset buffer address
;dh 000h head
;dl 080h/081h drive
;ch 000h cylinder_low
;cl 001h [0-5]: sector
; [6-7]: cylinder_high
int 013h <- вот сюда поставь nop-nop
pop si ;not needed
mov current_default,'?'
retn

empty_string db 00dh ,00ah or 080h
partition_string db 00dh,00ah,'F'
partition_n db '5 . . .' ,' ' or 080h
disk_n_string db 'disk '
disk_n db '2'
default_string db 00dh,00ah,00ah,'Default: F'
current_default db '1' ,' ' or 080h

partition_index label word
dw 00100h
dw 00400h
dw 00600h
dw 00703h
dw 00a07h
dw 0630ah
dw 0640eh
dw 0650eh
dw 08014h
dw 08119h
dw 08219h
dw 08319h
dw 0931eh
dw 0a524h
dw 09f2bh
dw 0752fh
dw 05233h
dw 0db33h
dw 04036h
dw 0f23bh
dw 00041h
partition_names label byte
db 'Do' ,'s' or 080h
db 'Hpf' ,'s' or 080h
db 'Os' ,'2' or 080h
db 'Uni' ,'x' or 080h
db 'Novel' ,'l' or 080h
db 'Mini' ,'x' or 080h
db 'Linu' ,'x' or 080h
db 'Amoeb' ,'a' or 080h
db 'FreeBS','D' or 080h
db 'BSD' ,'i' or 080h
db 'Pci' ,'x' or 080h
db 'Cp' ,'m' or 080h
db 'Veni' ,'x' or 080h
db 'Dosse' ,'c' or 080h
db '?' ,'?' or 080h

;here must be offset 001beh
p0_boot db 000h ;080h
p0_start_head db 000h ;001h
p0_start_sector db 000h ;001h
p0_start_cylinder db 000h ;000h
p0_type db 000h ;006h
p0_stop_head db 000h ;07fh
p0_stop_sector db 000h ;03fh
p0_stop_cylinder db 000h ;031h
p0_sector_offset dd 000000000h ;00000003fh
p0_sector_number dd 000000000h ;0000626c1h

p1_boot db 000h ;000h
p1_start_head db 000h ;000h
p1_start_sector db 000h ;001h
p1_start_cylinder db 000h ;032h
p1_type db 000h ;007h
p1_stop_head db 000h ;07fh
p1_stop_sector db 000h ;03fh
p1_stop_cylinder db 000h ;095h
p1_sector_offset dd 000000000h ;000062700h
p1_sector_number dd 000000000h ;0000c4e00h

p2_boot db 000h ;000h
p2_start_head db 000h ;000h
p2_start_sector db 000h ;001h
p2_start_cylinder db 000h ;096h
p2_type db 000h ;00bh
p2_stop_head db 000h ;07fh
p2_stop_sector db 000h ;03fh
p2_stop_cylinder db 000h ;0f9h
p2_sector_offset dd 000000000h ;000127500h
p2_sector_number dd 000000000h ;0000c4e00h

p3_boot db 000h ;000h
p3_start_head db 000h ;000h
p3_start_sector db 000h ;001h
p3_start_cylinder db 000h ;0fah
p3_type db 000h ;005h
p3_stop_head db 000h ;07fh
p3_stop_sector db 000h ;0ffh
p3_stop_cylinder db 000h ;00ah
p3_sector_offset dd 000000000h ;0001ec300h
p3_sector_number dd 000000000h ;000411780h

dw magic_number

mbr ends

end MBR_start
<operating systems> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach