Приветствую всех! Вобщем задача такая : резидентная прога сидит в памяти и при нажатии F11 сохраняет содержимое видеопамяти в файл. как делал : перехватываю int28 , в нём проверяю содержимое порта клавы на наличие кода F11 и если это так, то создаю файл... Проблема : прога не пашет под виртуальной машиной (dos) wmware. Может проблема и не в коде, но я не знаю что ещё может быть... Вот код : | Код | .186 .MODEL tiny .CODE .STARTUP jmp begin old_int28h dd 0 old_int2Fh dd 0 fname db 'qwerty.tmp',0
new_int2Fh proc far cmp ax,0FF00h jz installed jmp dword ptr cs:old_int2Fh installed: mov ax,00FFh iret new_int2Fh endp
new_int28h proc far pusha ; сохранение регистров in al,60h ; читаем содержимое порта клавиатуры cmp al,57h ; F11 ? jne no xor al,80h ; Удаляем код F11 из порта out 60h,al push cs pop ds mov dx,offset fname mov ah,3ch xor cx,cx int 21h ; Создание файла
mov bx,ax ; В bx описатель файла mov ax,0B800h mov ds,ax ; в ds - адрес видепамяти mov cx,0FA0h ; Число записываемых байт (4000) mov ah,40h xor dx,dx int 21h ; Запись в файл mov ah,3eh int 21h ; Закрытие файла no: popa jmp dword ptr cs:old_int28h iret new_int28h endp ;============================== begin proc far
mov ax,0FF00h int 2Fh ; Проверка : программа в памяти ? cmp ax,00FFh je already_in_mem
mov ax,3528h int 21h mov word ptr old_int28h,bx mov word ptr old_int28h+2,es
mov ax,352Fh int 21h mov word ptr old_int2Fh,bx mov word ptr old_int2Fh+2,es push cs pop ds
mov dx,offset msg1 mov ah,9 int 21h mov dx,OFFSET new_int28h mov ax,2528h int 21h mov dx,OFFSET new_int2Fh mov ax,252Fh int 21h mov dx,OFFSET begin int 27h already_in_mem: mov dx,OFFSET msg2 mov ah,9 push cs pop ds int 21h .EXIT begin endp
msg1 db 'Program installed.$' msg2 db 'Already in memory!!!$' end
|
Зараннее благодарен...
|