· очищает текстовый видеобуфер;
· фиксирует адрес прерывания работы с диском int 13h;
· уменьшает на один килобайт размер ОЗУ в переменной ROM Bios;
· перемещает резидентную часть модифицированного загрузчика в область памяти, которая после коррекции размера будет недоступна;
· переопределяет вектор int 13h на установленный "резидентно" обработчик;
· перемещает код на 512 байт назад и производит чтение исходного (первичного) загрузчика.
.MODEL TINY
.CODE
org 0
start:
; установка DS на экран
mov ax,0B800h
mov ds,ax
; очистка экрана
xor bx,bx
mov cx,4000
m17:
mov word prt ds:[bx],0700h
add bx,2
loop m17
; чтение адреса старого прерывания int 13h в переменную old_13
cli
xor ax,ax
mov ds,ax
mov bx,13h*4
mov ax,ds:[bx]
mov word prt cs:[old_13+7C00h],ax
add bx,2
mov ax,ds:[bx]
mov word prt cs:[old_13+7C02h],ax
sti
; уменьшение на килобайт объема доступной памяти
xor ax,ax
mov es,ax
mov bx,413h
mov ax,es:[bx]
dec ax
mov cx,ax
; вычисление физического адреса этой точки
mov bx,040h
mul bx
mov dx,cx
mov es,ax
mov ax,cs
mov ds,ax
; установка резидентной части в вычисленное место
mov cx,120
mov si,offset new_13
add si,7C00h
mov di,offset new_13
cld
rep movsw
; установка измененного объема доступной памяти
xor bx,bx
mov ds,bx
mov bx,413h
mov ds:[bx],dx
; подмена прерывания int 13h
cli
xor ax,ax
mov ds,ax
mov bx,13h*4
mov word prt ds:[bx],offset new_13
mov ax,es
add bx,2
mov ds:[bx],ax
sti
; перемещение кода на 512 байт назад
xor ax,ax
mov es,ax
mov ds,ax
mov cx,200h
mov di,7E00h
mov si,7C00h
cld
rep movsb
; переход на перемещенный код
db 0EAh
dw 07E889h
dw 0
; в эту точку загрузка старого BOOT сектора
mov ax,0201h
mov ch,0
mov cl,1
mov dh,0
mov dl,0
mov bx,cs
mov es,bx
mov bx,7C00h
int 13h
; блокирование клавиатуры
mov al,2
out 21h,al
; переход обратно на 0:7C00h
db 0EAh
db 07C00h
dw 0
; резидентная часть
new_13:
pushf
cmp cs:[tg],1
je ost
cmp dl,0
jne ost
cmp ah,3
jne read
cmp ch,0
jne ost
mov ch,10
jmp ost
read:
cmp ah,2
jne ost
cmp ch,0
jne ost
move ch,10
ost:
popf
jmp dword prt cx:[old_13]
old_13 dd 0
tg dw 0
db 291 dup(0)
db 55h
db 0AAh
end start
По коду резидентной части легко видеть, что k=10 в данном случае. Если нулевая дорожка копируется не на 10-ю, а на дорожку с другим номером, то обработчик должен быть скорректирован (возможно, динамически по бинарному коду) в нужных позициях.
После установки нового обработчика int 13h, как легко видеть, процедура чтения загрузчика, выполненная штатным образом приведет к чтению BOOT сектора с k-й дорожки (где и находится исходный BOOT сектор). Кроме того, все последующие процедуры операционной среды и прикладного ПО, работающего в загруженной таким образом ОС, будут работать с дискетой так, как с дискетой исходного формата (перемещения нулевой дорожки не было).
Рассмотренная технология соответствует исторически самому раннему способу построения ИПС- "невидимая дискета". Этот способ заключается в том, что критичное к воздействию РПВ программное обеспечение выносится на системную дискету, пользование которой (в том числе и выполнение программ) невозможно без загрузки DOS именно с этой дискеты. Практически такая дискета выглядит довольно нетривиально: будучи вставленной в дисковод она выглядит как неформатированная (или, в исходном варианте, пустая). После загрузки с такой "пустой" дискеты пользователь сразу входит в заданную программную среду и работает с ней.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.