Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- code_seg segment
- ASSUME CS:CODE_SEG,DS:code_seg,ES:code_seg
- org 100h
- .286
- start:
- jmp begin
- ;========================MACRO=========================
- print_mes macro string
- local message, nxt
- push ax
- push dx
- mov ah, 09h
- mov dx, offset message
- int 21h
- pop dx
- pop ax
- jmp nxt
- message DB string, '$'
- nxt:
- endm
- ;========================DATA=========================
- int_2Fh_vector DD ?
- old_09h DD ?
- key DB '/off'
- flag_off DB 0
- msg DB 'already '
- msg1 DB 'installed',13,10,'$'
- msg4 DB 'just '
- msg3 DB 'not '
- msg2 DB 'uninstalled',13,10,'$'
- msg_password DB 'Please enter the password:$', 13, 10
- correct DB 13, 10, 'Password entered correctly$', 13,10
- line db 2 ;Строка
- coloumn db 10 ;Столбец
- pass_check db 6,0,6 dup (0)
- password db '123qwe'
- cur_position dw 0
- pass_length dw 5
- flag db 0
- ;========================CODE=========================
- new_09h proc far
- pusha
- pushf
- in AL, 60h ; Введем scan-code
- cmp flag, 1
- je get_character
- cmp AL, 19h ; Это скен-код <P>?
- je gogo ; Да
- exit: ; Нет
- popf
- popa
- jmp dword ptr CS:[old_09h] ; В системный обработчик без возврата
- gogo:
- push ES
- mov AX, 40h ; Настроим ES на начало данных BIOS
- mov ES, AX
- mov AL, ES: [17h] ; Получим слово флагов клавиатуры
- pop ES
- cmp AL, 0Ch ; (Ctrl+Alt) уже нажата?
- je hotkey ; Да
- jmp exit ; Нет, в системный обработчик
- hotkey:
- sti
- in AL, 61h ; Введем содержимое порта В
- or AL, 80h ; Установим старший бит
- out 61h, AL ; И вернем в порт В
- and AL, 7Fh ; Снова разрешим работу клавиатуры
- out 61h, AL ; Сбросив старший бит в порту
- password_input:
- push cs
- pop ds
- mov AH, 06h ; очистка экрана
- mov AL, 0 ;Режим создания окна (прокрутка)
- mov BH, 07h ;Атрибут всех символов в окне:ч/б
- mov CX, 0
- mov DH,24 ;Нижняя Х-координата
- mov DL,79 ;Правая Х-координата
- int 10h ;Прерывание BIOS
- mov AH, 02h
- mov BH,0 ;Видеостраница
- mov DH, line ;Строка
- mov DL, coloumn ;Столбец
- int 10h ;Прерывание BIOS
- mov AH, 9h
- mov DX, offset msg_password
- int 21h
- ;Пошлем приказ EOI
- cli
- mov AL, 20h
- out 20h, AL
- popf
- popa
- mov flag, 1
- jmp dword ptr CS:[old_09h] ; В системный обработчик без возврата
- get_character:
- cmp al, 1Ch
- je check
- mov si, offset pass_check
- mov bx, cur_position
- mov pass_check[bx], al
- cmp bx, pass_length
- je check
- inc cur_position
- sti
- in AL, 61h ; Введем содержимое порта В
- or AL, 80h ; Установим старший бит
- out 61h, AL ; И вернем в порт В
- and AL, 7Fh ; Снова разрешим работу клавиатуры
- out 61h, AL ; Сбросив старший бит в порту
- ;Пошлем приказ EOI
- cli
- mov AL, 20h
- out 20h, AL
- popf
- popa
- jmp dword ptr CS:[old_09h] ; В системный обработчик без возврата
- check:
- sti
- in AL, 61h ; Введем содержимое порта В
- or AL, 80h ; Установим старший бит
- out 61h, AL ; И вернем в порт В
- and AL, 7Fh ; Снова разрешим работу клавиатуры
- out 61h, AL ; Сбросив старший бит в порту
- lea si, password
- lea di, pass_check
- mov CX, 6 ; ожидаемая длина команды
- repe cmpsb
- jne not_equal
- equal:
- mov AH, 9h
- mov DX, offset correct
- int 21h
- jmp finish
- not_equal:
- mov cur_position, 0
- jmp password_input
- ;Пошлем приказ EOI
- cli
- mov AL, 20h
- out 20h, AL
- popf
- popa
- jmp dword ptr CS:[old_09h] ; В системный обработчик без возврата
- finish:
- int 19h
- new_09h endp
- ;-----------------------------------------------------------------------------
- int_2Fh proc far
- cmp AH,0C7h ; Наш номер?
- jne Pass_2Fh ; Нет, на выход
- cmp AL,00h ; Подфункция проверки на повторную установку?
- je inst ; Программа уже установлена
- cmp AL,01h ; Подфункция выгрузки?
- je unins ; Да, на выгрузку
- jmp short Pass_2Fh ; Неизвестная подфункция - на выход
- inst:
- mov AL,0FFh ; Сообщим о невозможности повторной установки
- iret
- Pass_2Fh:
- jmp dword PTR CS:[int_2Fh_vector]
- ;
- ; -------------- Проверка - возможна ли выгрузка программы из памяти ? ------
- unins:
- push BX
- push CX
- push DX
- push ES
- ;
- mov CX,CS ; Пригодится для сравнения, т.к. с CS сравнивать нельзя
- mov AX,3509h ; Проверить вектор 09h
- int 21h ; Функция 35h в AL - номер прерывания. Возврат-вектор в ES:BX
- ;
- mov DX,ES
- cmp CX,DX
- jne Not_remove
- ;
- cmp BX, offset CS:new_09h
- jne Not_remove
- ;
- mov AX,352Fh ; Проверить вектор 2Fh
- int 21h ; Функция 35h в AL - номер прерывания. Возврат-вектор в ES:BX
- ;
- mov DX,ES
- cmp CX,DX
- jne Not_remove
- ;
- cmp BX, offset CS:int_2Fh
- jne Not_remove
- ; ---------------------- Выгрузка программы из памяти ---------------------
- ;
- push DS
- ;
- lds DX, CS:old_09h
- mov AX,2509h ; Заполнение вектора старым содержимым
- int 21h
- ;
- lds DX, CS:int_2Fh_vector
- mov AX,252Fh
- int 21h
- ;
- pop DS
- ;
- mov ES,CS:2Ch ; ES -> окружение
- mov AH, 49h ; Функция освобождения блока памяти
- int 21h
- ;
- mov AX, CS
- mov ES, AX ; ES -> PSP выгрузим саму программу
- mov AH, 49h ; Функция освобождения блока памяти
- int 21h
- ;
- mov AL,0Fh ; Признак успешной выгрузки
- jmp short pop_ret
- Not_remove:
- mov AL,0F0h ; Признак - выгружать нельзя
- pop_ret:
- pop ES
- pop DX
- pop CX
- pop BX
- ;
- iret
- int_2Fh endp
- ;============================================================================
- already_ins:
- cmp flag_off,1 ; Запрос на выгрузку установлен?
- je uninstall ; Да, на выгрузку
- lea DX,msg ; Вывод на экран сообщения: already installed!
- call print
- int 20h
- ; -------------------------------- Выгрузка---------------------------------
- uninstall:
- mov AX,0C701h ; AH=0C7h номер процесса C7h, подфункция 01h-выгрузка
- int 2Fh ; мультиплексное прерывание
- cmp AL,0F0h
- je not_sucsess
- cmp AL,0Fh
- jne not_sucsess
- mov DX,offset msg2 ; Сообщение о выгрузке
- call print
- int 20h
- not_sucsess:
- mov DX,offset msg3 ; Сообщение, что выгрузка невозможна
- call print
- int 20h
- xm_stranno:
- mov DX,offset msg4 ; Сообщение, программы нет, а пользователь
- call print ; дает команду выгрузки
- int 20h
- ;============================================================================
- begin:
- mov CL,ES:80h ; Длина хвоста в PSP
- cmp CL,0 ; Длина хвоста=0?
- je check_install ; Да, программа запущена без параметров, попробуем установить
- xor CH,CH ; CX=CL= длина хвоста
- cld ; DF=0 - флаг направления вперед
- mov DI, 81h ; ES:DI-> начало хвоста в PSP
- mov SI,offset key ; DS:SI-> поле key
- mov AL,' ' ; Уберем пробелы из начала хвоста
- repe scasb ; Сканируем хвост пока пробелы
- ; AL - (ES:DI) -> флаги процессора
- ; повторять пока элементы равны
- dec DI ; DI-> на первый символ после пробелов
- mov CX, 4 ; ожидаемая длина команды
- repe cmpsb ; Сравниваем введенный хвост с ожидаемым
- ; (DS:SI)-(ES:DI) -> флаги процессора
- jne check_install ; Неизвестная команда - попробуем установить
- inc flag_off
- ;--------------------Не установлена ли уже эта программа?--------------------
- check_install:
- mov AX,0C700h ; AH=0C7h номер процесса C7h
- ; AL=00h -дать статус установки процесса
- int 2Fh ; мультиплексное прерывание
- cmp AL,0FFh
- je already_ins ; возвращает AL=0FFh если установлена
- ;----------------------------------------------------------------------------
- cmp flag_off,1
- je xm_stranno
- ;----------------------------------------------------------------------------
- mov ax, 352Fh
- int 21h
- mov word ptr int_2Fh_vector, BX ; ES:BX - вектор
- mov word ptr int_2Fh_vector+2, ES
- mov DX, offset int_2Fh
- mov AX, 252Fh
- int 21h
- ;============================================================================
- mov ax, 3509h
- int 21h
- mov word ptr old_09h, BX ; ES:BX - вектор
- mov word ptr old_09h+2, ES
- mov DX, offset new_09h
- mov AX, 2509h
- int 21h
- ;----------------------------------------------------------------------------
- mov DX,offset msg1 ; Сообщение об установке
- call print
- ;----------------------------------------------------------------------------
- mov DX,offset begin ; оставить программу ...
- int 27h ; ... резидентной и выйти
- ;============================================================================
- PRINT PROC NEAR
- MOV AH,09H
- INT 21H
- RET
- PRINT ENDP
- ;;============================================================================
- code_seg ends
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement