Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- LOCALS
- model tiny
- .code
- org 100h
- start:
- jmp main ; перепрыгиваем все процедуры
- dw 2143h ; сказали в памяти, что это мы
- oldVec2f dd 0
- my_handler proc ; наш обработчик
- cmp ax, 80f0h ; если пришло то, что надо
- ; с нужным магическим числом и функцией
- jne @@end
- mov ax, error_code_ok ; выставляем код, что резидент наш
- @@end:
- iret
- my_handler endp
- get_old_2f proc
- push ax
- mov ax, 352fh
- int 21h
- pop ax
- ret
- get_old_2f endp
- set_int proc ; ставим свой обработчик my_handler на вектор 2fh
- call get_old_2f ; узнали старый вектор 2fh
- mov word ptr [oldVec2f], bx
- mov word ptr [oldVec2f+2], es ; записали вектор в переменную
- mov ah, 25h
- mov al, 2fh
- mov dx, offset my_handler
- int 21h
- ret
- set_int endp
- ьщм ь
- del_int proc
- mov ax, 352fh
- int 21h
- cmp word ptr es:[bx-2], 2143h
- jne @@end
- push ds
- mov dx, word ptr es:[bx+3]
- mov ax, word ptr es:[bx+5]
- mov ds, ax
- mov ax, 252fh
- int 21h
- pop ds
- push es
- mov ax, es:[2ch]
- mov es, ax
- mov ah, 49h
- int 21h
- pop es
- mov ah, 49h
- int 21h
- @@end:
- ret
- del_int endp
- main: ; здесь все начинается
- get_args: ; надо прочитать ключи
- xor cx, cx
- mov cx, cs:[80h]
- sub cx, 2000h
- dec cx
- xor bx, bx
- mov si, 82h ; адрес первого символа в аргументе
- mov bx, 2fh ; код слеша
- cmp [si], bl
- jne bad ; первый символ не наш - все плохо
- dec cx
- jmp ok
- bad:
- jmp afail
- ok:
- inc si
- xor bx, bx
- mov bx, 30h ; код нуля
- cmp [si], bl
- je is_end_r1 ; прочитали строку /0 - первый ключ
- xor bx, bx
- mov bx, 31h ; код единицы
- cmp[si], bl
- je is_end_r2 ; прочитали строку /1 - первый ключ
- xor bx, bx
- mov bx, 64h ; код единицы
- cmp[si], bl
- je is_end_del
- jmp afail ; плохой аргумент
- is_end_r1:
- dec cx
- cmp cx, 0
- je r1
- jmp afail
- is_end_r2:
- dec cx
- cmp cx, 0
- je r2
- jmp afail
- is_end_del:
- dec cx
- cmp cx, 0
- je del
- jmp afail
- r1:
- mov ah, magic_num ; говорим, что это мы
- mov al, magic_func ; c нашей магической функцией
- int 2fh ; вызываем обработчик
- cmp ax, error_code_ok ; если обработчик был наш, то ответы совпадут
- je installed ; значит уже поставили
- call set_int ; вешаем своего обработчика на int 2fh
- mov dx, offset r1 + 1 ; что загрузить
- int 27h
- r2:
- mov ah, magic_num
- mov al, magic_func
- int 2fh
- cmp ax, error_code_ok
- je installed
- call set_int
- mov ah, 31h ; ставим резидента с помощью 31h функции
- mov al, 00h ; код возврата
- mov bx, offset r2
- sub bx, offset start
- add bx, 0fh
- sar bx, 4
- add bx, 10h
- mov dx, bx ;(offset r2 - offset start + 15)/16 + 1 ; сколько параграфов поделить сдвигом вправо
- int 21h
- del:
- call del_int
- mov ah, 9h
- lea dx, msg_del
- int 21h
- ret
- afail: ; если неправильный аргумент
- mov ah, 9h
- lea dx, argmess
- int 21h
- ret
- installed: ; если резидент уже загружен
- mov ah, 9h
- lea dx, msg_n_inst
- int 21h
- ret
- finish: ; если только загрузили резидента
- mov ah, 9h
- lea dx, msg_inst
- int 21h
- ret
- magic_num db 80h
- magic_func db 0f0h
- error_code_ok dw 0ffh
- argmess db "Error: Incorrect args", 24h
- msg_n_inst db "Allready installed", 0dh, 0ah, '$'
- msg_inst db "Resident installed", 0dh, 0ah, '$'
- msg_del db "Deleted", 0dh, 0ah, '$'
- end start
- ; Через int 21h функцию 31h можно загружать в память exe файлы
- ; Для int 27h ограничен размер загружаемого резидента - 64кб
- ; int 31h сразу завершит работу программы и не всю программу в памяти, а сколько параграфов укажешь
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement