Персональный
сайт
Игоря
Сысоева


 
english
обо мне
 
sysoev.ru
 
nginx
 
mod_accel
mod_realip
mod_deflate
программирование
всякая всячина
windows
freebsd
apache
pppd
unix
web
 
 

Почему я не люблю HASP ?

 

2.09.1999

Всем известно, что ключи HASP работают, мягко говоря, ненадёжно. Зачастую защищённые программы видят их не с первого раза, а иногда не видят вообще. Иногда невозможно печатать на подключённый через HASP принтер. Однако то, с чем столкнулся я, просто не лезет ни в какие ворота.

Около полугода назад я проапгрэйдил сервер NetWare 3.12 с 486DX2-66 на Pentium-100. С тех пор иногда стали возникать странные зависания сервера, через некоторое время (около минуты, иногда несколько минут) завершавшиеся abend'ом по адресам, оканчивающиеся на 67 или E7. Понятно, что радости это приносило мало. После этого приходилось запускать vrepair.nlm, чистить принтерные очереди JetDirect'ов, а кое-что даже восстанавливать из бэкапов.

Я установил все патчи из 312ptd.exe. Я подозревал драйвера SCSI-контроллера Adaptec AHA2940UW и сетевой карты Intel EtherExpress 100B. Я грешил на монстра ARCserve 6.1. Единственное, на что я не обратил внимания — это haspserv.nlm, ведь он прекрасно работал на предыдущем сервере.

До этого случая я никогда не пользовался встроенным отладчиком NetWare просто потому, что не верил, что с его помощью можно что-то сделать в этой огромной непонятной системе, настройка которой напоминает шаманские пляски с бубном. И вот, в светлый осенний день, 1 сентября, когда случилось очередное зависание, я решил всё-таки посмотреть, что же там происходит внутри (очевидно, влияние Дня Знаний). Я вызвал отладчик, нажав Alt-Shift-Shitf-Esc, и попал на адрес 003DE769. Я нажал g — сервер опять повис. Я опять вызвал отладчик — он остановился по тому же адресу, я снова нажал g — сервер повис. Я повторил это несколько раз — отладчик останавливался на одном и том же месте. Нажав ?, я увидел, что адрес 003DE769 принадлежит модулю haspserv.nlm и находится в этом модуле по смещению 2059. Тогда я решил потрассировать код и обнаружил, что сервер крутится в цикле между 003DE760 и 003DE774:

003DE760 56           push   esi
003DE761 57           push   edi
003DE762 B904000000   mov    ecx,00000004
003DE767 F3A6         repe   cmpsb
003DE769 0F8407000000 je     003DE776
003DE76F 5F           pop    edi
003DE770 5E           pop    esi
003DE771 83C706       add    edi,06
003DE774 EBEA         jmp    003DE760
003DE776 5F           pop    edi
Рано или поздно этот цикл должен наткнуться на незамапленную страницу и завершиться abend'ом по адресу 003DE767, что, собственно, у меня и случалось.

Я решил попробовать выйти из этого цикла. Находясь на адресе 003DE769, я набрал f zf=1, затем t и g и сервер ожил! Однако, нужно заметить, что подобные действия не всегда будут безопасны для сервера — всё зависит от значения регистра edi.

Всё это происходит с haspserv.nlm версии 5.0. Я скачал последнюю версию — 6.12, но наша версия 1С с ней работать, увы, не захотела. Кроме того, я заглянул внутрь этой последней версии и у меня создалось впечатление, что она может всё так же завесить сервер, поскольку код в этом месте не изменился.

(C) Игорь Сысоев
http://sysoev.ru