retf ;Передаем управление программе ; Процедуры;

GetExeName PROC NEAR

; Анализируем окружение ДОС, выделяем ; имя программы и копируем его в буфер NameFE

Процедура GetExeName отыскивает имя программы в окружении ДОС и переносит его в переменную NameFE. Если имя выделить не удалось (не найдены два последовательных нуля в буфере длиной 1000 байт или количество переменных в расширенной части равно 0)i фаг не может определить местоположение и имя защищаемой файла — в этом случае он просто завершает свою работу и без каких-либо сообщений передает управление защищаемой программе. Таким образом, непременным условием работоспособности фага является использование версии ДОС 3.0 и выше. Фактически все, что делает процедура GetExeName, реализуется единственной строкой на Турбо Паскале:

NameFE := PararnStr (0);

Полезно взглянуть на реализацию GetExeName, чтобы лишний раз оценить преимущества использования современных языков программирования высокого уровня.

mov es,PSP ES = PSP

mov es,es:[2Ch] ES - сегмент окружения ; Ищем начало дополнительнык параметров

mov сх,1000 Ищем в буфере

длиной 1000 байт

mov Ьх,-1 Начинаем с первого байта SEARCH:

inc bx Текущий байт

mov ax,es:[bx] Текущее слово

стр ах, 0 Ищем два нуля

jz EndSearch Переходим, если нашли

loop Search Повторяем для следующего байта

jmp Exit He найдено имя - выходим! ; Переносим имя файла endSEARCH:

add bx,2 Смещение количества параметров

mov ax,es:[bx] Получаем количество параметров

crop ax,0 Есть параметры?

je Exit Нет, выходим

add Ьх, 2 Начало имени

lea di,NameFE Индекс копии

mov сх,0 Готовим счетчик длины LAB1:

mov ah,es:[bx] Очередной символ

mov [di],ah Переносим его

inc bx Наращиваем указатели

inc di

inc сх и счетчик

cmp ah,О

jnz Labi Повторяем до символа О

add сх,-4 СХ - длина имени без расширения и нуля

mov LName,cx

ret

ReadHead PROC NEAR

; Открываем ЕХЕ-файл, читаем из него заголовок