полная версия протокола
Согласитесь, что с таким отчетом можно и поработать! Мы уже достигли функционала стандартного API-шпиона, однако, при желании фильтр легко усложнить, добавив новые критерии "отбора проб". Формат протокола отчета так же легко обогатить новыми деталями, выводя все необходимые подробности, которые только потребуется (например, содержимое стека вызовов).
Конечно, этот путь не обходится без проблем. Постоянно всплывающий soft-ice противно мерцает и жрет производительность. Можно ли как ни будь заставить его вести протокол не всплывая? Можно! Отладчик поддерживает специальную функцию BPLOG, всегда возвращающую TRUE и подавляющую всплытие отладчика. К сожалению, вместе с этим подавляется и последовательность команд, следующая за DO, а значит, создание подробных отчетов становится невозможным, так что для наших целей такой способ не годиться. Других "анти-всплывающих" средств в нашем распоряжении к сожалению нет.
Еще одним источником головой боли становится мусор в протоколе. Полезные данные перемешиваются с прочей информацией, выводящейся на экран и... Какая там легкость чтения! Без написания специального форматера отчетов мы буквально утонем. Но программировать на Perl'е лениво и на помощь приходят... правильно! Макросы! Только на этот раз не из soft-ice, а те, что встроены в FAR.
Нажимаем <F4>
(в FAR'e) и внимательно смотрим на текст, приведенный на листинге 5. Как видно, каждая порция "отчетной" информации начинается со строки "break due to". Вот ее-то мы и будем искать! Нажимаем <Ctrl-.>
для начала записи макросов, затем <F7>
"break due to" <ENTER>
. Теперь <Shift-стрелка вправо>
пока мы не выделим все лишнее до "CreateFileA", <Crl-Del>
, чтобы вырезать его нафиг, <Ctrl-Shift-стрелка вправо>
, чтобы перейти на "DO", которое мы так же удаляем вместе с остатком строки и т.д. и т. п. Короче кромсаем текст как хотим. Это тяжело описывать словами, легче показать конечный результат. После того как макрос будет создан, достаточно будет его применить к протоколу заданное число раз (просто нажать назначенную ему комбинацию клавиш и не отпускать), в результате чего получится следующее:
CreateFileA, PID:1DCh; NAME: CD.snail.exe; RET: 74h
CreateFileA, PID:1DCh; NAME: demo.crk.exe; RET: 74h
CreateFileA, PID:1DCh; NAME: demo.protected.crk.exe; RET: 74h