Розробка та дослідження драйверу консолі

Призначення драйверів та порядок роботи з драйверами в MS-DOS. Розробка драйверів консолі. Структура драйвера та призначення компонентів. Розробка структури алгоритму, програми налагодження драйвера. Опис змінних програми та роботи модулів програми.

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

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

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

removable:

jmp _unknown ;Остановить бит ОШИБКА и выйти

;Команда 16 : Вывод до занятости

output_busy:

jmp _unknown ;Установить бит ОШИБКА и выйти

;*************************************************************

;************ ВЫХОД ПО ОШИБКЕ И ОБЫЧНЫЙ ВЫХОД *******

;*************************************************************

_unknown:

or es:[bx].rh_status,8003h ;Остановить бит и код ошибки

jmp done ;Установить бит СДЕЛАНО и выйти

;*************************************************************

;********************* ОБЫЧНЫЙ ВЫХОД ******************

;*************************************************************

busy:

or es:[bx].rh_status,0200h ;Установить бит ЗАНЯТ

done:

or es:[bx].rh_status,0100h ;Установить бит СДЕЛАНО

call CT_OUT

pop di si cx dx bp es ds bx ax ;восстановить все регистры

ret ;Возврат в DOS

;***********************************************************

;********************** КОНЕЦ ПРОГРАММЫ ****************

;*************************************************************

;процедура - вызывается командой инициализации и действует

;только один раз. Сюда указывает "адрес конца". После инициализации

;память, занимаемая этой процедурой возвращается DOS.

initial proc near ;Вывод сообщения на консоль

mov ax, cs

mov ds, ax

lea dx, line ;Адрес выводимого сообщения

mov ah, 09h ;Вывод на экран

int 21h ;Вызов вывода строки

ret ;Возврат

initial endp

line db " Driver Console ",13,10

db " design by student group KS-07n",13,10

db " Voloshin Dmitriy Nikolaevich",'$'

console endp ;Конец процедуры CONSOLE

cseg ends ;Конец сегмента cseg

end begin ;Комец программы

Додаток Б

Лістінг програми відлагодження драйвера

#include<conio.h>

#include<stdio.h>

#include <dos.h>

#include <stdlib.h>

#include <bios.h>

extern "C" far void dev_strategy(void); // процедуры обращения к драйверу

extern "C" far void dev_interrupt(void);

struct Fix_rh { // фиксированная часть заголовка запроса

unsigned char Len,

Unit,

Cmd;

unsigned short Stat;

unsigned long Res1,

Res2;

};

struct { // команда инициализации 0

struct Fix_rh Fixed;

unsigned char NUnits;

unsigned short Brk_Ofs,

Brk_Seg,

Bpb_Tbo,

Bpb_Tbs;

unsigned char Dn_itr,

Msg_Flg;

} Init;

struct { // команда ввода 4

struct Fix_rh Fixed;

unsigned char Media;

unsigned short Buf_Ofs,

Buf_Seg,

Count,

Sector,

Vol_id_O,

Vol_id_S,

Sect32_O,

Sect32_S;

} Input;

struct { // nerazrushaiushiy vvod 5

struct Fix_rh Fixed;

unsigned char Return;

} Input_nd;

// выводимое драйвером сообщение

const char* Menu[]={" DRIVER TEST \n",

" \n",

" -------------------------------------- \n",

" | | \n",

" | 1. Initialization | \n",

" | 2. Input | \n",

" | 3. Input_nd | \n",

" | 4. Exit | \n",

" | | \n",

" -------------------------------------- \n",

" \n",};

// выводимое меню

unsigned short Outc = 40;

void init_drv(void); //

void input_drv(void); // обращение к драйверу с соответствующими запросами

char menu(void);

void wait();

void input_nd_drv(void);

void init_out();

void input_out();

void input_nd_out();

void show_buf();

char reg;

//main///

void main()

{

textbackground(8);

clrscr();

while(1)

{

clrscr();

gotoxy(1,1);

switch(reg=menu())

{

case '1':{init_drv();break;};

case '2':{input_drv();break;};

case '3':{input_nd_drv();break;};

case '4':exit(0);

};

};

};

char menu()

{

int i=0;

char ret;

textcolor(2);

_setcursortype(_NOCURSOR);

for(i=0;i < 11; i++)

printf("%s",Menu[i]);

gotoxy(1,24);

printf("Enter a regume: ");

ret=getch();

while((ret!='1')&&(ret!='2')&&(ret!='3')&&(ret!='4')) ret=getch();

clrscr();

return ret;

};

void init_drv(void)

{

Init.Fixed.Len=24;

Init.Fixed.Cmd=0;

Init.Fixed.Stat=0;

Init.Brk_Ofs=0;

Init.Brk_Seg=0;

init_out();

clrscr();

asm{

mov ax, ds

mov es, ax

mov bx, offset Init

}

dev_strategy();

dev_interrupt();

wait();

init_out();

}

void init_out()

{

clrscr();

printf("---------------------------------------------------------------\n");

printf("| Fixed part of header |\n");

printf("---------------------------------------------------------------\n");

printf("Len :%02X\n",Init.Fixed.Len);

printf("Unit :%02X\n",Init.Fixed.Unit);

printf("Cmd :%02X\n",Init.Fixed.Cmd);

printf("Status :%02X\n",Init.Fixed.Stat);

printf("---------------------------------------------------------------\n");

printf("| Variable part of header |\n");

printf("---------------------------------------------------------------\n");

printf("Brk_ofs :%02X\n",Init.Brk_Ofs);

printf("Brk_seg :%02X\n",Init.Brk_Seg);

wait();

};

void wait()

{

gotoxy(1,24);

printf("Press Enter to continue...");

while(getch()!=13);

};

void input_drv(void)

{

char * buf;

char *num;

asm{

push ax

push bx

push es

}

Input.Fixed.Len=30;

Input.Fixed.Cmd=4;

Input.Fixed.Stat=0;

num = (char*)malloc(255);

buf = (char *)malloc(255);

int Count = 0;

while(!Count)

{

clrscr();

gotoxy(5,10);

printf("Enter an input counter :");

gets( num );

Count = (int) atol (num);

if (Count<0) Count=0;

};

Input.Buf_Ofs = ( unsigned )buf;

Input.Buf_Seg = _DS;

Input.Count = Count;

clrscr();

gotoxy(1,1);

input_out();

clrscr();

printf("Enter %d simbols \n",Count);

asm{

mov ax, ds

mov es, ax

mov bx, offset Input

}

dev_strategy();

dev_interrupt();

buf[Count] = 0;

gotoxy(1,5);

printf("You have already entered : %s\n",buf);

printf("Code: ",buf);

for(int j = 0; j < Count; j++)

printf("%x ",buf[j]);

wait();

printf("\n");

input_out();

gotoxy(1,4);

asm{

pop es bx ax

}

}

void input_out()

{

clrscr();

printf("---------------------------------------------------------------\n");

printf("| Fixed part of header |\n");

printf("---------------------------------------------------------------\n");

printf("Len :%02X\n",Input.Fixed.Len);

printf("Unit :%02X\n",Input.Fixed.Unit);

printf("Cmd :%02X\n",Input.Fixed.Cmd);

printf("Status :%02X\n",Input.Fixed.Stat);

printf("---------------------------------------------------------------\n");

printf("| Variable part of header |\n");

printf("---------------------------------------------------------------\n");

printf("Bufer_offset :%02X\n",Input.Buf_Ofs);

printf("Bufer_segment :%02X\n",Input.Buf_Seg);

printf("Counter :%02X\n",Input.Count);

wait();

};

void input_nd_out()

{

clrscr();

printf("---------------------------------------------------------------\n");

printf("| Fixed part of header |\n");

printf("---------------------------------------------------------------\n");

printf("Len :%02X\n",Input_nd.Fixed.Len);

printf("Unit :%02X\n",Input_nd.Fixed.Unit);

printf("Cmd :%02X\n",Input_nd.Fixed.Cmd);

printf("Status :%02X\n",Input_nd.Fixed.Stat);

printf("---------------------------------------------------------------\n");

printf("| Variable part of header |\n");

printf("---------------------------------------------------------------\n");

printf("Return :%c\n",Input_nd.Return);

wait();};

void input_nd_drv()

{

Input_nd.Fixed.Len=14;

Input_nd.Fixed.Cmd=5;

Input_nd.Fixed.Stat=0;

Input_nd.Return='0';

input_nd_out();

clrscr();

printf("Press any key to check this command\n");

show_buf();

asm push ds

asm pop es

asm mov bx,offset Input_nd

dev_strategy();

dev_interrupt();

input_nd_out();

}

void show_buf()

{

int i;

int temp;

int golova;

int hvost;

int point;

printf("Buffer claviatyru");

asm{

push ax cx dx

mov ah,01h

xor cx,cx

xor dx,dx

int 1Ah

xor ax,ax

push es si di

}

c:

asm{

mov si,40h

push si

pop es

mov di,1Eh

}

gotoxy(1,3);

for(i=0;i<16;i++)

{

asm mov si, word ptr es:[di]

asm mov temp,si

printf("%04X",temp);

temp=temp&0x00FF;

printf(" - %c\n",temp);

asm mov point,di

asm push di

asm mov di,1Ah

asm mov si,word ptr es:[di]

asm mov golova,si

asm mov di,1Ch

asm mov si,word ptr es:[di]

asm pop di

asm mov hvost,si

asm add di,2

}

printf("adres golovi: %d\nadres hvosta: %d",golova,hvost);

asm{

int 1Ah

cmp dx,127

jl c

pop di

pop si

pop es

pop dx

pop cx

pop ax

}

}

Додаток В

Лістінг програми дослідження драйвера

.286

sseg segment stack 'stack'

dw 512 dup(?)

sseg ends

dseg segment 'data'

;********** Структуры запросов к драйверу ******************

rh struc ;Фиксированная структура заголовка

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

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

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

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

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

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

rh ends

_rh0 struc ;Заголовок запроса для команды 0

rh0_rh db size rh dup (?) ;фиксированная часть

rh0_nunits db ? ;Число устройств в группе (блоковые)

rh0_brk_ofs dw ? ;Смещение для конца

rh0_brk_seg dw ? ;Сегмент для конца

rh0_bpb_tbo dw ? ;Смещение указателя массива ВРВ

rh0_bpb_tbs dw ? ;Сегмент указателя массива ВРВ

rh0_dn_itr db ? ;Первый доступный накопитель (DOS 3+)

_rh0 ends

rh0 _rh0 ?

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

rh4_rh db size rh dup (?) ;фиксированная часть

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

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

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

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

;блоковых, байтов для символьных)

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

_rh4 ends

rh4 _rh4 ?

_rh5 struc ;Заголовок запроса для команды 5

rh5_rh db size rh dup (?) ;Фиксированная часть

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

_rh5 ends

rh5 _rh5 ?

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

rh8_rh db size rh dup (?) ;Фиксированная часть

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

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

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

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

;блоковых, байтов для символьных)

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

_rh8 ends

rh8 _rh8 ?

;*********** Сообщения вдводимые на экран ********************

no_reliz db 'Funkcia esho ne realizovana!'

len_no_reliz = $ - no_reliz

center db 'Operacia vipolnena! Nagmite enter dlia prodolgenia.'

len_center=$-center

mes_08h db 'Narmite klavishu dlia testa funkcii 08h.'

len_mes_08h = $ - mes_08h

mes_08h_ db 'Vu nagali klavishu: '

len_mes_08h_ = $ - mes_08h_

mes_08h_ext db 'Vu nagali funkcionalnyu klavishu, vid ee rashirennogo coda:'

len_mes_08h_ext = $ - mes_08h_ext

mes_0Bh db 'Nagmite liubyu klavishu dla testa funkcii 0Bh.'

len_mes_0Bh=$-mes_0Bh

mes_0Bh_NOT db 'Klavisha ne bula naghata.'

len_mes_0Bh_NOT = $ - mes_0Bh_NOT

mes_0Bh_YES db 'Klavisha bula naghata.'

len_mes_0Bh_YES = $- mes_0Bh_YES

mes_3Fh db 'Vvedite simvola dlia testa 3Fh.'

len_mes_3Fh = $ - mes_3Fh

mes_3Fh_ db 'Vu vveli:'

len_mes_3Fh_ = $ - mes_3Fh_

mes_3Fh_E db 'Buli vvedenu ne a simvolov.'

len_mes_3Fh_E = $ - mes_3Fh_E

Ctrl_Break db 'Naghat Ctrl+Break'

len_Ctrl_Break = $ - Ctrl_Break

mtop db ' *** TEST2 ***'

len_mtop=$-mtop

m1 db ' 0. Otkrut draiver consoli.'

len_m1=$-m1

m2 db ' 1. Zakrut vhodnoi potok ( klaviatura ).'

len_m2=$-m2

m3 db ' 2. Zakrut vihodnoi potok ( ekran ).'

len_m3=$-m3

m4 db ' 3. Ustanovit ASCII reghim raboti draivera.'

len_m4=$-m4

m5 db ' 4. Ustanovit Binary reghim raboti draivera.'

len_m5=$-m5

m6 db ' 5. Test funkcii ah = 08h int 21h.'

len_m6=$-m6

m7 db ' 6. Test funkcii ah = 0Bh int 21h.'

len_m7=$-m7

m8 db ' 7. Test funkcii ah = 3Fh int 21h.'

len_m8=$-m8

m9 db ' 8. Ustanovka standartnoro prerivania DOS: int 21h.'

len_m9=$-m9

m10 db ' 9. Zamena standartnogo preruvania DOS na smodelirovanniy obrabotchik.'

len_m10=$-m10

mbottom db ' Sdelaite svoi vubor.'

len_mbottom=$-mbottom

;****************** таблицы адресов *************************

ar_m dw mtop,m1,m2,m3,m4,m5,m6,m7,m8,m9,m10,mbottom

ar_len dw len_mtop,len_m1,len_m2,len_m3,len_m4,len_m5,len_m6,len_m7

dw len_m8,len_m9,len_m10,len_mbottom

ar_proc dw open_dev, close_dev0, close_dev1, set_ASCII, set_binary

dw test_08h, test_0Bh, test_3fh,RestoreVector21h,SetNewVector21h

time = 3 ;Задержка для теста функции 0Bh

con db 'CON ',0 ;Имя файла для открытия драйвера

fclosescr dw 0

fclosekeyb dw 0

;***************** буферок для тестируемых функций ***********

buf db 128 dup(?)

;==== Указатели на 21 вектор, пр. стратегии и прерывания драйвера ==

vec21h label dword ; INT 21H ADRESS

vec21h_off dw ?

vec21h_seg dw ?

callstrat label dword ; CON STRATEGY ADRESS

strat_off dw ?

strat_seg dw ?

callInterr label dword ; CON INTERRUPT ADRESS

inter_off dw ?

inter_seg dw ?

;============ адрес векторной таблици связи =================

vect_off dw ?

vect_seg dw ?

;======================================================

dseg ends

;################# CODE ##################

cseg segment 'code'

ASSUME ss:sseg, ds:dseg, cs:cseg

public _MAIN

_MAIN proc far

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

push ds

xor ax, ax

push ax

mov ax, dseg

mov ds, ax

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

call FindCon

call Save21h

menu:

call clrscr

xor bx, bx ;номер пункта

mov cx, 12 ;кол-во пунктов меню

xor dx, dx ;dh курсор строка; dl курсор колонка

menu_c:

;call gotoxy

mov si,ar_m[bx] ;Загрузка адресса выводимого пункта меню

mov di,ar_len[bx] ;Его длина

call print

add bx,2

inc dh

loop menu_c

rep_in:

mov ah,00h

int 16h ;взять символ

cmp al,27

je exit

sub al,30h

jl rep_in

cmp al,9

jg rep_in

cbw

mov di,ax

shl di,1

call ar_proc[di]

call wait_enter

jmp menu

exit:

call RestoreVector21h

ret

_MAIN endp

;******** OPEN / CLOSE CON **********

open_dev proc

push ax dx

mov ah, 3Dh ;можно также восспользоваться функцией

lea dx, con ;3C

int 21h

mov fclosescr, 0

mov fclosekeyb, 0

pop dx ax

ret

open_dev endp

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

close_dev0 proc ;Закрыть файл нулевого дескриптора (keyboard)

push ax bx

mov ah, 3Eh

xor bx, bx

int 21h

mov fclosekeyb, 1

pop bx ax

ret

close_dev0 endp

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

close_dev1 proc ;Закрыть файл первого дескриптора (screen)

push ax bx

mov ah, 3Eh

mov bx, 1

int 21h

mov fclosescr, 1

pop bx ax

ret

close_dev1 endp

;******* ASCII / binary mode choice ***************

set_binary proc

push ax bx dx

mov ax, 4400h

xor bx, bx

int 21h

or dx, 20h

mov ax, 4401h

xor dh, dh

int 21h

pop dx bx ax

ret

set_binary endp

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

set_ASCII proc

push ax bx dx

mov ax, 4400h

xor bx, bx

int 21h

and dl, 0DFh

mov ax, 4401h

xor dh, dh

int 21h

pop dx bx ax

ret

set_ASCII endp

;******************* Тесты функций ***********************

test_08h proc

push ax bx cx dx di si

mov dh, 14

lea si, mes_08h

mov di, len_mes_08h

call print

mov ah, 08h

int 21h

cmp al, 0

je ext

mov dh,18

lea si,mes_08h_

mov di,len_mes_08h_

call print

jmp end_08h

ext:

mov ah, 08h

int 21h

mov dh, 18

lea si, mes_08h_ext

mov di, len_mes_08h_ext

call print

end_08h:

mov dl,20

call gotoxy

mov cx, 1

xor bx, bx

mov ah, 0Ah

int 10h

pop si di dx cx bx ax

ret

test_08h endp

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

test_0Bh proc

push ax dx si di

mov dh, 15

lea si, mes_0Bh

mov di, len_mes_0Bh

call print

call pause

mov ah, 0Bh

int 21h

cmp al, 0

jne YES

mov dh, 16

lea si, mes_0Bh_NOT

mov di, len_mes_0Bh_NOT

call print

jmp m_end

YES:

mov dh, 16

lea si, mes_0Bh_YES

mov di, len_mes_0Bh_YES

call print

m_end:

pop di si dx ax

ret

test_0Bh endp

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

test_3Fh proc

push ax bx dx cx si di

mov cx, 5 ;Число запрашиваемых символов у функции

mov bx, cx

add bx, 30h

mov dh, 14

mov dl, 40

call gotoxy

lea si, mes_3Fh

mov byte ptr [si+8], bl

mov di, len_mes_3Fh

call print

mov ah, 3Fh

xor bx, bx

lea dx, buf

int 21h

jnc not_eror

jmp end_3fh ;Выход если ошибка при вып. функции

not_eror:

cmp ax, cx

je write_3Fh

mov dh, 16

lea si, mes_3Fh_E

mov bx, ax

add cx, 30h

add bx, 30h

mov byte ptr [si+20], bl

mov byte ptr [si+16], cl

lea si, mes_3Fh_E

mov di, len_mes_3Fh_E

call print

write_3Fh:

mov dh, 18

lea si, mes_3Fh_

mov di, len_mes_3Fh_

call print

lea si, buf

mov di, ax

mov dh, 19

call print

end_3Fh:

pop di si cx dx bx ax

ret

test_3Fh endp

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

;*************** Небольшие внутренние функции ****************

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

clrscr proc

push ax bx cx dx di es

mov ax,0B800h

mov es,ax

mov cx,2000

mov al,32

mov ah,7

xor di,di

rep stosw

mov ah,02h

mov bh,0

xor dx,dx

int 10h

pop es di dx cx bx ax

ret

clrscr endp

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

direct_output proc

;---------in DX must be symbol and DI - position

push es ax

mov ax,0b800h

mov es,ax

xor ax,ax

mov es:[di],dx

pop ax es

ret

endp direct_output

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

pause proc

push ax cx dx

mov ah, 01h ;обнулили счетчик тиков

xor cx, cx

xor dx, dx

int 1Ah

xor ax, ax

c_p:

int 1Ah

cmp dx, 18*time

jl c_p

pop dx cx ax

ret

pause endp

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

print proc ;si - адрес, di - длинна выводимой строки

push ax bx dx cx si di

mov cx,di

mov di,0

mov al,dh

cbw

mov bl,160

mul bl

mov dh,07h

;add al,dl

mov di,ax

nexts:

mov dl,ds:[si]

inc si

add di,2

call direct_output

loop nexts

pop di si cx dx bx ax

ret

print endp

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

wait_enter proc

push ax dx si di

mov dh, 24

xor dl, dl

call gotoxy

lea si, center

mov di, len_center

call print

wait_c:

xor ah, ah

int 16h

cmp al, 0Dh

jne wait_c

pop di si dx ax

ret

wait_enter endp

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

gotoxy proc near ;dh,dl - строка колонка

push ax bx

mov ah, 02h

xor bx, bx

int 10h

pop bx ax

ret

gotoxy endp

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

;############################################################

;===================================================

INTERRUPT_21H proc far

cmp ah,08h ;определяем функцию для вызова

jne nf1

call MY_08h

iret

nf1:

cmp ah,0Bh

jne nf2

call MY_0Bh

iret

nf2:

cmp ah,3Fh

jne nf3

call MY_3Fh

iret

nf3:

jmp dword ptr vec21h ;вызывам старый обработчик прерывания

INTERRUPT_21H endp

;========== Промоделированные функции ===================

MY_08h proc

push bx si es

cmp fclosekeyb, 1

mov al, 6 ;возвращает дос при обращении к закр. кл.

je Ret08h ;Выходим если клавиатура закрыта

mov ax, seg rh4

mov bx, offset rh4

mov es, ax

mov es:[bx].rh_cmd, 4

mov es:[bx].rh_status, 0

mov es:[bx].rh4_buf_seg, ax ;адрес буфера обмена

lea si, buf

mov es:[bx].rh4_buf_ofs, si

mov es:[bx].rh4_count, 1

call dword ptr callstrat

call dword ptr callInterr

mov al, [si]

Ret08h:

pop es si bx

ret

MY_08h endp

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

MY_0Bh proc

push bx cx dx si di es

xor al, al

cmp fclosekeyb, 1

je Ret0Bh

mov ax, seg rh5

mov bx, offset rh5

mov es, ax

mov es:[bx].rh_cmd, 5

mov es:[bx].rh_status, 0

mov es:[bx].rh5_return, 0

call dword ptr callstrat

call dword ptr callInterr

mov al, 0FFh

mov cx, es:[bx].rh_status

mov ah, es:[bx].rh5_return

cmp ah, 3

jne status

mov dh, 20

mov dl, 10

call gotoxy

lea si, Ctrl_Break

mov dh, 20

mov dl, 10

mov di, len_Ctrl_Break

call print

status:

test cx, 0200h

jz Ret0Bh

mov al, 0000h

Ret0Bh:

pop es di si dx cx bx

ret

MY_0Bh endp

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

MY_3Fh proc near

cmp bx, 0 ;bx - дескриптор

je _next

inc sp ;Удалим из стека адрес возврата из MY_3Fh

inc sp

jmp dword ptr vec21h

_next:

cmp fclosekeyb, 1

jne read3Fok

mov bx, sp

mov ax, ss:[bx+2+2+2] ;+2 +2+2- fl cs ip ip

or ax, 1 ;maska dla cf

mov ss:[bx+2+2+2], ax

ret

read3Fok:

push bx cx dx bp di si es

mov si, dx

mov ax, 4400h

xor bx, bx

int 21h

and dx, 20h

cmp dx, 20h ;проверка на бинарный режим

mov dx, si

mov ax, seg rh4

mov bx, offset rh4

mov es, ax

mov es:[bx].rh_cmd, 4

jne ASCII_3Fh

mov es:[bx].rh_status, 0

mov es:[bx].rh4_buf_seg, ds

mov es:[bx].rh4_buf_ofs, dx

mov es:[bx].rh4_count, cx

call dword ptr callstrat

call dword ptr callInterr

mov ax, cx

jmp exit_3Fh

ASCII_3Fh:

mov si, es

mov bp, vect_off

sub bp, 4

mov es, vect_seg

mov di, es:[bp]

cmp di, 0

jne BufToBuf

call write_buf

;***** Перезапись данных из системного буфера в програмный *****

BufToBuf:

mov bx,dx ;смещение адреса получателя

mov bp,es:[bp];смещение адреса источника

push cx

BufToBuf_:

mov al,es:[bp]

mov ds:[bx],al

cmp al,0Ah

je Symbol_0Ah

inc bp

inc bx

loop BufToBuf_

pop ax

mov bx,vect_off

mov es:[bx-4],bp

jmp exit_3Fh

Symbol_0Ah:

pop ax

sub ax,cx

inc ax

mov bx,vect_off

mov word ptr es:[bx-4],0

exit_3Fh:

pop es si di bp dx cx bx

ret

MY_3Fh endp

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

write_buf proc

;*************** Заполнение системного буфера ******************

push cx dx bp

mov di, es

xor bp, bp ;в bp колличество символов в буфере

mov es, si

mov si, 027Eh ;адресс начала сис. буфера

mov es:[bx].rh4_buf_seg, di

mov es:[bx].rh4_buf_ofs, si

mov es:[bx].rh4_count, 1

next_symbol:

mov es:[bx].rh_status, 0

call dword ptr callstrat

call dword ptr callInterr

cmp ah, 0FFh

jne no_ext_

xor ah, ah

jmp next_symbol

no_ext_:

push bx es

mov ah,3 ;\

int 10h ;| Текущее положение курсора в dx

mov es,di

mov al,es:[si]

pop es

cmp al,0

jne no_ext

pop bx

mov ah,0FFh

jmp next_symbol

no_ext:

cmp bp,127

je stop_

cmp al,8

je back_

cmp al,0Dh

je end_write_buf

jmp run_

stop_:

cmp al,8

je back_

cmp al,0Dh

je end_write_buf

pop bx

jmp next_symbol

run_:

mov cx,1 ;Вывод на экран только что прочитанного символа

xor bx,bx

mov ah,0Ah

int 10h

;|передвигаю курсор вправо

inc dl ;|

mov ah,2 ;/

int 10h

inc bp

inc si

pop bx

mov es:[bx].rh4_buf_ofs,si

jmp next_symbol

back_:

cmp bp,0

jne back

pop bx

jmp next_symbol

back:

dec bp

;|передвигаю курсор вправо

dec dl ;|

mov ah, 2 ;/

int 10h

mov cx, 1 ;Вывод на экран пробела

mov al, ' '

xor bx, bx

mov ah, 0Ah

int 10h

dec si

pop bx

mov es:[bx].rh4_buf_ofs, si

jmp next_symbol

end_write_buf:

mov es, di

mov byte ptr es:[si+1], 0Ah

mov bx, vect_off

mov es:[bx-4],027Eh

pop bx

pop bp dx cx

ret

write_buf endp

;#############################################################

FindCon proc

push ax bx cx es

mov ah, 52h ;Получаем адрес списка списков,

int 21h

mov vect_seg, es ;Запомним адресс векторной таблици

mov vect_off, bx ;связи

add bx, 0Ch ;по этому смещению лежит адресс CON драйвера

;установленного или резидентного

mov ax, es:[bx+2] ;смещение CON

mov cx, es:[bx] ;сегмент CON

mov es, ax

mov bx, cx

mov strat_seg, ax

mov inter_seg, ax

mov ax, es:[bx+6]

mov strat_off, ax

mov ax, es:[bx+8]

mov inter_off, ax

pop es cx bx ax

ret

FindCon endp

;************ GET / SET / RESTORE VECTOR 21h ****************

Save21h proc ;сохранили старый обработчик 21h прерывания

push ax bx dx es

xor ax,ax

mov es,ax

mov bx,21h

shl bx,2

cli

mov ax,es:[bx+2]

mov dx,es:[bx]

sti

mov vec21h_seg,ax

mov vec21h_off,dx

pop es dx bx ax

ret

Save21h endp

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

SetNewVector21h proc ;установить новый обработчик 21h прерывания

push ax bx dx es

xor ax,ax

mov es,ax

mov bx,21h

shl bx,1

shl bx,1

mov ax,seg INTERRUPT_21H ;сегмент нового обработчика

mov dx,offset INTERRUPT_21H ;смещение нового обработчика

cli

mov es:[bx+2],ax

mov es:[bx],dx

sti

pop es dx bx ax

ret

SetNewVector21h endp

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

RestoreVector21h proc

push ax bx dx es

xor ax, ax

mov es, ax

mov bx, 21h

shl bx, 1

shl bx, 1

mov ax, vec21h_seg ;сегмент старого обработчика

mov dx, vec21h_off ;смещение старого обработчика

cli

mov es:[bx+2],ax

mov es:[bx],dx

sti

pop es dx bx ax

ret

RestoreVector21h endp

cseg ends

end _MAIN

Додаток Г

Лістінг програми формування списку встановлених драйверів

program test3;

uses crt;

type

drvptr=^drvhead;

drvhead=record

next:drvptr;

attrib:word;

strategy:word;

interupt:word;

name:array[1..8] of char;

end;

const tab=' ';

constr:array[1..11] of char=('C','O','N',' ',' ',' ',' ',' ',' ',' ',' ');

var drvtab:array[1..50] of drvptr;

num:byte;

fdel:boolean;

count:byte;

kol:byte;

chs:char;

segm,ofs:word;

f:byte;

drsegm,drofs:word;

label nextf,nextf_,endf;

procedure wrhex(num:word);

var s:string[4];

i:byte;

hex:string[16];

begin

hex:='0123456789ABCDEF';

s[0]:=chr(4);

for i:=4 downto 1 do

begin

s[i]:=hex[(num and $0f)+1];

num:=num shr 4;

end;

write(s);

end;

procedure wrdrv(i:byte);

var

wdrv:array[1..50,1..2] of word absolute drvtab;

begin

with drvtab[i]^ do

begin

write(' |',i:3,' |');

Wrhex(wdrv[i,2]);

write(':');

wrhex(wdrv[i,1]);

write('| ');

wrhex(attrib);write(' |');

if boolean(attrib shr 15) then

write(name[1],name[2],name[3],name[4],name[5],name[6],name[7],name[8],'|')

else

write('Blckdrv',byte(name[1]),'|');

wrhex(wdrv[i+1,2]);

write(':');

wrhex(wdrv[i+1,1]);

write('| ');

wrhex(strategy);

write(' | ');

wrhex(interupt);

write(' |');

end

end;

procedure print_drv;

label jex,jexit;

var

ch:char;

i,en,beg:byte;

drv:drvptr;

f:boolean;

num:byte;

wdrv:array[1..50,1..2] of word absolute drvtab;

begin

clrscr;

asm

mov ah,52h

int 21h

add bx,22h

mov ax,es

mov word ptr drv+2,ax

mov word ptr drv,bx

end;

kol:=1;

f:=true;

while f do

begin

drvtab[kol]:=drv;

drv:=drv^.next;

asm

cmp word ptr drv,-1

jne jex

xor ax,ax

mov byte ptr f,al

jmp jexit

jex: inc kol

jexit:

end;

end;

writeln(' ------------------------------------------------------------');

writeln(' |Number| Adress | Attr | Name | Next | Strat |Intrpt|');

writeln(' ------------------------------------------------------------');

for i:=1 to kol do

begin

wrdrv(i);

writeln;

end;

writeln(' ------------------------------------------------------------');

end;

function del_drv:byte;

var num:byte;

j,cnt1,cnt2:byte;

found:boolean;

fname:boolean;

wdrv:array[1..50,1..2] of word absolute drvtab;

const

con:array[1..8] of char=('C','O','N',' ',' ',' ',' ',' ');

begin

print_drv;

fdel:=false;

found:=false;

count:=0;

fname:=true;

gotoxy(1,24);

write('Before Deleting...');

readkey;

num:=1;

while num<kol do

begin

fname:=true;

for j:=1 to 8 do

if (fname) and(drvtab[num]^.name[j]=con[j]) then

fname:=true

else

begin

fname:=False;

break;

end;

if fname then

begin

count:=count+1;

if count=1 then

cnt1:=num; {number first!!!}

if count=2 then

begin

cnt2:=num; {number 2 }

ofs:=wdrv[cnt2,1]; {Remember segment and offset}

segm:=wdrv[cnt2,2]; {---------------------------}

end;

end;

num:=num+1;

end;

asm

mov ax,5200h

int 21h

add bx,0ch

mov ax,ofs

mov word ptr es:[bx],ax

mov ax,segm

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

mov bx,drofs

mov es,drsegm

mov ax,ofs{0016h}

mov word ptr es:[bx],ax

mov ax,segm{0070h}

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

end;

begin

drvtab[cnt1-1]^.next:=drvtab[cnt1]^.next;

asm

mov ax,5200h

int 21h

add bx,0ch

mov ax,-1

mov word ptr es:[bx],ax

mov es:[bx+2],ax

mov bx,drofs

mov es,drsegm

mov es:[bx],ax

mov es:[bx+2],ax

end;

end;

print_drv;

gotoxy(1,24);

write('Driver succesfull deleted! Press any key to continue...');

readkey;

end;

function menu:char;

var ch:char;

begin

clrscr;

gotoxy(1,5);

writeln(tab,'----------Main Menu------------');

writeln;

writeln(tab,'1. Print list of drivers');

writeln(tab,'2. Delete CON driver from system ');

writeln(tab,'ESC => Exit');

gotoxy(1,24);

write('Enter a regime...');

repeat

ch:=readkey;

until (ch=chr(27)) or(ch='1') or (ch='2');

if ch=chr(27) then ch:='3';

menu:=ch;

end;

begin

f:=0;

asm

mov ax,5200h

int 21h

add bx,4

mov ax,es:[bx]

mov ofs,ax

mov ax,es:[bx+2]

mov segm,ax

mov bx,ofs

mov es,segm

add bx,6

mov cx,es:[bx-2]

nextf:

mov di,bx

add di,32

lea si,constr

push cx

mov cx,11

repe cmpsb

pop cx

jnz nextf_

mov f,1

mov ax,es

mov drsegm,ax

mov ax,bx

add ax,7

mov drofs,ax

xor ax,ax

int 16h

jmp endf

nextf_:

add bx,59

loop nextf

endf:

end;

count:=0;

writeln;

repeat

chs:=menu;

case chs of

'1':

begin

print_drv;

gotoxy(1,24);

write('Press any key to continue...');

readkey;

end;

'2':del_drv;

end;

until chs='3';

clrscr;

end.

Размещено на Allbest.ru


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

  • Розробка програми для вирішення графічної задачі. При вирішенні задачі необхідно cтворювати програму у середовищі програмування Turbo Pascal. Розробка алгоритму функціонування програми і надання блок-схеми алгоритму. Демонстрація роботи програми.

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

  • Зростання ролі світлодіодного освітлення. Застосування надяскравих світлодіодів. Огляд драйверів живлення світлодіодних світильників. Опис роботи мікроконтролера на мікросхемі VIPer17 по схемі функціональній. Схема принципова драйвера білих світлодіодів.

    дипломная работа [2,2 M], добавлен 22.04.2011

  • Створення програми для роботи з веб-камерою з автоматичним визначенням встановленої камери на комп'ютері. Характеристика апаратної конфігурації програми. Опис мови і середовища програмування. Розробка алгоритму, інструкції для програміста та користувача.

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

  • Аналіз предметної області і постановка задачі на розробку програми для автоматизації роботи автопідприємства. Перелік та опис використаних компонентів та основних процедур програми. Опис структур та методів обробки даних. Інструкція для користувача.

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

  • Розробка та схема алгоритму проектованої гри. Особливості мови програмування та середовища "Microsoft Visual Studio C++ 2008 Express Edition". Лістинг програми та загальний опис її роботи, аналіз отриманих результатів та оцінка практичної ефективності.

    курсовая работа [762,8 K], добавлен 03.05.2015

  • Призначення менеджеру пристроїв. Обґрунтування вибору мови програмування. Розробка структурної схеми і опис діалогового інтерфейсу програми. Блок-схема програмного додатку, основні функції і алгоритм його роботи. Методики і інструкція його тестування.

    курсовая работа [3,4 M], добавлен 17.11.2014

  • Проектування програми керування мікропроцесорним пристроєм світлової індикації на мові С та Assembler. Розробка алгоритму роботи програми, структурної та електричної принципових схем. Здійснення комп’ютерного моделювання для перевірки розроблених програм.

    курсовая работа [710,7 K], добавлен 04.12.2014

  • Теоретичні відомості про язик С++. Розробка програми, що виконує основні арифметичні дії над простими та складними числами на язику С++. Опис алгоритму програми та її код. Інструкція по користуванню. Обгрунтовування вибору та складу технічних засобів.

    курсовая работа [852,8 K], добавлен 30.11.2011

  • Алгоритмічна мова програмування універсального призначення Turbo Pascal. Розробка і створення програми для гри "Шибениця". Алгоритм функціонування программи, блок-схема алгоритму. Використання додаткових модулів Graph та Crt у процессі створення програми.

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

  • Розробка ігрового додатку за технологією IDE Visual Studio та WPF. Опис вхідної та вихідної інформації. Назва та призначення модулів програми. Основні поля класу, необхідні для ігрової логіки. Блок-схема алгоритму гри. Інструкція з експлуатації системи.

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

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