На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> НЕ Резидентный драйвер клавиатуры
    Уважаемы спецы .... Выручайте, препод сказал написать програмку не резидентнго драйвера клавиатуры, который выполняет запросы прикладных прог по вводу символов с клавы .... Ранее писал олько относительно простенькие прогрмуленки .....

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

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

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

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

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

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

        еще и как %)
        сам писал замещающий драйвер CON ;)
          Цитата e-moe @
          сам писал замещающий драйвер CON

          Охренеть :huh:
          Dushes, посмотрю, где то был. Если найду, там подправить пара минут. Еще пара написать
          Цитата Dushes @
          прикладную прогу , которая , используя драйвер клавиатуры
          :D
            Цитата AndNot @
            Цитата (e-moe @ Сегодня, 21:03)
            Цитата
            сам писал замещающий драйвер CON

            Охренеть :huh:

            самое забавное было во время работы ДОСа, без перезагрузки, заставить ОСь переключиться на стандартный драйвер вместо моего %)
            Сообщение отредактировано: e-moe -
              :huh: хм ....

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

                Да. О драйверах у Фролова поищи, помню он где то писал. Сайт без проблем в Гугле найдешь.
                  Что значит не резидентный драйвер? Это SYS или что?
                  В ДОС нельзя одновременно запустить 2 программы чтобы они общались между собой, при условии что ни одна из них не резидентна.
                  Не ясно что сделать надо...
                    Вот наскрябал на скору руку:
                    ExpandedWrap disabled
                      ; файл 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

                    А вот проверка его работоспособности:
                    ExpandedWrap disabled
                      ; 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 рописать
                    ExpandedWrap disabled
                      DEVICE=KBDDRV.SYS

                    В аттаче утилитка exetobin и небольшая дока по драйверам.
                    Прикреплённый файлПрикреплённый файлATTACH.ZIP (6.89 Кбайт, скачиваний: 134)
                      драйверами вобщем то никада не занимался, но мне че то кажется, что это должно быть замещение обработчиков прерываний int 9, int 16h допустим пустышками, запрещение IRQ1, а сам "неризидентный" драйвер - это просто набор функций, работающих по принципу опроса портов клавы :wacko:
                      хотя клава в системе без IRQ - это вобще шо попало.

                      ужос :o

                      ну или запрет IRQ1, замещение int9 пустышкой, земещение int16h собственным обработчиком
                      Сообщение отредактировано: Barbosman -
                        Цитата Barbosman @
                        но мне че то кажется, что это должно быть замещение обработчиков прерываний int 9, int 16h

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

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

                        И что получится? :wacko:
                          прикольно получится :lol:
                          препод же человеку дал задание.

                          вобще преподы иногда жгут :D
                            Цитата Barbosman @
                            прикольно получится
                            препод же человеку дал задание.

                            Препод дал задание написать драйвер, а не обработчики прерываний. Разница то есть.
                              это уже типа философский спор - кто появился раньше яицо или курицо :D

                              я пас
                                Пример реализации драйвера есть здесь http://www.escolero.ru/shop/12/Programmiro...era_klaviatury/
                                  Некрофилия детектед...
                                    Надо в правила, что ли, добавить...
                                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                    0 пользователей:


                                    Рейтинг@Mail.ru
                                    [ Script execution time: 0,0470 ]   [ 16 queries used ]   [ Generated: 16.04.24, 16:43 GMT ]