Разработка и исследование драйвера консоли

Понятие и назначение драйверов, схема взаимодействия прикладной программы и устройства. Разработка драйвера консоли и назначения компонентов, создание программы отладки драйвера и исследования его работы выполнении функций ввода-вывода в открытом режиме.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 20.11.2010
Размер файла 1,8 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

mesprom db 13,10,13,10,'Введите символы: ',13,10,'$'

console1 db 'CON '

mesprom0ch db 13,10,13,10,'Введите символы, чтобы заполнить буфер клавиатуры.',13,10,'$'

mes0ch db 13,10,'Введите символ:$'

mesrez db 13,10,'Вы ввели: ','$'

nl db 13,10,'$'

console db 'CON ',0

menu db 'Тест №2. Тестирование драйвера консоли.',13,10

db 'Выполнил студент группы СП-03а ******** *.*.',13,10,13,10

db 'ВЫберите режим:',13,10

db '1. Открыть драйвер',13,10

db '2. Закрыть драйвер на ввод',13,10

db '3. Закрыть драйвер на вывод',13,10

db '4. Перевод в ASCII режим',13,10

db '5. Перевод в BIN режим',13,10

db '6. Тест функции ah=06h int 21h',13,10

db '7. Тест функции ah=3fh int 21h',13,10

db '8. Тест функции ah=0ch int 21h',13,10

db '9. Подменить/восстановить int 21h',13,10

db '0. "Вырезать" драйвер',13,10

db 'q. Выход!',13,10,'$'

menu0 db 'Выбранный режим: вырезать" драйвер',13,10,'$'

menu1 db 'Выбранный режим: открыть драйвер.',13,10,'$'

menu2 db 'Выбранный режим: закрыть драйвер на ввод.',13,10,'$'

menu3 db 'Выбранный режим: закрыть драйвер.на вывод',13,10,'$'

menu4 db 'Выбранный режим: Перевод в ASCII режим.',13,10,'$'

menu5 db 'Выбранный режим: Перевод в BIN режим.',13,10,'$'

menu6 db 'Выбранный режим: Тест функции ah=06h int 21h.',13,10,'$'

menu7 db 'Выбранный режим: Тест функции ah=3fh int 21h.',13,10,'$'

menu8 db 'Выбранный режим: Тест функции ah=0ch int 21h.',13,10,'$'

menu9 db 'Выбранный режим: Подменить/восстановить int 21h',13,10,'$'

submenu db '1. Вырезать драйвер из цепочки',13,10

db '2. Вырезать драйвер из цепочки и изменить адрес в Списке Списков',13,10

db '3. Вырезать драйвер из цепочки и изменить таблицу SFT',13,10

db '4. Полностью заменить драйвер',13,10,'$'

choice dw menu0,menu1,menu2,menu3,menu4,menu5,menu6,menu7,menu8,menu9

functab dw cut_drv,op_drv,cl_drv1,cl_drv2,selASC,selBIN,t06h,t3fh,t0ch,hook_on_off

teststring db 'Тестовая строка!'

errorbin db 'Ошибка при тестировании функции 44h',13,10,'$'

inkey db 128 dup (?)

bufferkbd db 150 dup ('$')

condrv_addr label dword

ofs_condrv dw ?

seg_condrv dw ?

rd label dword

ofsdrvhead dw ?

segdrvhead dw ?

sftaddr label dword

ofssft dw ?

segsft dw ?

ofsdrv2 dw ?

segdrv2 dw ?

cutflags db 0

datseg ends

cseg segment para 'code'

main proc far

assume cs:cseg,ds:datseg,ss:stacks,es:cseg

push ds

xor ax,ax

push ax

mov ax,datseg

mov ds,ax

;----------

call store_drvaddr

again: call clrscr

lea bx,menu

call outstr

cont: mov ah,00h

int 16h

sub al,30h

cmp al,41h

je exitprogr

cmp al,0

jl cont

cmp al,9

jg cont

cbw

mov di,ax

shl di,1

mov bx,choice[di]

call outstr

mov ah,00h

int 16h

call clrscr

call functab[di]

jmp again

exitprogr:

lea bx,cs:old21h

cmp word ptr cs:[bx],0

je exp

call hook_on_off

exp:

ret

main endp

outwtohex proc

push bp

mov bp,sp

push cx bx dx

word2hex EQU [bp+4]

mov cx,2

mov bx,word2hex

c2: mov dx,bx

and dx,00F0h

shr dx,4

cmp dl,0ah

jae add_37h

add dl,30h

conthex:

mov [si],dl

inc si

shl bx,4

loop c2

sub si,4

pop dx bx cx bp

ret 2

add_37h:add dl,37h

jmp conthex

outwtohex endp

store_drvaddr proc

push si ax bx es

lea si,condrv_addr

mov ah,52h

int 21h

add bx,0ch

mov ax,es:[bx]

mov [si],ax

mov ax,es:[bx+2]

mov [si+2],ax

pop es bx ax si

ret

store_drvaddr endp

cut_drv proc

push di si bx ax

lea bx,submenu

call outstr

mov ah,00h

int 16h

cmp al,31h

je cut_list

cmp al,32h

je change_LoL

cmp al,33h

je change_SFT

cmp al,34h

jne retproc

mov al,cutflags

test al,1

jnz m1

mov di,1

call del_condrv

m1:

mov al,cutflags

test al,2

jnz m2

mov di,0

call del_condrv

mov ofsdrv2,di

mov segdrv2,si

push di si

call write_drv

m2:

mov al,cutflags

test al,4

jnz retproc

call ch_sft

retproc:pop ax bx si di

ret

cut_list:

mov di,1

call del_condrv

mov al,cutflags

or al,1

mov cutflags,al

jmp retproc

change_LoL:

mov al,cutflags

test al,1

jnz mm1

mov di,1

call del_condrv

mm1:

mov al,cutflags

test al,2

jnz retproc

mov di,0

call del_condrv

mov ofsdrv2,di

mov segdrv2,si

push di si

call write_drv

mov al,cutflags

or al,3

mov cutflags,al

jmp retproc

change_SFT:

mov al,cutflags

test al,1

jnz mmm1

mov di,1

call del_condrv

mmm1:

mov al,cutflags

test al,4

jnz retproc

mov di,0

call del_condrv

mov ofsdrv2,di

mov segdrv2,si

call ch_sft

mov al,cutflags

or al,101b

mov cutflags,al

jmp retproc

cut_drv endp

del_condrv proc

push ax dx cx es bx

mov ah,52h

int 21h

add bx,22h

c1:

mov ofsdrvhead,bx

mov ax,es

mov segdrvhead,es

call get_next_driver

cmp bx,-1

je exitpp

push di

mov cx,8

mov di,0

lea si,console

cpystr1:

mov dl,es:[bx+di].namedrv

mov al,[si]

inc di

inc si

cmp al,dl

loopz cpystr1

pop di

jz cutcon

jmp c1

exitpp:

pop bx es cx dx ax

ret

cutcon:

cmp di,0

je retcondrv

call get_next_driver

push ds

lds si,rd

mov [si],bx

mov bx,es

mov [si+2],bx

pop ds

jmp exitpp

retcondrv:

mov di,bx

mov bx,es

mov si,bx

jmp exitpp

del_condrv endp

write_drv proc

push bp

mov bp,sp

push ax bx es

segtow EQU [bp+4]

ofstow EQU [bp+6]

mov ah,52h

int 21h

add bx,0ch

mov ax,ofstow

mov word ptr es:[bx],ax

mov ax,segtow

mov word ptr es:[bx+2],ax

pop es bx ax bp

ret 4

write_drv endp

ch_sft proc

push ax es bx si di cx

cmp bx,0

mov ah,52h

int 21h

mov ax,es:[bx+6]

mov segsft,ax

mov ax,es:[bx+4]

mov ofssft,ax

les bx,sftaddr

add bx,6

mov cx,es:[bx-2]

csft:

mov si,0

push cx

mov cx,11

mov di,0

lea di,console1

cpystr2:

mov dl,byte ptr es:[bx+si+20h]

mov al,[di]

inc di

inc si

cmp al,dl

loopz cpystr2

pop cx

jz change

add bx,3bh

loop csft

retfunc:

pop cx di si bx es ax

ret

change:

mov ax,ofsdrv2

mov word ptr es:[bx+7],ax

mov ax,segdrv2

mov word ptr es:[bx+9],ax

jmp retfunc

ch_sft endp

get_next_driver proc

push ax cx

mov ax,es

mov ax,es:[bx+2]

mov cx,es:[bx]

mov es,ax

mov bx,cx

pop cx ax

ret

get_next_driver endp

outstr proc

push di ax cx bx

mov di,0

repeat: mov al,[bx+di]

cmp al,'$'

je exitout

push bx

cmp al,13

je code13

cmp al,10

je code10

mov ah,0ah

mov bx,0

mov cx,1

int 10h

push ax ds bx

mov ax,0040h

mov ds,ax

mov bx,0050h

inc byte ptr ds:[bx]

contout:pop bx ds ax

inc di

pop bx

jmp repeat

code13:

push ax ds bx

mov ax,0040h

mov ds,ax

mov bx,0050h

mov ds:[bx],byte ptr 0

jmp contout

code10:

push ax ds bx

mov ax,0040h

mov ds,ax

mov bx,0051h

inc byte ptr ds:[bx]

jmp contout

exitout:

pop bx cx ax di

ret

outstr endp

clrscr proc

push ax

mov ax,0003h

int 10h

pop ax

ret

clrscr endp

op_drv proc

push ax cx dx

mov ah,3Dh

mov cx,0

lea dx,console

int 21h

mov ah,3Dh

mov cx,1

lea dx,console

int 21h

pop dx cx ax

ret

op_drv endp

cl_drv1 proc

push ax bx

mov ah,3Eh

mov bx,0

int 21h

pop bx ax

ret

cl_drv1 endp

cl_drv2 proc

push ax bx

mov ah,3Eh

mov bx,1

int 21h

pop bx ax

ret

cl_drv2 endp

selASC proc

push ax bx dx

mov ax,4400h

mov bx,1

int 21h

mov ax,4401h

mov bx,1

xor dh,dh

and dl,11011111b

int 21h

pop dx bx ax

ret

selASC endp

selBIN proc

push ax bx dx

mov ax,4400h

mov bx,1

int 21h

mov ax,4401h

mov bx,1

xor dh,dh

or dl,00100000b

int 21h

pop dx bx ax

ret

selBIN endp

shiftdelay proc

push es bx ax

checkshifton:

mov ah,02h

int 16h

and al,02h

jz checkshifton

checkshiftoff:

mov ah,02h

int 16h

and al,02h

jnz checkshiftoff

pop ax bx es

ret

shiftdelay endp

t06h proc

push dx si cx ax

lea bx,mesprom

call outKbdBuffer

call outstr

readkey:

call shiftdelay

call outKbdBuffer

call shiftdelay

lea bx,nl

call outstr

mov si,0

mov cx,5

c222:

mov ah,06h

mov dl,0ffh

int 21h

mov inkey[si],al

inc si

loop c222

lea bx,mesrez

call outstr

mov si,0

mov cx,5

c333:

mov dl,inkey[si]

mov ah,06h

int 21h

inc si

loop c333

lea bx,nl

call outstr

call outKbdBuffer

call shiftdelay

pop ax cx si dx

ret

t06h endp

t3fh proc

push dx si cx ax

lea bx,mesprom

call outstr

mov ah,3Fh

mov bx,0

mov cx,5

lea dx,inkey

int 21h

mov bl,'$'

mov inkey[5],bl

lea bx,mesrez

call outstr

lea bx,inkey

call outstr

mov ah,00h

int 16h

pop ax cx si dx

ret

t3fh endp

t0ch proc

push dx si cx ax

call outKbdBuffer

lea bx,mesprom0ch

call outstr

call shiftdelay

call outKbdBuffer

call shiftdelay

lea bx,nl

call outstr

lea bx,nl

call outstr

lea bx,mes0ch

mov ax,0C01h

int 21h

mov inkey,al

lea bx,nl

call outstr

call outKbdBuffer

call shiftdelay

lea bx,nl

call outstr

lea bx,nl

call outstr

lea bx,mesrez

call outstr

mov al,inkey

call outchar

mov ah,00h

int 16h

pop ax cx si dx

ret

t0ch endp

hook_on_off proc

push bx ax es di

lea bx,cs:old21h

cmp word ptr cs:[bx],0

jne off_hook

mov al,21h

call getint

mov dx,bx

lea bx,cs:old21h

mov cs:[bx],dx

mov dx,es

mov cs:[bx+2],dx

lea dx,cs:int21h

push ds

push cs

pop ds

mov al,21h

call setint

pop ds

jmp conthook

off_hook:

push ds bx dx ax

mov al,21h

lea bx,cs:old21h

mov dx,cs:[bx+2]

mov ds,dx

mov dx,cs:[bx]

call setint

mov word ptr cs:[bx],0

pop ax dx bx ds

conthook:

pop di es ax bx

ret

hook_on_off endp

setint proc

cli

push bx ax es

mov bx,0

mov es,bx

shl al,2

mov bl,al

xor bh,bh

mov es:[bx],dx

mov ax,ds

mov es:[bx+2],ax

pop es ax bx

sti

ret

setint endp

getint proc

cli

push si ax ds

mov bx,0

mov ds,bx

shl al,2

xor ah,ah

mov si,ax

mov bx,[si+2]

mov es,bx

mov bx,[si]

pop ds ax si

sti

ret

getint endp

outchar proc

push ax cx bx ds

mov ah,0ah

mov cx,1

mov bx,0

int 10h

mov ax,0040h

mov ds,ax

mov bx,0050h

inc byte ptr ds:[bx]

pop ds bx cx ax

ret

outchar endp

int21h proc

push bx cx ds es di

push bx

lea bx,intishooked

call outstr

pop bx

cmp ah,06h

je hook_int06

cmp ah,3fh

je hook_int3fjmp

cmp ah,0Ch

je jmphook_int0c

callint:

pushf

call cs:old21h

jmp endint

hook_int3fjmp:

jmp hook_int3f

jmphook_int0c:

jmp hook_int0c

hook_int06:

lea bx,cs:zapros

mov ax,cs

mov cs:[bx].rh4_buf_seg,ax

lea ax,cs:buffer

mov cs:[bx].rh4_buf_ofs,ax

mov cs:[bx].rh4_count,1

push cs bx

cmp dl,0ffh

je in_06ht

mov cs:buffer,dl

mov cs:[bx].rh_len,30

mov cs:[bx].rh_cmd,8

call drvproc

jmp endint

setZF:

pushf

pop dx

or dl,01000000b

push dx

popf

jmp extest

in_06ht:

mov cs:[bx].rh_len,14

mov cs:[bx].rh_cmd,5

call drvproc

push dx ax

mov ax,cs:[bx].rh_status

test ah,2

pop ax

jnz setZF

pushf

pop dx

and dl,10111111b

push dx

popf

call readchar

extest:

pop dx

jmp endint

callintjmp:

jmp callint

hook_int3f:

cmp bx,1

ja callintjmp

mov cs:reqcount,cx

push ax ds es bx si di ;сохр регистры

mov ax,ds

mov es,ax

mov ax,cs

mov ds,ax

xor ax,ax

mov cs:userpos,0

mov si,cs:bufpos

cmp si,0

jne copytouserjmp

call get_binasc

test di,0020h

jnz binjmp

reading:

call readchar

cmp al,08h

je bspace_ret

cmp al,0dh

je add0ahjmp

cmp si,127

je beepjmp

cmp al,0

je readext

call outchar

mov cs:_3fhbuffer[si],al

inc si

mov cs:bufpos,si

jmp reading

readext:

call readchar

jmp reading

binjmp:

mov di,cx

mov cs:bufpos,di

call readblock

jmp copytouser

end3fh:

pop di si bx es ds ax

jmp endint

add0ahjmp:

jmp add0ah

copytouserjmp:

jmp copytouser

beepjmp:

jmp beep

bspace_ret:

push cx ax ds bx

cmp si,0

je reading

dec si

mov ax,cs:bufpos

dec ax

mov cs:bufpos,ax

mov ax,0040h

mov ds,ax

mov bx,0050h

dec byte ptr ds:[bx]

mov al,' '

mov ah,0ah

mov bx,0

mov cx,1

int 10h

pop bx ds ax cx

jmp reading

hook_int0c:

push bx ax

lea bx,cs:zapros

mov ax,cs

mov cs:[bx].rh_len,13

mov cs:[bx].rh_cmd,7

push cs bx

call drvproc

mov ah,al

xor al,al

pop ax bx

pushf

call cs:old21h

endint:

pop di es ds cx bx

iret

copytouser:

mov si,0

mov di,cs:userpos

add di,dx

copycont2:

mov al,cs:_3fhbuffer

mov es:[di],al

push cx si ax

mov cx,cs:bufpos

cmp cx,1

je lc2

mov si,0

dec cx

lc: mov al,cs:_3fhbuffer[si+1]

mov cs:_3fhbuffer[si],al

inc si

loop lc

lc2:

pop ax si cx

inc di

mov ax,di

sub ax,dx

mov cs:userpos,ax

mov ax,cs:bufpos

dec ax

mov cs:bufpos,ax

dec cx

mov ax,cs:reqcount

sub ax,cx

cmp cx,0

je end3fhjmp

cmp cs:bufpos,0

je end3fhjmp

jmp copycont2

end3fhjmp:

jmp end3fh

readingjmp:

jmp reading

add0ah:

mov cs:_3fhbuffer[si],al

inc si

mov cs:_3fhbuffer[si],0ah

inc si

mov cs:bufpos,si

jmp copytouser

beep:

push ax cx dx

mov al,10110110b ; канал 2, режим 3

out 43h,al

mov al,0Dh ; младший байт делителя

; частоты 11D0h

out 42h,al

mov al,11h ; старший байт делителя частоты

out 42h,al

in al,61h ; текущее состояние

; порта 61h в AL

or al,00000011b ; установить биты 0 и 1 в 1

out 61h,al ; теперь динамик включен

mov cx,0007h ; старшее слово числа микросекунд паузы

mov dx,0A120h ; младшее слово числа микросекунд паузы

mov ah,86h ; функция 86h

int 15h ; пауза

in al,61h

and al,11111100b ; обнулить младшие два бита

out 61h,al ; теперь динамик выключен

pop dx cx ax

jmp reading

int21h endp

ReadBlock proc

push bx es

lea bx,cs:zapros

mov cs:[bx].rh_len,30

mov ax,cs

mov cs:[bx].rh4_buf_seg,ax

lea ax,cs:_3fhbuffer

mov cs:[bx].rh4_buf_ofs,ax

mov cs:[bx].rh4_count,di

mov cs:[bx].rh_cmd,4

push cs bx

call drvproc

mov bx,ax

mov al,cs:[bx]

pop es bx

ret

ReadBlock endp

get_binasc proc

push ax es bx si cx dx

cmp bx,0

mov ah,52h

pushf

call cs:old21h

mov ax,es:[bx+6]

mov segsft,ax

mov ax,es:[bx+4]

mov ofssft,ax

les bx,sftaddr

add bx,6

mov cx,es:[bx-2]

bcsft:

mov si,0

push cx

mov cx,11

mov di,0

lea di,cs:console2

bcpystr2:

mov dl,byte ptr es:[bx+si+20h]

mov al,cs:[di]

inc di

inc si

cmp al,dl

loopz bcpystr2

pop cx

jz bchange

add bx,3bh

loop bcsft

bretfunc:

pop dx cx si bx es ax

ret

bchange:

mov di,es:[bx+5]

jmp bretfunc

get_binasc endp

readchar proc

push bx es

lea bx,cs:zapros

mov cs:[bx].rh_len,30

mov ax,cs

mov cs:[bx].rh4_buf_seg,ax

lea ax,cs:buffer

mov cs:[bx].rh4_buf_ofs,ax

mov cs:[bx].rh4_count,1

mov cs:[bx].rh_cmd,4

push cs bx

call drvproc

mov bx,ax

mov al,cs:[bx]

pop es bx

ret

readchar endp

drvproc proc

push bp

mov bp,sp

seg_zapros EQU [bp+6]

ofs_zapros EQU [bp+4]

push bx ax es

mov ah,52h

pushf

call cs:old21h

add bx,0ch

les bx,es:[bx]

mov ax,es:[bx+6]

mov cs:ofs_strategproc,ax

mov ax,es:[bx+8]

mov cs:ofs_interrproc,ax

mov ax,es

mov cs:seg_strategproc,ax

mov cs:seg_interrproc,ax

mov bx,ofs_zapros

mov ax,seg_zapros

mov es,ax

call cs:strategproc

call cs:interrproc

pop es ax bx bp

ret 4

drvproc endp

reqcount dw ?

constr db 'CON '

console2 db 'CON '

interrproc label dword

ofs_interrproc dw ?

seg_interrproc dw ?

strategproc label dword

ofs_strategproc dw ?

seg_strategproc dw ?

handle dw ?

_3fhbuffer db 128 dup (0)

bufpos dw 0

userpos dw 0

nextdriver label dword

ofs_drv dw ?

seg_drv dw ?

old21h dd 0

buffer db 20 dup (1)

zapros db 50 dup (0)

outKbdBuffer proc

push bx es ax di si cx

mov bx,40h

mov es,bx

mov bx,1ah

mov di,01eh

mov cx,32

lea si,bufferkbd

ckbd: cmp di,es:[bx]

je typehead

contail:

cmp di,es:[bx+2]

je typetail

conkbd: mov al,es:[di]

push ax

call outwtohex

add si,4

test cx,1

jz nsp

mov byte ptr [si],' '

inc si

nsp:

inc di

loop ckbd

lea bx,bufferkbd

mov byte ptr [si],'$'

call outstr

pop cx si di ax es bx

ret

typehead:

mov byte ptr [si],' '

inc si

mov byte ptr [si],'H'

inc si

mov byte ptr [si],' '

inc si

jmp contail

typetail:

mov byte ptr [si],' '

inc si

mov byte ptr [si],'T'

inc si

mov byte ptr [si],' '

inc si

mov byte ptr [si],' '

inc si

jmp conkbd

outKbdBuffer endp

;intishooked db 'Interrupt is hooked!!!',13,10,'$'

rh_in_out struc ;3аголовок запроса для команды 8

rh_len db ? ;Длина пакета

rh_unit db ? ;Номер устройства (блоковые)

rh_cmd db ? ;Команда драйвера устройства

rh_status dw ? ;возвращается драйвером

rh_res1 dd ? ;Зарезервировано

rh_res2 dd ? ;Зарезервировано

rh4_nedla db ? ;Дескриптор носителя из DPB

rh4_buf_ofs dw ? ;Смещение DTA

rh4_buf_seg dw ? ;Сегмент DTA

rh4_count dw ? ;Счетчик передачи (секторов для

rh4_start dw ? ;Начальный сектор (блоковые)

rh_in_out ends

headerst struc

ofsDrvNext dw ?

segDrvNext dw ?

attrib dw ?

adrstrateg dw ?

adrinterr dw ?

namedrv db ?

headerst ends

rh5 struc ;3аголовок запроса для команды 8

rh_len db ? ;Длина пакета

rh_unit db ? ;Номер устройства (блоковые)

rh_cmd db ? ;Команда драйвера устройства

rh_status dw ? ;возвращается драйвером

rh_res1 dd ? ;Зарезервировано

rh_res2 dd ? ;Зарезервировано

rh5_return db ? ;Возвращаемый символ

rh5 ends

cseg ends

end main

Приложение 4

Листинг программы формирования списка драйверов

stackseg segment stack

db 64 dup (?)

stackseg ends

datseg segment

console1 db 'CON '

strwellcome db 'Тест №3. Список драйверов установленных в системе.',13,10,'$'

strmadeby db 'Выполнил студент группы СП-03а ******** *.*.',13,10,'$'

stranykey db 'Нажмите любую клавишу...$'

strstep1 db 'Сейчас будет удален и цепочки первый в списке резидентный драйвер консоли.',13,10

db 'Указатель во внутренних переменных ДОС будет переведен на 2-й по списку драйвер консоли.',13,10

db 'Так же будет модифицирована таблица SFT.',13,10

db 'При этом нарушений в работе int21h не будет.',13,10,'$'

strstep2 db 'Если вы видите эти строки то int21h работает правильно',13,10

db 'Сейчас будет удален из цепочки второй по списку резидентый драйвер',13,10,'$'

strstep3 db 'Если вы видите эти строки, то после удаления всех драйверов консоли из цепочки',13,10

db 'функция 09h int21h работает правильно',13,10

db 'Обнуление указателя во внутренних переменных ДОС на драйвер консоли.',13,10

db 'Нарушится работа функции 09h int21h! Возможно зависание!',13,10,'$'

prompt db 'Желаете продолжить тест? (y=Yes)',13,10,'$'

strerr db 'Если вы видите эту строку, значит что-то не так!',13,10,'$'

strhead db ' __________________________________________________________',13,10

db '| Адрес |Адр.след.| Атрибут| Адрес | Адрес | Имя |',13,10

db '|драйвера |драйвера | |стратегии|прерывания|драйвера|',13,10

db '|_________|_________|________|_________|__________|________|',13,10,'$'

endline db '|',13,10,'$'

headerst struc

ofsDrvNext dw ?

segDrvNext dw ?

attrib dw ?

adrstrateg dw ?

adrinterr dw ?

namedrv db ?

headerst ends

rd label dword

ofsdrvhead dw ?

segdrvhead dw ?

console db 'CON '

sftaddr label dword

ofssft dw ?

segsft dw ?

ofsdrv2 dw ?

segdrv2 dw ?

datseg ends

cseg segment para 'code'

main proc far

assume cs:cseg,ds:datseg,es:datseg,ss:stackseg

push ds

xor ax,ax

push ax

mov ax,datseg

mov ds,ax

;------------------------

push ax dx cx es bx si di

mov ax,0003h

int 10h

lea dx,strwellcome

mov ah,09h

int 21h

lea dx,strmadeby

mov ah,09h

int 21h

mov ah,00h

int 16h

mov ax,0003h

int 10h

call out_list

lea dx,strstep1

mov ah,09h

int 21h

lea dx,prompt

mov ah,09h

int 21h

mov ah,0

int 16h

cmp al,'y'

jne ex

;step1

mov di,1

call del_condrv

mov di,0

call del_condrv

mov ofsdrv2,di

mov segdrv2,si

push di si

call write_drv

call ch_sft

mov ax,0003h

int 10h

call out_list

lea dx,strstep2

mov ah,09h

int 21h

lea dx,prompt

mov ah,09h

int 21h

mov ah,0

int 16h

cmp al,'y'

jne ex

;step2

mov di,1

call del_condrv

mov ax,0003h

int 10h

call out_list

lea dx,strstep3

mov ah,09h

int 21h

lea dx,prompt

mov ah,09h

int 21h

mov ah,0

int 16h

cmp al,'y'

jne ex

;step3

mov di,0

push di di

call write_drv

lea dx,strerr

mov ah,09h

int 21h

mov ah,00

int 16h

mov ah,09h

lea dx,stranykey

int 21h

mov ah,00h

int 16h

ex:

pop di si bx es cx dx ax

ret

main endp

get_next_driver proc

push ax cx

mov ax,es

mov ax,es:[bx+2]

mov cx,es:[bx]

mov es,ax

mov bx,cx

pop cx ax

ret

get_next_driver endp

out_list proc

mov ah,52h

int 21h

add bx,22h

newpage:lea dx,strhead

mov ah,09h

int 21h

c: call outinfo

call get_next_driver

cmp bx,-1

je exitp

loop c

lea dx,stranykey

mov ah,09h

int 21h

mov ah,00h

int 16h

mov ax,0003h

int 10h

mov cx,21

jmp newpage

exitp:

mov ah,00h

int 16h

ret

out_list endp

ch_sft proc

push ax es bx si di cx

mov ah,52h

int 21h

mov ax,es:[bx+6]

mov segsft,ax

mov ax,es:[bx+4]

mov ofssft,ax

les bx,sftaddr

add bx,6

mov cx,es:[bx-2]

csft:

mov si,0

push cx

mov cx,11

mov di,0

lea di,console1

cpystr2:

mov dl,byte ptr es:[bx+si+20h]

mov al,[di]

inc di

inc si

cmp al,dl

loopz cpystr2

pop cx

jz change

add bx,3bh

loop csft

retfunc:

pop cx di si bx es ax

ret

change:

mov ax,ofsdrv2

mov word ptr es:[bx+7],ax

mov ax,segdrv2

mov word ptr es:[bx+9],ax

jmp retfunc

ch_sft endp

write_drv proc

push bp

mov bp,sp

push ax bx es

segtow EQU [bp+4]

ofstow EQU [bp+6]

mov ah,52h

int 21h

add bx,0ch

mov ax,ofstow

mov word ptr es:[bx],ax

mov ax,segtow

mov word ptr es:[bx+2],ax

pop es bx ax bp

ret 4

write_drv endp

del_condrv proc

push ax dx cx es bx

mov ah,52h

int 21h

add bx,22h

c1:

mov ofsdrvhead,bx

mov ax,es

mov segdrvhead,es

call get_next_driver

cmp bx,-1

je exitpp

push di

mov cx,8

mov di,0

lea si,console

cpystr1:

mov dl,es:[bx+di].namedrv

mov al,[si]

inc di

inc si

cmp al,dl

loopz cpystr1

pop di

jz cutcon

jmp c1

exitpp:

pop bx es cx dx ax

ret

cutcon:

cmp di,0

je retcondrv

call get_next_driver

push ds

lds si,rd

mov [si],bx

mov bx,es

mov [si+2],bx

pop ds

jmp exitpp

retcondrv:

mov di,bx

mov bx,es

mov si,bx

jmp exitpp

del_condrv endp

outinfo proc

push ax dx cx di

mov ah,02h

mov dl,'|'

int 21h

mov cx,es

push cx

call outwtohex

mov dl,':'

mov ah,02h

int 21h

mov cx,bx

push cx

call outwtohex

mov ah,02h

mov dl,'|'

int 21h

mov cx,es:[bx].segDrvNext

push cx

call outwtohex

mov dl,':'

mov ah,02h

int 21h

mov cx,es:[bx].ofsDrvNext

push cx

call outwtohex

mov ah,02h

mov dl,'|'

int 21h

mov ah,02h

mov dl,' '

int 21h

mov ah,02h

mov dl,' '

int 21h

mov cx,es:[bx].attrib

push cx

call outwtohex

mov ah,02h

mov dl,' '

int 21h

mov ah,02h

mov dl,' '

int 21h

mov ah,02h

mov dl,'|'

int 21h

mov ah,02h

mov dl,' '

int 21h

mov ah,02h

mov dl,' '

int 21h

mov cx,es:[bx].adrstrateg

push cx

call outwtohex

mov ah,02h

mov dl,' '

int 21h

mov ah,02h

mov dl,' '

int 21h

mov ah,02h

mov dl,' '

int 21h

mov ah,02h

mov dl,'|'

int 21h

mov ah,02h

mov dl,' '

int 21h

mov ah,02h

mov dl,' '

int 21h

mov ah,02h

mov dl,' '

int 21h

mov cx,es:[bx].adrinterr

push cx

call outwtohex

mov ah,02h

mov dl,' '

int 21h

mov ah,02h

mov dl,' '

int 21h

mov ah,02h

mov dl,' '

int 21h

mov ah,02h

mov dl,'|'

int 21h

mov cx,8

mov di,0

cpystr: mov dl,es:[bx+di].namedrv

mov ah,02h

int 21h

inc di

loop cpystr

lea dx,endline

mov ah,09h

int 21h

pop di cx dx ax

ret

outinfo endp

outwtohex proc

push bp

mov bp,sp

push cx bx dx

word2hex EQU [bp+4]

mov cx,4

mov bx,word2hex

c2: mov dx,bx

and dx,0F000h

shr dx,4

cmp dx,0a00h

jae add_37h

add dh,30h

cont: mov dl,dh

mov ah,02h

int 21h

shl bx,4

loop c2

pop dx bx cx bp

ret 2

add_37h:add dh,37h

jmp cont

outwtohex endp

cseg ends

end main


Подобные документы

  • Архитектура ввода/вывода Windows NT. Внутренняя организация шины USB. Сущностная характеристика драйверной модели WDM. Точки входа разрабатываемого драйвера, размещение кода в памяти, установка драйвера в системе. Реализация кода драйвера на языке C.

    курсовая работа [1,2 M], добавлен 27.09.2014

  • Повышение быстродействия операционной системы. Разработка драйверов для средств хранения данных, управление работой устройства командами PnP. Создание, настройка параметров и установка классового драйвера виртуального диска, его структура и свойства.

    курсовая работа [163,2 K], добавлен 18.06.2009

  • Анализ задания и разработка алгоритма. Основные принципы создания программы. Схема взаимодействия процессов Process 1 и Process 4, в режиме задачи и в режиме ядра. Листинг программы и ее тестирование. Результат работы и выполнения программы в консоли.

    контрольная работа [395,9 K], добавлен 18.09.2010

  • Разработка драйвера под Linux, отслеживающего выделение и освобождение процессами виртуальной памяти и выделение физических страниц при страничных отказах. Компиляция драйвера и работа с ним. Экспериментальная проверка работоспособности драйвера.

    курсовая работа [43,5 K], добавлен 18.06.2009

  • Механизмы взаимодействия драйвера режима ядра и пользовательского приложения: многослойная драйверная архитектура, алгоритм сокрытия данных, взаимодействие драйвера и приложения, пользовательский интерфейс программы фильтрации доступа к файлам.

    курсовая работа [1023,3 K], добавлен 23.06.2009

  • Описание принципа работы драйвера. Установка и регистрация драйвера. Назначение и возможности утилиты TestTerminals.exe. Использование редактора форм. Создание форм с помощью редактора задач. Последовательность выполнения операций и обработок данных.

    курсовая работа [843,6 K], добавлен 09.11.2011

  • Введение в API-программирование. Структура API-программ. Организация ввода-вывода в консольном приложении Windows. Организация низкоуровнего консольного ввода-вывода. Расширенная поддержка клавиатуры в консоли. Поддержка работы с мышью в консоли.

    курсовая работа [91,0 K], добавлен 10.02.2015

  • Использование драйвера режима ядра и управляющего приложения для создания системных потоков. Имитация обработки данных и организация задержек. Разработка драйвера на языке C++. Конфигурация тестового стенда. Точность изменения задержек и работы таймера.

    курсовая работа [182,4 K], добавлен 24.06.2009

  • Аналитический обзор существующих параллельных интерфейсов. Разработка лабораторного стенда и алгоритмов подпрограмм обмена информацией. Создание программ драйвера ИРПР. Команды микропроцессора, алгоритмы подпрограмм инициализации, ввода и вывода символа.

    курсовая работа [255,2 K], добавлен 10.07.2017

  • Разработка программного обеспечения для упрощения буквенно-цифрового ввода при невозможности использовать функционал стандартной буквенной клавиатуры. Классификация и установка драйверов. Выбор языка и среды программирования. Пользовательский интерфейс.

    курсовая работа [183,0 K], добавлен 12.03.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.