Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Assembler > НЕ Резидентный драйвер клавиатуры |
Автор: Dushes 26.02.07, 16:43 |
Уважаемы спецы .... Выручайте, препод сказал написать програмку не резидентнго драйвера клавиатуры, который выполняет запросы прикладных прог по вводу символов с клавы .... Ранее писал олько относительно простенькие прогрмуленки ..... И ещё для проверки работоспособности драйвера использовать прикладную прогу , которая , используя драйвер клавиатуры, выполняет ввод символьной строки с клавиатуры в свой внутрений буфер. 1) Правельно ли я понял ? программы должно быть две ? (два com файла) 2) С чего ваще начать , как ваще выглядят эти не резедентные драйвера ? |
Автор: AndNot 26.02.07, 17:28 |
Это как понимать? Может имеется драйвер дос? Неужели до сих пор такое могут задать? Какие? Ввод символа, ввод строки и тд.? Если требуется драйвер доса, то он имеет формат SYS. Самим бы хотелось бы узнать Даже дос-дрова по сути резиденты. |
Автор: e-moe 26.02.07, 19:03 |
еще и как %) сам писал замещающий драйвер CON |
Автор: AndNot 26.02.07, 19:11 |
Охренеть Dushes, посмотрю, где то был. Если найду, там подправить пара минут. Еще пара написать |
Автор: e-moe 26.02.07, 19:47 |
самое забавное было во время работы ДОСа, без перезагрузки, заставить ОСь переключиться на стандартный драйвер вместо моего %) |
Автор: Dushes 27.02.07, 05:13 |
хм .... ну дак я не понял програмки то две должно быть, одна драйвер, другая проверяющяя его ? |
Автор: AndNot 27.02.07, 06:52 |
Цитата Dushes @ ну дак я не понял програмки то две должно быть, одна драйвер, другая проверяющяя его ? Да. О драйверах у Фролова поищи, помню он где то писал. Сайт без проблем в Гугле найдешь. |
Автор: cppasm 27.02.07, 08:39 |
Что значит не резидентный драйвер? Это SYS или что? В ДОС нельзя одновременно запустить 2 программы чтобы они общались между собой, при условии что ни одна из них не резидентна. Не ясно что сделать надо... |
Автор: AndNot 27.02.07, 11:44 |
Вот наскрябал на скору руку: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> ; файл 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 А вот проверка его работоспособности: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> ; 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 рописать <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> DEVICE=KBDDRV.SYS В аттаче утилитка exetobin и небольшая дока по драйверам. |
Автор: Barbosman 03.03.07, 09:11 |
драйверами вобщем то никада не занимался, но мне че то кажется, что это должно быть замещение обработчиков прерываний int 9, int 16h допустим пустышками, запрещение IRQ1, а сам "неризидентный" драйвер - это просто набор функций, работающих по принципу опроса портов клавы хотя клава в системе без IRQ - это вобще шо попало. ужос ну или запрет IRQ1, замещение int9 пустышкой, земещение int16h собственным обработчиком |
Автор: AndNot 04.03.07, 09:40 |
Цитата Barbosman @ но мне че то кажется, что это должно быть замещение обработчиков прерываний int 9, int 16h Никто не запрещает, но зачем? Биос и так за нас всю работу сделает. Цитата Barbosman @ а сам "неризидентный" драйвер - это просто набор функций, работающих по принципу опроса портов клавы Нет. Совсем нет. От драйвера требуется обеспечить "прослойку" между железом и дос, а как он это будет делать - никого не волнует. Если есть возможность - лучше через биос. Цитата Barbosman @ ну или запрет IRQ1, замещение int9 пустышкой, земещение int16h собственным обработчиком И что получится? |
Автор: Barbosman 04.03.07, 12:27 |
прикольно получится препод же человеку дал задание. вобще преподы иногда жгут |
Автор: AndNot 04.03.07, 13:49 |
Препод дал задание написать драйвер, а не обработчики прерываний. Разница то есть. |
Автор: Barbosman 05.03.07, 06:35 |
это уже типа философский спор - кто появился раньше яицо или курицо я пас |
Автор: deepstyle 08.11.17, 12:10 |
Пример реализации драйвера есть здесь http://www.escolero.ru/shop/12/Programmiro...era_klaviatury/ |
Автор: Akina 08.11.17, 16:30 |
Некрофилия детектед... |
Автор: Jin X 09.11.17, 08:10 |
Надо в правила, что ли, добавить... |