Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Assembler > НЕ Резидентный драйвер клавиатуры


Автор: Dushes 26.02.07, 16:43
Уважаемы спецы .... Выручайте, препод сказал написать програмку не резидентнго драйвера клавиатуры, который выполняет запросы прикладных прог по вводу символов с клавы .... Ранее писал олько относительно простенькие прогрмуленки .....

И ещё для проверки работоспособности драйвера использовать прикладную прогу , которая , используя драйвер клавиатуры, выполняет ввод символьной строки с клавиатуры в свой внутрений буфер.

1) Правельно ли я понял ? программы должно быть две ? (два com файла)
2) С чего ваще начать , как ваще выглядят эти не резедентные драйвера ?

Автор: AndNot 26.02.07, 17:28
Цитата Dushes @
написать програмку не резидентнго драйвера клавиатуры

:wacko: Это как понимать? Может имеется драйвер дос? Неужели до сих пор такое могут задать?
Цитата Dushes @
который выполняет запросы прикладных прог по вводу символов с клавы ....

Какие? Ввод символа, ввод строки и тд.?
Цитата Dushes @
Правельно ли я понял ? программы должно быть две ? (два com файла)

Если требуется драйвер доса, то он имеет формат SYS.
Цитата Dushes @
2) С чего ваще начать , как ваще выглядят эти не резедентные драйвера ?

Самим бы хотелось бы узнать :D Даже дос-дрова по сути резиденты.

Автор: e-moe 26.02.07, 19:03
Цитата AndNot @
:wacko: Это как понимать? Может имеется драйвер дос? Неужели до сих пор такое могут задать?

еще и как %)
сам писал замещающий драйвер CON ;)

Автор: AndNot 26.02.07, 19:11
Цитата e-moe @
сам писал замещающий драйвер CON

Охренеть :huh:
Dushes, посмотрю, где то был. Если найду, там подправить пара минут. Еще пара написать
Цитата Dushes @
прикладную прогу , которая , используя драйвер клавиатуры
:D

Автор: e-moe 26.02.07, 19:47
Цитата AndNot @
Цитата (e-moe @ Сегодня, 21:03)
Цитата
сам писал замещающий драйвер CON

Охренеть :huh:

самое забавное было во время работы ДОСа, без перезагрузки, заставить ОСь переключиться на стандартный драйвер вместо моего %)

Автор: Dushes 27.02.07, 05:13
:huh: хм ....

ну дак я не понял програмки то две должно быть, одна драйвер, другая проверяющяя его ?

Автор: 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, а сам "неризидентный" драйвер - это просто набор функций, работающих по принципу опроса портов клавы :wacko:
хотя клава в системе без IRQ - это вобще шо попало.

ужос :o

ну или запрет IRQ1, замещение int9 пустышкой, земещение int16h собственным обработчиком

Автор: AndNot 04.03.07, 09:40
Цитата Barbosman @
но мне че то кажется, что это должно быть замещение обработчиков прерываний int 9, int 16h

Никто не запрещает, но зачем? Биос и так за нас всю работу сделает.
Цитата Barbosman @
а сам "неризидентный" драйвер - это просто набор функций, работающих по принципу опроса портов клавы

Нет. Совсем нет. От драйвера требуется обеспечить "прослойку" между железом и дос, а как он это будет делать - никого не волнует. Если есть возможность - лучше через биос.
Цитата Barbosman @
ну или запрет IRQ1, замещение int9 пустышкой, земещение int16h собственным обработчиком

И что получится? :wacko:

Автор: Barbosman 04.03.07, 12:27
прикольно получится :lol:
препод же человеку дал задание.

вобще преподы иногда жгут :D

Автор: AndNot 04.03.07, 13:49
Цитата Barbosman @
прикольно получится
препод же человеку дал задание.

Препод дал задание написать драйвер, а не обработчики прерываний. Разница то есть.

Автор: Barbosman 05.03.07, 06:35
это уже типа философский спор - кто появился раньше яицо или курицо :D

я пас

Автор: 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
Надо в правила, что ли, добавить...

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)