Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.76.135] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Уважаемы спецы .... Выручайте, препод сказал написать програмку не резидентнго драйвера клавиатуры, который выполняет запросы прикладных прог по вводу символов с клавы .... Ранее писал олько относительно простенькие прогрмуленки .....
И ещё для проверки работоспособности драйвера использовать прикладную прогу , которая , используя драйвер клавиатуры, выполняет ввод символьной строки с клавиатуры в свой внутрений буфер. 1) Правельно ли я понял ? программы должно быть две ? (два com файла) 2) С чего ваще начать , как ваще выглядят эти не резедентные драйвера ? |
Сообщ.
#2
,
|
|
|
Цитата Dushes @ написать програмку не резидентнго драйвера клавиатуры Это как понимать? Может имеется драйвер дос? Неужели до сих пор такое могут задать? Цитата Dushes @ который выполняет запросы прикладных прог по вводу символов с клавы .... Какие? Ввод символа, ввод строки и тд.? Цитата Dushes @ Правельно ли я понял ? программы должно быть две ? (два com файла) Если требуется драйвер доса, то он имеет формат SYS. Цитата Dushes @ 2) С чего ваще начать , как ваще выглядят эти не резедентные драйвера ? Самим бы хотелось бы узнать Даже дос-дрова по сути резиденты. |
Сообщ.
#3
,
|
|
|
Цитата AndNot @ Это как понимать? Может имеется драйвер дос? Неужели до сих пор такое могут задать? еще и как %) сам писал замещающий драйвер CON |
Сообщ.
#4
,
|
|
|
Цитата e-moe @ сам писал замещающий драйвер CON Охренеть Dushes, посмотрю, где то был. Если найду, там подправить пара минут. Еще пара написать Цитата Dushes @ прикладную прогу , которая , используя драйвер клавиатуры |
Сообщ.
#5
,
|
|
|
Цитата AndNot @ Цитата (e-moe @ Сегодня, 21:03) Цитата сам писал замещающий драйвер CON Охренеть самое забавное было во время работы ДОСа, без перезагрузки, заставить ОСь переключиться на стандартный драйвер вместо моего %) |
Сообщ.
#6
,
|
|
|
хм ....
ну дак я не понял програмки то две должно быть, одна драйвер, другая проверяющяя его ? |
Сообщ.
#7
,
|
|
|
Цитата Dushes @ ну дак я не понял програмки то две должно быть, одна драйвер, другая проверяющяя его ? Да. О драйверах у Фролова поищи, помню он где то писал. Сайт без проблем в Гугле найдешь. |
Сообщ.
#8
,
|
|
|
Что значит не резидентный драйвер? Это SYS или что?
В ДОС нельзя одновременно запустить 2 программы чтобы они общались между собой, при условии что ни одна из них не резидентна. Не ясно что сделать надо... |
Сообщ.
#9
,
|
|
|
Вот наскрябал на скору руку:
; файл kbddrv.asm ; tasm /m3 kbddrv ; tlink kbddrv ; exetobin kbddrv ideal model tiny codeseg org 0 EntryPoint: ; тасм не может без этого KEYBUF_SIZE equ 20h ; заголовок драйвера dd -1 ; поле связи со следующим драйвером dw 1000100000000010b ; атpибуты дpайвеpа dw Func_Strat ; подпрограмма стратегии dw Func_Intr ; подпрограмма прерывания db 'KBDDRV ' ; имя драйвера functab: dw Init ; функция 0: инициализация dw Dummy ; функция 1: пpовеpка носителя dw Dummy ; функция 2: создать BPB dw NotSupport ; функция 3: чтение с контpолем в/в dw Read ; функция 4: чтение dw Get ; функция 5: ненаpушающее чтение dw Dummy ; функция 6: состояние ввода dw Clear ; функция 7: очистить буфеp ввода dw NotSupport ; функция 8: запись dw NotSupport ; функция 9: запись с веpификацией dw NotSupport ; функция 10: состояние вывода dw NotSupport ; функция 11: очистить буфеp вывода dw NotSupport ; функция 12: запись с контpолем в/в dw Dummy ; функция 13: откpыть (dos 3.0 и выше) dw Dummy ; функция 14: закpыть dw Dummy ; функция 15: сменяемый носитель dw NotSupport ; функция 16: выводить, пока не будет занято BlockPtr dd ? ; адрес переданного блока данных Head dw 0 Tail dw 0 KeyBuf db KEYBUF_SIZE dup(?) ; внутренний буфер для приема символов ; подпрограмма стратегии proc Func_Strat far ; просто сохраняем адрес блока данных mov [word cs:BlockPtr+2], es mov [word cs:BlockPtr], bx ret endp ; подпрограмма прерывания proc Func_Intr far pushf push ax bx cx dx si di bp ds es ; настраиваем сегментный регистр данных push cs pop ds ; получаем адрес блока данных les di, [BlockPtr] ; переходим на требуюмую функцию xor bh, bh mov bl, [es: di+2] ; bx - номер функции cmp bl, 16 ; 16 - макс. номер функции jbe @@jmptofunc ; <- все ОК mov ax, 8003h ; код - ошибка: неправильная команда jmp @@quit @@jmptofunc: shl bx, 1 call [word functab+bx] ; вызываем функцию les di, [BlockPtr] @@quit: or ax, 100h ; устанавливаем бит окончания операции mov [es: di+3], ax ; сохраняем статус pop es ds bp di si dx cx bx ax popf ret endp ; пустышка proc Dummy near xor ax, ax ; очищаем бит занятости ret endp ; извещает о неподдерживаемых функциях proc NotSupport near mov ax, 8003h ; код - ошибка: неправильная команда ret endp ; сохраняет символ во внутренний буфер proc storechar near mov [KeyBuf+bx], al inc bx cmp bx, KEYBUF_SIZE jne @@end xor bx, bx @@end: ret endp ; читает символ с внутреннего буфера proc loadchar near mov al, [KeyBuf+si] inc si cmp si, KEYBUF_SIZE jne @@end xor si, si @@end: ret endp ; функция 4: чтение заданного количества символов proc Read near push es di mov cx, [es: di+18] ; cx - количество символов jcxz @@end ; если 0 то выходим les di, [es: di+14] ; es:di - адрес символьного буфера mov bx, [Head] ; si,bx - состояние внутреннего буфера mov si, [Tail] cld ; будем использовать STOSB @@read: cmp si, bx ; буфер пуст? jne @@inbuff ; <- нет, читаем из него @@getkey: xor ah, ah ; считываем символ с буфера клавиатуры int 16h call storechar ; сохраняем во внутренний буфер or al, al ; не расширенный ли код пришел? jnz @@inbuff ; <- нет mov al, ah ; сохраняем расширенный код call storechar @@inbuff: call loadchar stosb ; отправляем символ в буфер loop @@read ; повторяем, пока не считаем все требуемые символы mov [Head], bx ; сохраняем значения внутреннего буфера mov [Tail], si @@end: pop di es xor ax, ax ret endp ; функция 5: ненаpушающее чтение proc Get near ; проверяем внутренний буфер на наличие не считанных символов mov si, [Tail] mov al, [KeyBuf+si] cmp si, [Head] jne @@store ; внутренний буфер пуст, читаем с буфера клавиатуры @@getkey: mov ah, 1 ; проверяем буфер клавиатуры на наличие int 16h ; несчитанных символов jz @@error @@store: mov [es: di+13], al ; сохраняем символ в блоке данных xor ax, ax ; все OK ret @@error: mov ax, 100h ; устанавливаем признак занятости (нет символа) ret endp ; функция 7: очистить буфеp ввода proc Clear near ; очищаем буфер клавиатуры mov ah, 1 ; проверяем буфер клавиатуры на наличие int 16h ; несчитанных символов jz @@end xor ah, ah ; считываем int 16h jmp Clear ; повторяем, пока не считаем все символы @@end: xor ax, ax ; все OK ; очищаем и внутренний буфер mov [Tail], ax mov [Head], ax ret endp ; инициализация драйвера proc Init near ; устанавливаем конечный адрес драйвера ; поскольку инициализация больше не потребуется, отбрасываем и эту подпрограмму lea ax, [Init] mov [es: di+14], ax mov [es: di+16], cs xor ax, ax ; все ОК ret endp end EntryPoint А вот проверка его работоспособности: ; file: test.asm ; tasm /m3 test ; tlink /t test ideal model tiny locals macro print msgs local l call l db msgs,13,10,'$' l: pop dx mov ah, 9 int 21h endm dataseg drvname db 'KBDDRV',0 buff db 4 dup(?) db 13,10,'$' codeseg startupcode print "start programm" mov ax, 3D00h lea dx, [drvname] int 21h jnc read print "driver not found!" ret read: mov bx, ax print "drive found, enter 4 symbols: " mov ah, 3fh mov cx, 4 lea dx, [buff] int 21h jc close mov ah, 9 int 21h close: mov ah, 3Eh int 21h print "drive close" print "bye!" ret end Только если будешь проверять, не забудь в config.sys рописать DEVICE=KBDDRV.SYS В аттаче утилитка exetobin и небольшая дока по драйверам. Прикреплённый файлATTACH.ZIP (6.89 Кбайт, скачиваний: 138) |
Сообщ.
#10
,
|
|
|
драйверами вобщем то никада не занимался, но мне че то кажется, что это должно быть замещение обработчиков прерываний int 9, int 16h допустим пустышками, запрещение IRQ1, а сам "неризидентный" драйвер - это просто набор функций, работающих по принципу опроса портов клавы
хотя клава в системе без IRQ - это вобще шо попало. ужос ну или запрет IRQ1, замещение int9 пустышкой, земещение int16h собственным обработчиком |
Сообщ.
#11
,
|
|
|
Цитата Barbosman @ но мне че то кажется, что это должно быть замещение обработчиков прерываний int 9, int 16h Никто не запрещает, но зачем? Биос и так за нас всю работу сделает. Цитата Barbosman @ а сам "неризидентный" драйвер - это просто набор функций, работающих по принципу опроса портов клавы Нет. Совсем нет. От драйвера требуется обеспечить "прослойку" между железом и дос, а как он это будет делать - никого не волнует. Если есть возможность - лучше через биос. Цитата Barbosman @ ну или запрет IRQ1, замещение int9 пустышкой, земещение int16h собственным обработчиком И что получится? |
Сообщ.
#12
,
|
|
|
прикольно получится
препод же человеку дал задание. вобще преподы иногда жгут |
Сообщ.
#13
,
|
|
|
Цитата Barbosman @ прикольно получится препод же человеку дал задание. Препод дал задание написать драйвер, а не обработчики прерываний. Разница то есть. |
Сообщ.
#14
,
|
|
|
это уже типа философский спор - кто появился раньше яицо или курицо
я пас |
Сообщ.
#15
,
|
|
|
Пример реализации драйвера есть здесь http://www.escolero.ru/shop/12/Programmiro...era_klaviatury/
|