Разработка и исследование драйвера консоли
Понятие и назначение драйверов, схема взаимодействия прикладной программы и устройства. Разработка драйвера консоли и назначения компонентов, создание программы отладки драйвера и исследования его работы выполнении функций ввода-вывода в открытом режиме.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 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