SoftICE. Руководство пользователя [Compuware Corp.] (pdf) читать онлайн

-  SoftICE. Руководство пользователя  872 Кб (скачать pdf) (скачать pdf+fbd)  (читать)  (читать постранично) - Compuware Corp.

Книга в формате pdf! Изображения и текст могут не отображаться!


Настройки текста:



SoftICE

Руководство пользователя
Перевод руководства "Using SoftICE"
фирмы Compuware Corp.

Windows NT™
Windows® 98
Windows® 95
Windows® 3.1
DOS

Оглавление
Оглавление......................................................................................................... 1
Предисловие ...................................................................................................... 6
Цель данного руководства .................................................................................................6
Для кого предназначено данное руководство ...............................................................6
Организация руководства .................................................................................................6
Принятые обозначения......................................................................................................7
Как пользоваться этим руководством .............................................................................8
Другая полезная документация........................................................................................8

1. Знакомство с SoftICE ................................................................................... 9
Общая характеристика ......................................................................................................9
SoftICE .............................................................................................................................9
Symbol Loader...............................................................................................................11
Поддержка пользователей...............................................................................................12
По общим вопросам....................................................................................................12
По техническим вопросам ........................................................................................12

2. Установка SoftICE ...................................................................................... 13
Введение ..............................................................................................................................13
Требования к аппаратному и программному обеспечению.....................................13
Варианты вывода информации SoftICE на экран.................................................14
Подготовка к установке ...................................................................................................16
Установка ............................................................................................................................16
Действия после установки программы .........................................................................19
Настройка BOOT.INI для поддержки одного процессора
в мультипроцессорной системе.........................................................................20
Настройка загрузки SoftICE под управлением Windows 95 ...............................20
Подключение удаленного компьютера через последовательный порт..........21
Разрешение проблем с видеоадаптерами.....................................................................23

3. Учебник SoftICE .......................................................................................... 25
Введение ..............................................................................................................................25
Загрузка SoftICE ................................................................................................................25
Пример построения приложения GDIDEMO..............................................................26
Загрузка приложения GDIDEMO ..................................................................................26
Управление экраном SoftICE...........................................................................................27
Трассировка и пошаговое выполнение кода ...............................................................28
Просмотр локальных данных..........................................................................................28
Установка точек прерывания..........................................................................................29
Установка одноразовой контрольной точки .........................................................29
Установка постоянной точки прерывания ............................................................29

2

Оглавление
Использование информационных команд SoftICE ....................................................30
Использование идентификаторов и таблиц символов ..............................................31
Установка условного прерывания .................................................................................32
Установка точки прерывания BPX ..........................................................................32
Редактирование точки прерывания ........................................................................33
Установка контрольной точки чтения/записи в память ...........................................34

4. Загрузка кода в SoftICE............................................................................. 36
Концепции отладки...........................................................................................................36
Подготовка к отладке прикладных программ .......................................................36
Подготовка к отладке драйверов устройств и VxD..............................................37
Запуск SoftICE вручную...................................................................................................37
Загрузка SoftICE для Windows 95.............................................................................37
Запуск SoftICE для Windows NT...............................................................................38
Создание приложений с отладочной информацией..................................................38
Использование Symbol Loader для трансляции и загрузки файлов........................39
Изменение параметров настройки модуля..................................................................40
Изменение Общих Параметров настройки (вкладка General)..........................41
Изменение параметров трансляции (вкладка Translation).................................42
Изменение параметров отладки (вкладка Debugging)........................................44
Задание исходных файлов программы .........................................................................45
Удаление таблиц символов ..............................................................................................45
Запуск утилиты Symbol Loader из командной строки DOS ......................................46
Использование утилиты загрузчика символов командной строки.........................47
Синтаксис утилиты NMSYM ....................................................................................47
Использование NMSYM для трансляции отладочной информации ................48
Использование NMSYM для загрузки модуля и отладочной информации ...51
Использование NMSYM для загрузки таблиц символов или экспортов ........53
Использование NMSYM для выгрузки отладочной информации ....................54
Использование NMSYM для сохранения протокола работы в файл....................54
Получение информации об утилите NMSYM.......................................................55

5. Интерфейс SoftICE ..................................................................................... 56
Введение ..............................................................................................................................56
Вызов экрана SoftICE........................................................................................................56
Отключение SoftICE на этапе загрузки ........................................................................56
Содержимое экрана SoftICE ...........................................................................................57
Изменение размера экрана SoftICE ........................................................................58
Управление окнами SoftICE ......................................................................................58
Копирование и вставка данных в окнах.................................................................60
Ввод команд с помощью мыши ................................................................................60
Получение помощи.....................................................................................................60
Окно команд .......................................................................................................................61
Листание содержимого окна команд ......................................................................61
Ввод команд ..................................................................................................................62
Вызов предыдущих команд.......................................................................................64
Использование макрокоманд времени исполнения............................................64
Сохранение содержимого буфера протокола окна команд в файл .................66
Связанные с окном команды ....................................................................................66

Оглавление

3

Окно кодов..........................................................................................................................66
Управление окном кодов ...........................................................................................66
Отображение информации.......................................................................................67
Ввод команд из окна кодов........................................................................................69
Окно локальных переменных.........................................................................................70
Управление окном локальных переменных ..........................................................70
Раскрытие и сжатие содержимого стека ...............................................................71
Связанные с окном команды ....................................................................................71
Окно слежения ..................................................................................................................71
Управление окном слежения....................................................................................71
Создание выражений для отслеживания их значений .......................................72
Отображение информации.......................................................................................72
Развертывание и сжатие выражений .....................................................................72
Связанные с окном команды ....................................................................................73
Окно регистров..................................................................................................................73
Управление окном регистров ...................................................................................73
Отображение информации.......................................................................................73
Изменение содержимого регистров и значений флагов....................................74
Связанные с окном команды ....................................................................................74
Окно данных.......................................................................................................................75
Управление окном данных ........................................................................................75
Отображение информации.......................................................................................75
Изменение адреса отображаемой памяти и формата данных ..........................76
Изменение содержимого памяти.............................................................................77
Присвоение выражения ............................................................................................77
Связанные с окном команды ....................................................................................77
Окно стека FPU ..................................................................................................................77
Отображение информации.......................................................................................78

6. Использование SoftICE ............................................................................. 79
Отладка нескольких программ одновременно............................................................79
Перехват ошибок...............................................................................................................79
32bбитный код защищенного режима кольца 3 (программы Win32)....................79
Драйверы кольца 0 (драйверы устройств режима ядра) ....................................80
16bбитный код защищенного режима кольца 3
(16bбитные Windows программы)......................................................................80
Контекст адресов...............................................................................................................81
Использование команд '.' (точка) INT 0x41 ..................................................................81
Переходы из 3 кольца защиты к 0 кольцу — общие сведения.................................83

7. Использование прерываний ...................................................................... 84
Введение ..............................................................................................................................84
Типы контрольных точек, поддерживаемых SoftICE ................................................84
Дополнительные возможности контрольных точек............................................85
Прерывание исполняемых команд .........................................................................85
Прерывания на обращение к памяти......................................................................86
Контрольные точки на прерываниях......................................................................87
Прерывания на ввод/вывод......................................................................................87
Прерывания на сообщения Windows......................................................................88
Понятие о контексте прерывания .................................................................................89

4

Оглавление
Виртуальные контрольные точки ..................................................................................90
Задание действий при прерывании...............................................................................90
Условные прерывания......................................................................................................91
Функции статистики условных прерываний ........................................................92
Использование локальных переменных в условных выражениях ..................94
Использование стека в условных выражениях ....................................................95
Производительность ..................................................................................................97
Дублирование контрольных точек ..........................................................................97
Затраченное время............................................................................................................97
Статистика прерываний ..................................................................................................98
Ссылка на контрольную точку в выражениях ............................................................98
Управление контрольными точками .............................................................................98
Использование встроенных контрольных точек........................................................99

8. Использование выражений ................................................................... 100
Выражения........................................................................................................................100
Операторы ..................................................................................................................100
Приоритет операторов.............................................................................................102
Составные части выражений .................................................................................103
Типы выражений.......................................................................................................108
Приведение типов.....................................................................................................110
Исчисление идентификаторов...............................................................................111
Использование операторов адресации с идентификаторами .........................112

9. Загрузка символов для системных компонентов ............................. 113
Загрузка экспортируемых символов для DLLb и EXEbфайлов ...............................113
Использование неименованных точек входа......................................................114
Использование экспортируемых имен в выражениях .....................................114
Динамическая загрузка 32bбитного DLLbэкспорта ............................................114
Использование символьных файлов Windows NT (.DBG) с SoftICE .....................115
Использование символьных файлов Windows 95 (.SYM) с SoftICE.......................115

10. Использование SoftICE с модемом ..................................................... 116
Введение ............................................................................................................................116
Аппаратные требования ................................................................................................116
Установление соединения .............................................................................................116
Использование программы SERIAL.EXE ..............................................................117
Команда DIAL.............................................................................................................118
Команда ANSWER.....................................................................................................118

11. Настройка SoftICE.................................................................................. 119
Изменение начальных установок SoftICE..................................................................119
Изменение общих установок (General)................................................................120
Предварительная загрузка символической информации
и исходного кода (Symbols)...............................................................................121
Предварительная загрузка экспортируемой информации (Exports) .................123
Настройка удаленной отладки (Remote Debugging) ..........................................123
Изменений назначений клавиатуре (Keyboard Mappings) ..............................124
Работа с постоянными макрокомандами (Macro Definitions) ..........................125
Параметры для устранения неисправностей (Troubleshooting) .....................127

Оглавление

5

12. Исследование Windows NT..................................................................... 129
Обзор..................................................................................................................................129
Ресурсы для квалифицированных разработчиков ............................................129
Внутри ядра Windows NT...............................................................................................132
Управление процессорами Intel.............................................................................133
Распределение памяти в Windows NT ..................................................................137
Подсистема Win32...........................................................................................................141
Внутри CSRSS.............................................................................................................141
Объекты USER и GDI................................................................................................143
Адресное пространство процесса..........................................................................147
Функции управления кучами .................................................................................148

Приложение А. Сообщения об ошибках................................................. 156
Приложение B. Поддерживаемые видеоадаптеры .............................. 161
Приложение C. Устранение проблем SoftICE ........................................ 164
Словарь ........................................................................................................... 166

Некоторые книги предназначены для того, чтобы с ними ознакомиться,
другие для того, чтобы их проглотить,
и лишь немногие, чтобы их обдумывать и усваивать.
Сэр Френсис Бэкон

Some books are to be tasted, others to be swallowed,
and some few to be chewed and digested.
Sir Francis Bacon

Предисловие
Цель данного руководства
SoftICE является мощным отладчиком общего назначения, с помощью которого
можно отлаживать практически любые типы кодов, включая исполняемые файлы,
драйверы устройств, DDL, OCX, а также статические и динамические VxD. Данное
руководство описывает, как установить и использовать SoftICE для загрузки и отладb
ки программ под управлением Windows 95 и Windows NT. Так как многие програмb
мисты предпочитают учиться, непосредственно экспериментируя с программой, в
данное руководство включен раздел, который посвятит Вас в основы отладки.

Для кого предназначено данное руководство
Это руководство предназначено для программистов, которые хотят использовать
SoftICE для отладки программ для операционных систем Windows 95 и Windows NT.

Организация руководства
Руководство пользователя организовано следующим образом:
 Глава 1. "Знакомство с SoftICE"
Кратко описывает компоненты пакета и их характеристики, и объясняет, как
можно связаться с Центром технической поддержки фирмы NuMega.
 Глава 2. "Установка SoftICE"
Перечисляет аппаратные и программные требования SoftICE и поясняет, как
установить отладчик для операционных систем Windows 95 и Windows NT.
 Глава 3. "Наставник по SoftICE"
Рассказывает об основах отладки программ, включая трассировку кода, проb
смотр содержимого локальных переменных и структур, установку различных
контрольных точек и просмотр таблиц с символьной информацией.
 Глава 4. "Загрузка кода в SoftICE"
Объясняет, как использовать утилиту Symbol Loader для загрузки в отладчик
различных типов программ.
 Глава 5. "Интерфейс SoftICE"
Описывает интерфейс SoftICE.
 Глава 6. "Использование SoftICE"
Рассказывает о способах перехвата ошибок исполнения программ, контекстах адb
ресов, использовании команд INT 0x41 . (точка) и переходах из кольца 3 в кольцо 0.

Принятые обозначения

7



Глава 7. "Использование прерываний"
Объясняет, как устанавливать на исполняемые команды, на любые обращеb
ния к памяти, на прерывания, на чтение или запись в порты ввода/вывода.
 Глава 8. "Использование выражений"
Описывает правила составления выражений при работе с контрольными точb
ками.
 Глава 9. "Загрузка символов для системных компонентов"
Рассказывает, как загружать экспортируемые .DLL и .EXEbфайлами символы,
и как использовать в SoftICE файлы с отладочной информацией для
Windows NT.
 Глава 10. "Использование SoftICE с модемом"
Описывает, как установить модемную связь для управления SoftICE с удаленb
ного компьютера.
 Глава 11. "Настройка SoftICE"
Объясняет, как использовать конфигурационный файл SoftICE для настройки
окружения отладчика, предварительной загрузки отладочной информации и
настройки удаленной отладки, как модифицировать клавиатуру для Ваших
нужд и создавать макрокоманды, и описывает варианты решений некоторых
возникающих проблем.
 Глава 12. "Исследование Windows NT"
Краткий обзор строения операционной системы Windows NT.
 Приложение A "Сообщения об ошибках"
Поясняет выдаваемые в процессе работы SoftICE сообщения.
 Приложение B. "Поддерживаемые видеоадаптеры"
Здесь приведен список поддерживаемых отладчиком видеоадаптеров.
 Приложение C. "Устранение проблем SoftICE"
Объясняет, каким образом можно решить некоторые возникающие в процесb
се работы проблемы.
 Словарь

Принятые обозначения
В данном руководстве приняты следующие обозначения:
Обозначение

Описание

Enter

Указывает, что Вам следует набрать текст и нажать клаb
вишу RETURN или щелкнуть по кнопке OK.

курсив

Обозначает самую разную информацию, например,
имябиблиотеки.

 

Используется в инструкциях и в примерах программ,
чтобы указать символы, которые Вам следует набрать на
клавиатуре.

МАЛЫЕ ПРОПИСНЫЕ

Обозначают элементы пользовательского интерфейса,
такие, например, как кнопки или меню.

ПРОПИСНЫЕ

Обозначают имена директорий и файлов, ключевые
слова и акронимы.

8

Предисловие

Как пользоваться этим руководством
В следующей таблице предлагаются различные варианты использования данноb
го руководства на основании Вашего опыта отладки приложений:
Опыт отладки

С чего начать

Опыт использования отb
ладчиков отсутствует

Изучение главы 3 "Наставник по SoftICE"

Имеется опыт использоb
вания других отладчиков

Прочитать главу 4 "Загрузка кода в SoftICE" и глаb
ву 5 "Управление SoftICE"

Опыт использования
ранних версий SoftICE

Прочитать главу 4 "Загрузка кода в SoftICE", а заb
тем просмотреть главу 5 "Управление SoftICE" об
использовании мыши и окон слежения и локальb
ных переменных

Другая полезная документация
В дополнение к данному руководству компания NuMega выпускает следующую
документацию по отладчику SoftICE:
 Справочник по командам SoftICE
В справочнике в алфавитном порядке описаны все команды SoftICE. Дается
полное описание синтаксиса команд и выводимая ими информация, а также
приведены примеры, поясняющие их использование.
 Встроенная система подсказок
Комплекс SoftICE оснащен контекстноbзависимой системой подсказки для
программы Symbol Loader, а также строкой помощи для команд отладчика.
 Документация в электронном виде
Как руководство пользователя, так и справочник по командам SoftICE доступb
ны в электронном виде. Для их использования необходимо запустить проb
грамму Acrobat Reader и открыть файлы SI30UG.PDF (данное руководство)
или SI30CR.PDF (Справочник по командам).

Для великого эксперимента чрезвычайно важна одна вещь
— сам экспериментатор.
Уолтер Бейджхот

To a great experience one thing is essential, an experiencing nature.
Walter Bagehot

1. Знакомство с SoftICE
Общая характеристика
Приложение SoftICE выпускается как для операционной системы Windows 95,
так и для Windows NT, и состоит из отладчика уровня ядра SoftICE и утилиты
Symbol Loader. Собственно программа SoftICE (далее просто — SoftICE) представb
ляет собой многоцелевой отладчик, который может быть использован для отладки
практически любых типов программ, включая обработчики прерываний и драйвеb
ры ввода/вывода. Утилита Symbol Loader загружает отладочную информацию Ваb
шего модуля для использования ее в SoftICE, помогает составить строку инициалиb
зации и позволяет сохранять протокол работы SoftICE в файл. В последующих разb
делах данной главы дается краткое описание обоих программ.

SoftICE
SoftICE сочетает в себе мощь аппаратного отладчика с легкостью использования
символьного отладчика. Он предоставляет возможность установки прерываний,
подобных аппаратным, которые сохраняются, несмотря на все манипуляции опеb
рационной системы с виртуальной памятью. SoftICE позволяет просматривать исb
ходные тексты отлаживаемых Вами программ и обращаться к локальным и глоb
бальным переменным по их символическим именам.
SoftICE обладает следующими привлекательными особенностями:
 Отладка на уровне исходных кодов 32bбитных приложений (Win32), драйвеb
ров устройств Windows NT (как пользовательского уровня, так и уровня ядра),
драйверов Windows 95, VxD, 16bбитных Windows программ и DOS программ.
 Отладка практически любых типов кодов, включая обработчики прерываний
и ядро операционных систем Windows NT и Windows 95.
 Установка прерываний на обращение к памяти как по чтению, так и по запиb
си, на чтение/запись в порты ввода/вывода и на аппаратные прерывания.
 Установка прерываний на сообщения Windows.
 Задание условий возникновения прерываний и последовательности действий
при их возникновении.
 Показывает промежуток времени, прошедший до момента возникновения
прерывания, используя счетчик процессора Pentium.
 Отладка ядра операционной системы на одной машине.
 Выдача внутренней информации операционной системы, такой как:
 полная информация о процессах и потоках;
 распределение виртуальной памяти процесса;

10

1. Знакомство с SoftICE


точки входа ядра;
полная информация об объектах типа драйвер и устройство;
 параметры кучи Win32;
 кадры структурной обработки исключений;
 экспорт DLL.
 Позволяет использовать команду WHAT для идентификации имени или выраb
жения, если они могут быть приведены к одному из известных отладчику тиb
пов.
 Автоматическое появление экрана SoftICE при возникновении необрабатыb
ваемого исключения.
 Использование модема для подключения SoftICE к удаленному компьютеру.
Это позволяет изучить проблемы в работе удаленного компьютера, например,
причины краха системы.
 Поддержка набора инструкция MMX.
 Создание пользовательских макрокоманд.


Как устроен отладчик SoftICE
SoftICE для Windows 95 состоит из 2 файлов виртуальных драйверов (.VxD),
а SoftICE для Windows NT b из 2 драйверов устройств уровня ядра.
Windows 95
(VxD)

Windows NT
(драйверы
уровня ядра)

Описание

WINICE.EXE

NTICE.SYS

Обеспечивает собственно отладку

SIWVID.386

SIWVID.386

Обеспечивает поддержку видеосистемы
Вашего компьютера

Замечание: SoftICE для Windows NT должен загружаться самой операционной
системы, так как он встраивается как драйвер устройств. Следоваb
тельно, Вы не можете отлаживать такие составные части
Windows NT, как фрагменты кодов загрузки драйверов DriverEntry,
подпрограммы инициализации HAL и NTOSKRNL, и коды загрузb
чиков Windows NT или NTDETECT.
Интерфейс пользователя SoftICE
Вне зависимости от платформы SoftICE имеет общий интерфейс для отладки
приложений. Пользовательский интерфейс разработан для обеспечения максиb
мального удобства работы, но не в ущерб устойчивости системы. Для того, чтобы
обеспечить возможность появления экрана SoftICE в любой момент без нарушения
работы системы, отладчику необходимо непосредственно взаимодействовать с апb
паратным обеспечением. Исходя из этого, SoftICE использует полноэкранный симb
вольный режим вывода информации:



Начиная с версии 3.2, благодаря включению в пакет "универсального" видеоb
драйвера, SoftICE может работать в текущем видеорежиме без переключения в
текстовый режим. (Здесь и далее примечания переводчика.)

Общая характеристика

11

Подробно расположение информации на экране SoftICE описано в главе 5
"Управление SoftICE".

Symbol Loader
Утилита Symbol Loader (Символьный загрузчик) является программой, которая
позволяет извлекать отладочную информацию из Ваших, .EXEb, .DLLb и .OCXbфайb
лов, статических и динамических виртуальных драйверов (VxD), драйверов устb
ройств и загружать ее в SoftICE. Утилита также позволяет:
 настраивать типы и количество загружаемой в отладчик информации в соотb
ветствии с Вашими потребностями;
 автоматически загружать приложение и устанавливать прерывание на точку
его входа;
 сохранять результаты Вашей работы в файл.
Общий вид окна Symbol Loader показан на следующем рисунке:

Кроме графического режима работы, Symbol Loader поддерживает интерфейс
командной строки, что позволяет использовать многие его свойства в окне DOS и

12

1. Знакомство с SoftICE

автоматизировать большинство его функций. Кроме того, вместе с SoftICE поставb
ляется дополнительная утилита командной строки (NMSYM), с помощью которой
можно загружать отладочную информацию в пакетном режиме.

Поддержка пользователей
По общим вопросам
Служба поддержки пользователей фирмы NuMega позволит Вам получить ответы
на любые вопросы, касающиеся обновления программы, серийных номеров, и связанb
ные с поставками программных продуктов. Обращайтесь в любые дни с понедельника
по пятницу с 830 до 530 по восточноbамериканскому времени (EST) по телефонам:
 888b283b9896 — для жителей США и Канады;
 +1 603 578 8103 — для жителей других стран.

По техническим вопросам
Центр технической поддержки фирмы NuMega может помочь Вам в разрешеb
нии любых вопросов, начиная с установки продукта, и кончая различными техниb
ческими проблемами.
Прежде чем обратиться на фирму, внимательно прочтите соответствующие
разделы документации и ReadMe файлов.
С центром технической поддержки можно связаться следующими способами:
Ebmail:
Укажите серийный номер используемого Вами продукта, как можно
подробнее опишите возникшие у Вас проблемы и направьте письмо
по адресу Tech@numega.com.
WWW
Наша база знаний доступна по адресу www.numega.com, раздел
Support (Поддержка).
Телефон
Поддержка по телефону является платной услугой (помощь в вопросах
установки и запуска продуктов предоставляется бесплатно) и доступb
на с понедельника по пятницу с 830 до 530 по восточноbамериканскому
времени (EST). При обращении в службу имейте наготове номер верb
сии продукта и его серийный номер. Звоните по телефонам:
888 NUMEGAbS — для жителей США и Канады;
+1 603 578 8100 — для жителей других стран.
Факс
Укажите серийный номер используемого Вами продукта, как можb
но подробнее опишите возникшие у Вас проблемы и направьте
факс по номеру 603 578 8401.
Прежде чем обращать в службы поддержки фирмы NuMega, пожалуйста подгоb
товьте следующую информацию:
 Номер версии и серийный номер продукта.
 Конфигурацию системы: версия операционной системы, параметры сети, коb
личество оперативной памяти, переменные окружения и путь.
 Название и версию используемого Вами компилятора и линкера и параметры,
с которыми они запускаются.
 Описание проблемы; параметры инициализации, сообщения об ошибках,
дамп стека, содержание всех диагностических сообщений.
 Если проблема возникает постоянно, то опишите способ ее воспроизведения.

Любое великое дело должно иметь свое начало,
однако, лишь тщательное доведение его до логического конца
приносит желанную победу.
Сэр Френсис Дрейк

There must be a beginning of any great matter,
but the continuing unto the end until it be thoroughly finished
yields the true glory.
Sir Francis Drake

2. Установка SoftICE
Введение
В настоящей главе объясняется, как правильно установить SoftICE под управлеb
нием Windows 95 или Windows NT. Учтите, что программный продукт SoftICE для
Windows 95 может быть установлен только под управлением операционной систеb
мы Windows 95, а SoftICE для Windows NT — только под управлением Windows NT.

Требования к аппаратному и программному обеспечению
В зависимости от используемой Вами операционной системы SoftICE предъявb
ляет к аппаратному и программному обеспечению следующие требования:
Аппаратные
или программные
требования
Процессор

Windows 95

Windows NT

Процессор Intel x86

Процессор Intel x86

Хронометраж прерываний,
прерывание по вводу/выводу в
0 кольце защиты и полная подb
держка мыши требует наличия
процессоров Intel Pentium или
Intel Pentium Pro

Хронометраж прерываний,
прерывание по вводу/выводу в
0 кольце защиты и полная подb
держка мыши требует наличия
процессоров Intel Pentium или
Intel Pentium Pro
SoftICE поддерживает работу
однопроцессорных систем или
одного процессора в мультиb
процесорных системах

Операционная
система

Windows 95

Windows NT 3.51 (вып. 1057)
Windows NT 4.0 (вып. 1381)

Оперативная
память (RAM)

Минимально 16 Мб
Рекомендуется 32 Мб

Минимально 32 Мб
Рекомендуется 64 Мб
Продолжение на следующей странице

14

2. Установка SoftICE

Аппаратные
или программные
требования
Дисковое
пространство

Windows 95
5 Мб (без установки програмb
мы Adobe Acrobat Reader)

5 Мб (без установки програмb
мы Adobe Acrobat Reader)

7.5 Мб с установкой програмb
мы Adobe Acrobat Reader (для
просмотра руководства в элекb
тронной форме)

7.5 Мб с установкой програмb
мы Adobe Acrobat Reader (для
просмотра руководства в элекb
тронной форме)

Мышь
Последовательный или PS/2
(не обязательно) порты (совместимость с
Microsoft)
Видеосистема

Windows NT

Последовательный или PS/2
порты (совместимость с
Microsoft)

Один из следующих вариантов: Один из следующих вариантов:
один видеоадаптер и монитор один видеоадаптер и монитор
дополнительные монохромb
ная видеокарта и монитор

дополнительные монохромb
ная видеокарта и монитор

удаленный компьютер, подb
ключенный через последоваb
тельный порт

удаленный компьютер, подb
ключенный через последоваb
тельный порт

дополнительные VGA видеоb
карта и монитор

дополнительные VGA видеоb
карта и монитор

Истинные потребности в оперативной памяти определяются количеством заb
гружаемых одновременно символьных таблиц и файлов исходных кодов, так как
всю эту информацию SoftICE держит в памяти, чтобы в процессе работы не обраb
щаться к файловой системе.

Варианты вывода информации SoftICE на экран
В зависимости от типа отлаживаемого программного продукта и от Ваших приb
вычек можно использовать любую из следующих конфигураций видеосистем:
 один видеоадаптер и один монитор;
 дополнительные монохромная видеокарта и монитор;
 удаленный компьютер, подключенный через последовательный порт;
 дополнительные VGA видеоадаптер и монитор.
Каждая из перечисленных выше конфигураций подробно описывается в слеb
дующих разделах.
Один видеоадаптер и монитор
Стандартная конфигурация компьютера с одним видеоадаптером и одним моb
нитором используется, когда нет необходимости в дополнительной гибкости вывоb
да отлаживаемой информации. В активизированном состоянии SoftICE использует
монитор для вывода информации о текущем состоянии системы и приложения.
Однако, в этом случае Вы лишены возможности одновременно видеть состояние
Вашего приложения (прим. перев. — смотрите примечание на странице 10).

Требования к аппаратному и программному обеспечению

15

Дополнительные монохромная видеокарта и монитор
Использование дополнительного монохромного видеоадаптера типа MDA (Monob
chrome Display Adapter) или Hercules и подключенного к нему монохромного мониb
тора позволит Вам одновременно видеть как отладочную информацию, так и состояb
ние отлаживаемого Вами приложения. В такой конфигурации главный монитор исb
пользуется приложением, а отладочная информация выводится на монохромный моb
нитор. Однако, в такой ситуации размер окна SoftICE ограничен 25 строками.
Замечание: Большинство существующих видеоадаптеров может одновременно
работать с монохромными картами, однако, имеются и исключения.
За дополнительной информацией о возможностях Вашего видеоb
адаптера обращайтесь к соответствующей документации.
Применение дополнительных видеоадаптера и монитора особенно полезно в
следующих ситуациях:
 Работа с видеоадаптерами, не поддерживаемыми отладчиком.
Если SoftICE не поддерживает работу с Вашим видеоадаптером или Вы разраb
батываете для него новый драйвер, то для вывода отладочной информации Вы
можете использовать такую конфигурацию.
 Отладка видеодрайверов.
Когда SoftICE берет на себя управление видеоадаптером, он может изменить
содержимое некоторых его регистров. Использование дополнительной виb
деокарты позволит Вам избежать такой ситуации.
Удаленный компьютер,
подключенный через последовательный порт
Подключение через последовательный порт удаленного компьютера также поb
зволит Вам одновременно видеть как работу Вашего приложения, так и всю отлаb
дочную информацию. При этом основной компьютер используется приложением,
а удаленный демонстрирует работу SoftICE.
Проще говоря, удаленный компьютер используется как неинтеллектуальный
терминал для вывода информации и ввода команд с клавиатуры. Однако, в таких
условиях SoftICE не поддерживает на удаленном компьютере работу мыши.
Замечание: Удаленный компьютер должен обеспечивать работу MSbDOS.
Описываемая конфигурация может быть полезна при следующих обстоятельствах:
 Работа с видеоадаптерами, не поддерживаемыми отладчиком.
Если SoftICE не поддерживает работу с Вашим видеоадаптером или Вы разраb
батываете для него новый драйвер, то для вывода отладочной информации Вы
можете использовать такую конфигурацию. Эта возможность особенно поb
лезна при работе с лаптопами.
 Отладка видеодрайверов.
Когда SoftICE берет на себя управление видеоадаптером, он может изменить
содержимое некоторых его регистров. Использование удаленного компьютеb
ра позволит Вам избежать такой ситуации.
 Отладка драйверов клавиатуры
SoftICE использует тот же драйвер клавиатуры, что и приложение, поэтому
нельзя исключить вероятность возникновения самых непредвиденных ситуаb
ций. Применение удаленного компьютера позволит Вам избежать этого.

16

2. Установка SoftICE
Дополнительные VGA видеокарта и монитор

Использование дополнительных VGAbадаптера и монитора обеспечивает Вам
максимальную гибкость работы. Основной монитор используется для работы Ваb
шего приложения, в то время как SoftICE показывает отладочную информацию доb
полнительном мониторе.
Внимание: Лишь немногие видеоадаптеры разработаны для поддержки мульb
тидисплейных систем. Тестирование одновременной работы двух
видеоадаптеров может испортить Ваш компьютер. Поэтому, если в
документации на видеоадаптер нет указаний о такой возможности,
лучше всего считать, что он ее не поддерживает.
Обратитесь к документации на Ваш видеоадаптер за дополнительной информаb
цией, каким образом отключить на ней поддержку режима VGA.

Подготовка к установке
Прежде чем устанавливать пакет SoftICE, необходимо выяснить следующие воb
просы:
1 Если Вы собираетесь устанавливать SoftICE под управлением Windows NT, то
проверьте, обладаете ли Вы полномочиями администратора.
2 Определите, какую из приведенных ниже конфигураций видеосистемы Вы
будете использовать для работы:
 Один видеоадаптер и один монитор
Определите фирмуbпроизводителя видеоадаптера и его модель.
 Дополнительные видеокарта и монитор
Определите производителя и модель основного видеоадаптера.
 Удаленный компьютер
Определите производителя и модель видеоадаптера на основном компьютере.
 Дополнительный VGA видеоадаптер
Проверьте, могут ли оба видеоадаптера работать одновременно.
Совет:
Для определения производителя и модели видеоадаптера испольb
зуйте окно контрольной панели.
3 Определите тип используемой Вами мыши (последовательный или PS/2). Если
Вы используете мышь с последовательным интерфейсом, то определите порт
ее подключения (COM1 или COM2).
4 Завершите все открытые программы.

Установка
Пакет SoftICE поставляется на одном компактbдиске. Приведенные ниже инстb
рукции поясняют, как правильно установить пакет под управлением Windows 95
или Windows NT.
1 Поместите компактbдиск в дисковод и запустите программу установки
(setup.exe).
2 Выберите пункт "INSTALL SOFTICE".
3 Введите в окне регистрации (Registration window) Ваше имя и название компании
(Name и Company, соответственно), и серийный номер пакета (Serial number).
Серийный номер указан в Вашей регистрационной карте.
4 В окне "Select Install Directory" выберите каталог, куда Вы собираетесь устаb
навливать пакет.

Установка

17

По умолчанию под управлением Windows 95 пакет устанавливается в дирекb
торию "C:\SIW95", а под Windows NT — в "C:\NTICE". Если выбранная Вами
директория не существует, то мастер установки создаст ее самостоятельно.
5 В окне "Display Adapter Selection" (выбор видеоадаптера), выберите один из
следующих вариантов:
 Для использования SoftICE в стандартной конфигурации с одним видеоb
адаптером и монитором выберите производителя (Manufacturer) и модель
(Model) видеоадаптера. Если такого адаптера в списке нет, то выберите виb
деоадаптер с таким же набором микросхем, как указано в разделе
"COMPATIBILITY" (совместимость). Если же и такого не существует, то выбеb
рите "STANDARD VGA (640X480 PIXELS)", а по окончании установки обратитесь
к приложению B "Поддерживаемые видеоадаптеры".
 Для использования SoftICE с дополнительным монохромным монитором,
выберите "DISPLAY SOFTICE ON ATTACHED MONOCHROME MONITOR" (Вывод
SoftICE на дополнительном монохромном мониторе), а затем выберите проb
изводителя (Manufacturer) и модель (Model) основного видеоадаптера. Если
такого адаптера в списке нет, то выберите видеоадаптер с таким же набором
микросхем, как указано в разделе "COMPATIBILITY" (совместимость). Если же
и такого не существует, то выберите "STANDARD VGA (640x480 pixels)".
 Для того, чтобы использовать SoftICE с удаленным компьютером, выберите
производителя (Manufacturer) и модель (Model) основного видеоадаптера. Если
такого адаптера в списке нет, то выберите видеоадаптер с таким же набором
микросхем, как указано в разделе "COMPATIBILITY" (совместимость). Если же и
такого не существует, то выберите "STANDARD VGA (640X480 PIXELS)".
 Чтобы использовать SoftICE с дополнительной VGA видеокартой, выберите
"STANDARD VGA (640X480 PIXELS)". В этом случае SoftICE игнорирует основной
видеоадаптер и использует дополнительную VGA видеокарту и монитор.
Замечание: Если после установки SoftICE необходимо сменить тип или модель
видеоадаптера, пользуйтесь утилитой "DISPLAY ADAPTER SETUP"
6 Если параметры видеоадаптера, выбранного Вами в окне "Display Adapter
Selection", совпадают с параметрами, установленными в Windows 95 или
Windows NT, то нажмите кнопку "TEST" для их окончательной проверки. В
следующей таблице приведены условия, когда необходимо проводить дополb
нительное тестирование, а когда нет.
Ситуация

Тестировать

Для Windows и для SoftICE выбран "Standard VGA"
видеоадаптер.

X

Видеоадаптер для Windows совпадает либо по
фирмеbпроизводителю и модели, либо по набору
микросхем с выбранным для SoftICE.

X

Для SoftICE выбран адаптер VGA, а в Windows усb
тановлен какойbлибо иной видеоадаптер, не станb
дартный VGA.

Не
тестировать

X

Внимание: Сохраните любую незавершенную работу перед тестированием виb
деоадаптера. Если для SoftICE выбран несоответствующий видеоb
адаптер, то весьма вероятно, что по окончании тестирования экран
не будет восстановлен должным образом. Кроме того возможно, хоb
тя и мало вероятно, что тестирование приведет к краху всей системы.

18

2. Установка SoftICE

Если тестирование пройдет успешно, то в течение примерно 5 секунд экран
восстановит свое прежнее состояние. Если же установки SoftICE несовместимы с
указанным Вами типом видеоадаптера, то экран будет черным, или будет иметь неb
обычный вид. Если Вам не подойдет ни один из перечисленных видеоадаптеров, то
выберите режим "STANDARD VGA (640X480 PIXELS)", а по окончанию установки обраb
титесь к приложению B "Поддерживаемые видеоадаптеры".
7 Если Вы устанавливаете SoftICE под управлением Windows NT, то выберите
один из вариантов в окне "Startup Mode Selection window" для определения
способа загрузки SoftICE.
Windows NT
Startup Mode
Option

Описание

BOOT

Такие загрузочные драйверы, как драйвер контроллера дисb
ка и некоторые системные драйверы являются критическиb
ми на этапе загрузки. Чтобы гарантировать загрузку иниb
циализационных файлов или файлов с отладочной инфорb
мацией, SoftICE всегда загружается в качестве последнего
загрузочного драйвера. Отсюда следует, что Вы не сможете
отлаживать подпрограммы инициализации (DriverEntry) друb
гих загрузочных драйверов.

SYSTEM

Системные драйверы загружаются после загрузочных. В
данный момент система все еще находится в режиме
"Синего окна".

AUTOMATIC

Автоматические драйверы загружаются контроллером серb
висов (Service Controller Manager) на последнем этапе заb
пуска системы. Основная часть системы к данному моменту
уже загружена. Если Вы хотите, что SoftICE запускался каb
ждый раз при старте Windows NT, но Вы не собираетесь отb
лаживать драйверы устройств ядра системы, то можете заb
гружать его на данном этапе.

MANUAL

SoftICE не запускается автоматически при старте системы.
Этот ражим наиболее безопасен и гибок, однако, он исклюb
чает возможность отладки драйверов устройств на этапе заb
грузки. За дополнительной информацией обращайтесь к
разделу "Загрузка SoftICE вручную" главы 4 на странице 37.

Замечание: Для изменения варианта загрузки SoftICE используйте утилиту
"Startup Mode Setup".
8 В окне "Mouse Selection" укажите имеющуюся у Вас мышь:
 Serial (connected to COM1) — Последовательная (подключена к COM1).
 Serial (connected to COM2) — Последовательная (подключена к COM2)
 PS/2 compatible — PS/2bсовместимая
 None — мышь отсутствует
Замечание: Чтобы выбрать иной тип мыши после установки программы, восb
пользуйтесь утилитой "Mouse Setup"
9 Если Вы устанавливаете SoftICE под управлением Windows 95, то выберите
один из следующих вариантов в окне "System Configuration".

Действия после установки программы

19

Windows 95
Startup Mode
Option

Описание

Let Setup modify
AUTOEXEC.BAT
(Модифицировать
AUTOEXEC.BAT)

Данная опция позволяет добавить в конец
AUTOEXEC.BAT команду C:\SIW95\WINICE.EXE. В
случае необходимости C:\SIW95\ заменяется на имя
директории, где в действительности установлен SoftICE.

Save the required
changes in
AUTOEXEC.ICE
(Записать необхоb
димые изменения
в AUTOEXEC.ICE)

Данная опция позволяет Вам предварительно оценить
возможные изменения прежде, чем они будут сделаны.
Для этого мастер установки копирует AUTOECE.BAT в
файл AUTOEXEC.ICE и добавляет команду WINICE.EXE.
После того, как Вы одобрите предлагаемые изменения,
файл AUTOEXEC.BAT будет удален, а вместо него будет
записан (и соответствующим образом переименован)
AUTOEXEC.ICE.

Do not make any
changes
(Не делать никаких
изменений)

При выборе данной опции изменения в файле
AUTOEXEC.BAT не производятся. Вам потребуется саb
мостоятельно изменить конфигурацию системы для тоb
го, чтобы загрузить SoftICE до WIN.COM. Обратитесь к
разделу "Настройка загрузки SoftICE под управлением
Windows 95" данной главы на странице 20.

10В окне "Start Copying Files" (Начать копирование файлов) нажмите кнопку "NEXT".
11В окне "Setup Complete" (Установка закончена) нажмите кнопку "FINISH" для
перезагрузки компьютера. Если Вы не хотите в данный момент перезагружать
компьютер, нажмите "NO, I WILL RESTART MY COMPUTER LATER" (Нет, я перезаb
гружу компьютер позднее), а затем кнопку "FINISH".
12Прочтите файл README для ознакомления с последними изменениями проb
граммного продукта.
13Выполните необходимые процедуры после установки программы.

Действия после установки программы
После установки SoftICE необходимо выполнить следующие действия:
1 Если Вы предполагаете запускать SoftICE под управлением Windows NT на
одном процессоре в мультипроцессорной системе, отредактируйте файл
BOOT.INI, чтобы добавить новый режим загрузки. За дополнительной инb
формацией обратитесь к разделу "Настройка BOOT.INI для поддержки одного
процессора в мультипроцессорной системе" на странице 20.
2 Если Вы работаете под управлением Windows 95 и выбрали режим "LET SETUP
MODIFY AUTOEXEC.BAT", операционная система не передаст управление
SoftICE при выключении компьютера. Следовательно, Вы не сможете сохраb
нить протокол выполнения прерываний. Чтобы избежать этого, установите в
файле MSDOS.SYS параметр BootGUI=0. Просмотрите раздел "Справочника
по командам SoftICE", посвященный команде BH, а также раздел "Настройка
загрузки SoftICE под управлением Windows 95" на странице 20.
3 Если Вы работаете под управлением Windows 95 и выбрали режим "DO NOT MAKE
ANY CHANGES", сконфигурируйте Windows 95 таким образом, чтобы загружать
SoftICE перед WIN.COM. За дополнительной информацией обратитесь к разделу
"Настройка загрузки SoftICE под управлением Windows 95" на странице 20.

20

2. Установка SoftICE
4 Если Вы используете удаленный компьютер для вывода отладочной информаb
ции, сконфигурируйте SoftICE, как это описано в разделе "Подключение уда
ленного компьютера через последовательный порт" на странице 21.
5 Если Вы работаете под управлением Windows 95 и количество физической
памяти на Вашем компьютере превышает 32 Мб, установите правильное знаb
чение параметра "TOTAL RAM" в настройках SoftICE. Смотрите раздел "Изме
нение общих установок" на странице 121.
6 Заполните регистрационную карточку и карту "NuMega Upgrade Subscription
Program" и перешлите их фирме NuMega.
NuMega Upgrade Subscription Program предоставляет Вам возможность автоb
матического обновления пакета. Если Вы покупаете NuMega Upgrade
Subscription Program через посредников, эта карта позволит фирме узнать,
куда пересылать необходимые обновления. Если Вы не покупали участие в
программе, то данная карта подробно расскажет Вам о ней и предоставит возb
можность дальнейшего в ней участия.

Настройка BOOT.INI для поддержки одного процессора
в мультипроцессорной системе
Если Вы хотите использовать SoftICE для Windows NT для работы с одним проb
цессором в многопроцессорной системе, то отредактируйте файл BOOT.INI добаb
вив новый режим загрузки:
1 Файл BOOT.INI является скрытым файлом. Для того, чтобы сделать его досb
тупным, используйте команду ATTRIBUTE:
ATTRIBUTE BOOT.INI -S -H -R
2 Запустите какойbлибо текстовый редактор, например Notepad, и откройте файл.
3 В качестве отправной точки для создания нового режима загрузки используйb
те уже имеющуюся запись, которая запускает Вашу версию Windows NT. Наb
пример, у Вас существует запись такого типа (детали могут различаться в заb
висимости от используемой Вами версии операционной системы):
multi(0)disk(0)rdisk(0)partition(1)\winnt="Windows NT
Workstation Version 3.51"
4 Скопируйте ее в секцию "Operating Systems" и добавьте в конце строки знаb
чение /onecpu
multi(0)disk(0)rdisk(0)partition(1)\winnt="Windows NT
Workstation Version 3.51" /onecpu
5 Измените название нового режима загрузки (запись, помещенную между
двойными кавычками) для облегчения дальнейшей работы:
multi(0)disk(0)rdisk(0)partition(1)\winnt="Windows NT
Workstation Version 3.51 One CPU" /onecpu
6 Перезапустите компьютер.

Настройка загрузки SoftICE под управлением Windows 95
SoftICE является отладчиком уровня ядра, поэтому он должен быть загружен до
запуска WIN.COM. По умолчанию загрузка Windows 95 производится автоматичеb
ски, не предоставляя Вам возможности самому вызывать программу WIN.COM.
Если Вы отлаживаете приложения, то просто добавьте WINICE.EXE в конце Вашего
AUTOEXEC.BAT файла. Если же Вы отлаживаете статические VxD или иные драйb
веры, то для оптимизации загрузки используйте описываемую ниже процедуру.

Действия после установки программы

21

1 Выполните одно из перечисленных ниже действий для предотвращения автоb
матической загрузки Windows 95 и для запуска только ядра DOS.
 В начале загрузки нажмите клавишу F8. В появившемся стартовом меню выb
берите пункт "COMMAND PROMPT ONLY". Эту процедуру приходится выполb
нять при каждом запуске компьютера.
 Добавьте в конце файла AUTOEXEC.BAT команду PAUSE и при остановке заb
грузки нажмите CtrlbC для перехода в режим DOS.
 Создайте пустой файл с именем WIN.BAT. При запуске Windows 95 она исb
полнит этот файл вместо WIN.COM и перейдет в командный режим DOS.
 Модифицируйте скрытый файл Windows 95 MSDOS.SYS (который фактически
является текстовым .INIbфайлом) следующим образом:
 Выполните команду ATTRIB для удаления атрибутов "скрытый", "системный"
и "только для чтения" у файла MSDOS.SYS.
 Замените параметр BootGUI=1 на BootGUI=0 (или добавьте его, если данb
ная запись в файле отсутствует) .
2 Выполните команду WINICE.EXE для загрузки SoftICE, который, в свою очеb
редь, запустит Windows 95.
3 Выполните Вашу работу.
4 Если необходимо перезапустить компьютер, то выберите режим "SHUT DOWN
THE COMPUTER" или "RESTART THE COMPUTER" (соответственно, "ВЫКЛЮЧИТЬ
КОМПЬЮТЕР" или "ПЕРЕЗАГРУЗИТЬ КОМПЬЮТЕР" в русской версии Windows 95).
Любой иной режим выключения нарушает работу SoftICE. После вывода заb
ключительного сообщения о выключении компьютера SoftICE переводит виb
деоадаптер в текстовый режим 8025 и выводит подсказку командной строки
DOS шага 1. Для продолжения отладки повторите шаг 2.

Подключение удаленного компьютера
через последовательный порт
В данном разделе описывается, каким образом использовать команду SERIAL и
утилиту SERIAL.EXE для подключения удаленного компьютера через последоваb
тельный порт. Утилита SERIAL.EXE является MSDOSbпрограммой, которая позвоb
ляет использовать удаленный компьютер в качестве неинтеллектуального терминаb
ла для вывода сообщений и ввода информации с клавиатуры.
Замечание: Вы можете также использовать утилиту SERIAL.EXE для подключеb
ния компьютера через модем. Более подробно об этом описано в
главе 10 "Использование SoftICE с модемом" на странице 117.
Для настройки работы SoftICE с удаленным компьютером необходимо выполb
нить следующее:
1 Если Вы работаете с операционной системой Windows 95, то укажите, какой поb
следовательный порт (COM1, COM2, COM3 или COM4) вы собираетесь испольb
зовать для соединения компьютеров. Если же Вы используете Windows NT, то
перейдите к этапу 2, так как SoftICE под управлением Windows NT самостоятельb
но определяет используемый порт.
Для указания номера последовательного коммуникационного порта сделайте
следующее:
 Запустите утилиту Symbol Loader
 Выберите из меню "EDIT" пункт "SOFTICE INITIALIZATION SETTINGS" (Начальb
ные установки SoftICE)


После этого следует восстановить у файла MSDOS.SYS атрибуты "скрытый",
"системный" и "только для чтения".

22

2. Установка SoftICE


Выберите необходимый последовательный порт.
Перезапустите компьютер.
За дополнительной информацией обращайтесь к разделу 11 главы "Настрой
ка удаленной отладки" на странице 123.
2 Для соединения локального и удаленного компьютеров используйте нульb
модемный кабель. Распайка кабеля показана на следующих рисунках.


Контакты

Контакты

2

2

3

3

4

4

5

5

6

6

7

7

8

8

20

20

Распайка 25bконтактного нульbмодемного кабеля
Контакты

Контакты

2

2

3

3

5

5

7

7

8

8

6

6

1

1

4

4

Распайка 9bконтактного нульbмодемного кабеля
3 Скопируйте утилиту SERIAL.EXE из директории SoftICE на удаленный комb
пьютер.
4 Запустите на удаленном компьютере утилиту SERIAL.EXE с параметрами:
SERIAL.EXE [r] [com-port [baud-rate]],
например, SERIAL.EXE 1 57000
Параметр "r" используется при запуске утилиты в окне DOS под управлением
Windows NT для отключения режима FIFO и установки в исходное состояние
скорости обмена, стоповых битов и бита четности.
Параметр "com-port" указывает номер последовательного порта (от 1 до 4, по
умолчанию 1). Если Вы указываете параметр "baud-rate" (скорость обмена),
он должен совпадать со значением скорости обмена, заданным на локальном
компьютере. Кроме того, при указании этого параметра необходимо задавать
и "com-port". Если скорость обмена не указана, то два компьютера устанавb
ливают ее автоматически.

Разрешение проблем с видеоадаптерами

23

После этого удаленный компьютер ожидает, пока локальный установит с ним
связь.
5 Каждый раз при запуске SoftICE Вам необходимо выполнить на локальном
компьютере команду:
SERIAL [ON [com-port [baud-rate]] | OFF]
например, SERIAL ON 1 57000
Параметр "ON" инициирует связь, тогда как параметр "OFF" завершает ее.
Параметры "com-port" и "baud-rate" аналогичны описанным в шаге 2. За
дополнительной информацией по команде SERIAL обращайтесь к "Справоч
нику по командам SoftICE".
Если связь установлена успешно, то на удаленном компьютере появляется окb
но SoftICE.
Совет:
Чтобы не набирать эту команду каждый раз при запуске SoftICE, доb
бавьте ее в инициализационную строку. Более подробную инфорb
мацию смотрите в главе 11 "Настройка SoftICE" на странице 120.

Разрешение проблем с видеоадаптерами
SoftICE может быть использован для отладки практически любых частей систеb
мы, так как в процессе работы он не обращается к операционной системе. Чтобы
это было возможным, SoftICE должен взаимодействовать с аппаратным обеспечеb
нием непосредственно. Хотя большинство устройств стандартизировано, однако,
стандарт на режимы работы видеоадаптеров за пределами режимов стандартного
VGA отсутствует. Следовательно, отладчику приходится обеспечивать собственb
ную поддержку наиболее распространенных видеоадаптеров для безопасного пеb
реключения из графического режима в текстовый и обратно.
Вполне возможна ситуация, когда, несмотря на то, что мы поддерживаем исb
пользуемый Вами видеоадаптер, тем не менее, у Вас он не работает. Это может
происходить по нескольким причинам:
 Первая, и наиболее частая, причина заключается в том, что производитель
внес в Вашу модель некоторые изменения. Например, он мог использовать
модифицированный набор микросхем или применить другой RAMDAC.
 Вы работаете с разрешением и глубиной цветности, которые мы не тестировали.
 Используемый Вами драйвер видеоадаптера несколько отличается от того, коb
торый был использован нами, и он меняет настройку видеоадаптера таким обb
разом, что это нарушает работу SoftICE.
Если используемый Вами видеоадаптер либо не поддерживается SoftICE, либо
не работает должным образом, попробуйте следующее:
1 Проверьте все возможные варианты видеоадаптеров, совпадающие по модели
и фирмеbпроизводителю или по набору микросхем.
2 С момента получения Вами пакета прошло некоторое время, в течение котоb
рого фирма NuMega могла дополнить поддержку пакетом Вашего видеоадапb
тера. Вы можете попробовать обновить Ваш пакет. Для этого:
 Переименуйте имеющийся у Вас видеодрайвер и сохраните его на всякий
случай.
Под управлением Windows 95 файл siwvid.386 находится в директории устаb
новки SoftICE, а под управлением Windows NT файл siwvid.sys находится в
подкаталоге \system32\drivers директории установки Windows NT.
 Загрузите свежий видеодрайвер (для Windows 95 это файл SIWVID.ZIP, а для
Windows NT — SIWVIDNT.ZIP) с сервера FTP или с BBS фирмы NuMega:
FTPbсервер: ftp.numega.com, pub/tech/file name

24

2. Установка SoftICE
BBS: (603)595b0386,file имяфайла (параметр "имяфайла" чувствителен к реb
гистру, поэтому проследите, чтобы он был набран прописными символами)
 Распакуйте новый драйвер и поместите его в соответствующую директорию.
 Запустите утилиту Display Adapter Setup.
3 Пошлите письмо по электронной почте по адресу tech@numega.com, указав,
какие проблемы вы имеете с видео. Добавьте также:
 Полное наименование производителя видеоадаптера и его модель и приблиb
зительное время покупки.
 Разрешение и глубину цвета, которые Вы используете.
 Если известно, идентификационные номера использованного в видеоадапb
тере набора микросхем.
 Если известно, идентификационные номера использованного в видеоадапb
тере RAMDAC.
4 Попробуйте следующие варианты работы:
 Установите режим "STANDARD VGA (640X480 PIXELS)" как для SoftICE, так и для
Windows. Ваш видеоадаптер будет в этом случае функционировать в режиме
VGA, снимая таким образом все проблемы совместимости. Фирма NuMega
рекомендует эту возможность в качестве решения на короткий срок.
 Используйте дополнительные монохромный видеоадаптер и монитор. Это
популярное и относительно недорогое решение, которым пользуются мноb
гие разработчики.
 Используйте в качестве экрана для вывода информации SoftICE удаленный
компьютер, подключенный через последовательный порт. Это решение
наиболее подходит для лаптопов.
 Используйте дополнительные VGA видеокарту и монитор. Некоторые виb
деоадаптеры обеспечивают возможность одновременной работы нескольb
ких видеокарт.
Более подробная информация по этим конфигурациям дана в разделе
"Варианты вывода информации SoftICE на экран" странице 14.

Теперь мы обсудим борьбу за существование более детально.
Чарльз Дарвин

We will now discuss in a little more detail the struggle for existence.
Charles Darwin

3. Учебник SoftICE
Введение
Эта глава позволит Вам получить необходимый начальный опыт отладки прилоb
жений Windows, продемонстрирует основные этапы отладки приложений и драйb
веров. В течение этого урока вы узнаете, как:
 загрузить SoftICE;
 сформировать приложение;
 загрузить исходный код приложения и файлы с отладочной информацией;
 трассировать и пошагово выполнять исходные и машинные коды;
 просматривать локальные данные и структуры;
 устанавливать контрольные точки и точки останова;
 использовать команд SoftICE для исследования состояния приложения;
 работать с символическими именами и таблицами символов;
 изменять контрольные точки таким образом, чтобы они активизировались
лишь при определенных условиях.
Каждый раздел в учебнике построен на основе предыдущего, так что их следует
изучать по порядку.
В качестве примера в учебнике используется приложение GDIDEMO, преднаb
значенное для демонстрации возможностей GDI операционных систем Windows.
GDIDEMO размещен в каталоге \EXAMPLES\GDIDEMO Вашего CDROM’а, а также
в каталоге \mstools\samples\win32\GDIDEMO. Если у Вас GDIDEMO находится на
CDROM, то скопируйте его на жесткий диск.
Вы можете заменить пример другими, в том числе и Вашими своими собственb
ными приложениями. Принципы отладки и функции SoftICE, использованные в
данной главе, применимы в большинстве случаев.
Замечание: Примеры этого учебника основаны на работе под операционной
системой Windows NT. При использовании Windows 95 могут быть
незначительные различия.

Загрузка SoftICE
Если Вы запускаете SoftICE под Windows 95 или под Windows NT в режиме Boot,
System или Automatic, то SoftICE автоматически запускается при каждом запуске
или перезагрузке компьютера. В ручном (Manual) режиме под Windows NT SoftICE
автоматически загружаться не будет.
Для загрузки SoftICE из Windows 95 введите команду WINICE. Для загрузки
SoftICE под Windows NT выполните одно из перечисленных ниже действий:
 Выберите в меню пункт "START SOFTICE".

26

3. Учебник SoftICE


Введите команду: NET START NTICE.
Замечание: Запустив SoftICE, Вы не сможете его выгрузить до полной перезаb
грузки компьютера.
Для проверки загрузки SoftICE нажмите комбинацию клавиш CtrlbD. Должен
появится экран SoftICE. Для возвращения в систему используйте команды X (eXit
— Выход) или G (Co to — Перейти к) (функциональная клавиша F5).

Пример построения приложения GDIDEMO
Первый шаг при подготовке к отладке приложения Windows — это компиляция
и компоновка его с отладочной информацией. Для этого в демонстрационном приb
ложении GDIDEMO уже создан makefile.
Для построения программы выполните следующие действия:
1 Откройте окно DOS.
2 Перейдите в директорию, где находится исходный код приложения.
3 Выполните команду NMAKE:
C:\MSTOOLS\SAMPLES\WIN32\GDIDEMO>NMAKE
Если GDIDEMO находится в другой директории, укажите правильный путь.

Загрузка приложения GDIDEMO
При загрузке приложения происходит создание символьного файла из отладочb
ной информации и загрузка символьных и исходных файлов в SoftICE. Для загрузb
ки приложения GDIDEMO выполните следующие действия:
1 Запустите утилиту Symbol Loader.
Появится окно символьного загрузчика.

2 Выберите "OPEN MODULE" из меню "FILE" или щелкните по кнопке "OPEN".
Появится диалог выбора файла.
3 Выберите файл GDIDEMO.EXE и нажмите клавишу "OPEN".
4 Выберите пункт "LOAD" из меню "MODULE" или щелкните по кнопке "LOAD"
для загрузки GDIDEMO.

Управление экраном SoftICE

27

Символьный загрузчик транслирует отладочную информацию в символьный
файл .NMS, загружает символьные и исходные файлы, запускает GDIDEMO,
открывает экран SoftICE, и отображает исходный текст приложения из файла
GDIDEMO.C

Управление экраном SoftICE
Экран SoftICE — это Ваш главный инструмент для просмотра и отладки кода.
На экране может быть отображено до семи различных окон и одна справочная
строка, что позволит вам просматривать и управлять различными аспектами сеанса
отладки. По умолчанию, на экране отображено следующее:
 Local Window (Окно локальных переменных) — Отображает текущий кадр стека.
 Code Window (Окно кода) — Отображает исходный текст программы или соb
ответствующие им ассемблерные инструкции.
 Command Window (Окно команд) — Предназначено для ввода команд пользоb
вателя и отображение информации.
 Help Line (Строка подсказки) — Предоставляет краткую информацию о коb
мандах SoftICE, а также показывает текущий контекст адреса.
1 Рассмотрим содержимое окна кода. Обратите внимание, что SoftICE отобраb
жает подпрограмму WinMain в 34 строке. По умолчанию, после загрузки ваb
шего приложения SoftICE создает контрольную точку в первом основном моb
дуле и останавливается на ней.
2 Чтобы увидеть все исходные файлы, которые загружены в SoftICE, введите
команду FILE с параметром "*":
:FILE *
SoftICE покажет список исходных файлов GDIDEMO: draw.c, maze.c, xform.c,
poly.c, wininfo.c, dialog.c, init.c, bounce.c, и gdidemo.c. Окно команд изменяет
свой размер в зависимости от числа строк, используемых другими открытыми
окнами, так что Вы можете и не увидеть весь список сразу. Для просмотра
продолжения списка нажмите любую клавишу. (Изменение размеров окон
описано в глава 5 "Интерфейс SoftICE" на странице 58.)
3 Практически в каждом окне SoftICE можно использовать прокрутку. Если у
Вас подключена мышь, то Вы можете щелкнуть на стрелках прокрутки. Если
нет, то не расстраивайтесь, SoftICE позволяет пролистывать окна с помощью
различных комбинаций клавиш. В таблице приведены последовательности
действий для листания окна кода.
Листание окна кода

Комбинации
клавиш

Работа мышью

На предыдущую страницу PageUp

Щелкните по верхней внутb
ренней стрелке

На следующую страницу

PageDown

Щелкните по нижней внутb
ренней стрелке

На предыдущую строку

Стрелка вверх

Щелкните по верхней внешb
ней стрелке

На следующую строку

Стрелка вниз

Щелкните по нижней внешb
ней стрелке

На один символ влево

CtrlbСтрелка влево

Щелкните по левой стрелке

На один символ вправо

CtrlbСтрелка вправо Щелкните по правой стрелке

28

3. Учебник SoftICE
4 Ввод команды U с параметром EIP приводит к дизассемблированию текущей
инструкции (инструкция, подсвеченная в данный момент).
:U EIP
Это же действие можно выполнить с помощью команды "." (точка):
:.

Трассировка и пошаговое выполнение кода
Следующие шаги покажут Вам, как использовать SoftICE для трассировки исb
ходного кода:
1 Введите команду T (Trace — Трассировать) или нажмите клавишу F8.
:T
Происходит выполнение одной строки исходного кода. Следующая за ней
строка окажется подсвеченной.
if(!hPrevInst)
2 Окно кода в настоящее время отображает исходный текст. Однако, это окно
может также отображать дизассемблированный код или смешанный (исходb
ный и дизассемблированный) код. Для просмотра смешанного кода испольb
зуйте команду SRС (F3).
:SRJ
Обратите внимание, что каждая строка исходного текста теперь сопровождаb
ется ассемблерными командами.
3 Нажмите F3 еще раз для получения "чистого" дизассемблерного кода, а затем
еще раз для возврата на экран исходного текста.
4 Введите команду T (F8) для трассировки следующей инструкции.
Исполняйте эту команду до тех пор, пока не достигнете строки, выполняющей
функцию RegisterAppClass.
Как было показано, команда T выполняет одну исходную инструкцию или коb
манду ассемблера. Вы также можете использовать команду P (F10) для пошагового
исполнения программы. Пошаговое исполнение отличается от трассировки тем,
что при выполнении команды CALL, управление не будет возвращено до полного
завершения вызванной функции.
Совет:
Команда T не трассирует вызовы функций, если их исходный текст
недоступен. Хороший пример этого — Win32 API. Для трассировки
вызовов функций в случаях, когда недоступен исходный текст, исb
пользуйте команду SRC (F3) для переключения в смешанный или
ассемблерный режим.

Просмотр локальных данных
Окно локальных переменных предназначено для отображения текущего кадра
стека. В нашем случае это окно содержит локальные данные для функции
WinMain. Следующие шаги иллюстрируют, как можно использовать окно локальb
ных переменных:
1 Выполните команду T, чтобы войти в функцию RegisterAppClass. Окно лоb
кальных переменных на данный момент пусто, потому что память под локальb
ные переменные еще не выделена.
Код функции RegisterAppClass находится в исходном файле INIT.C. SoftICE
отображает имя текущего исходного файла в верхнем левом углу окна кода.

Установка точек прерывания

29

2 Снова выполните команду T.
Окно локальных переменных содержит параметр hInstance, переданный в
RegisterAppClass, и локальную структуру wndClass. Структура wndClass отмеb
чена знаком "+". Это означает, что Вы можете развернуть структуру и проb
смотреть ее содержимое.
Замечание: Вы также можете разворачивать символьные строки и массивы.
3 Если у Вас установлен процессор типа Pentium и имеется мышь, то двойным
щелчком по структуре WNDCLASSA Вы можете развернуть ее. Чтобы сверb
нуть структуру wndClass, щелкните дважды по знаку ““.
4 Развернуть структуру можно и с помощью клавиатуры: нажмите AltbL, чтобы
переместить курсор в окно локальных переменных, стрелками вверх или вниз
переместите подсвеченную строку на структуру и нажмите Enter. Чтобы
свернуть структуру, нажмите Enter еще раз.

Установка точек прерывания
Этот раздел научит вас устанавливать два типа контрольных точек: одноразовые
и постоянные.

Установка одноразовой контрольной точки
Ниже показано, как можно установить одноразовую контрольную точку. Она
отличается тем, что удаляется сразу после того, как произойдет ее выполнение.
1 Чтобы вернуться в окно кода, необходимо щелкнуть по нему мышкой или наb
жать AltbC.
Если Вы хотите вернуться обратно в окно команд, то снова нажмите AltbC.
2 Используйте стрелку вниз на клавиатуре, стрелку прокрутки вниз или команb
ду U для того, чтобы переместить курсор на 61 строку (первый вызов API
функции RegisterClass). Если вы используете команду U, то командная строка
должна выглядеть так:
:U .61
SoftICE разместит эту строку вверху окна кода.
3 Используйте команду HERE (функциональная клавиша F7), чтобы исполнить
код до строки 61.
Команда HERE исполняет программу, начиная с текущей инструкции, до инb
струкции, на которую указывает курсор. Команда HERE устанавливает одноb
разовую точку прерывания на определенный адрес или строку исходного кода
и продолжает исполнение до срабатывания этого прерывания. После срабаb
тывания прерывания, SoftICE автоматически удаляет данную точку, так что
второй раз она уже не сработает.
В результате окажется подсвеченной следующая строка:
if (!RegisterClass(&wndClass))
Замечание: Тоже самое вы можете сделать, используя команду G (Перейти к),
задав номер строки, до которой необходимо исполнить программу:
:G .61

Установка постоянной точки прерывания
Следующая последовательность действий иллюстрирует установку второго тиb
па контрольных точек: постоянной точки прерывания, которая не удаляется после
срабатывания.

30

3. Учебник SoftICE
1 Найдите следующий вызов функции RegisterClass, он происходит в строке 74.
Установите курсор на строку 74 и введите команду BPX (F9). Команда BPX усb
танавливает точку прерывания, вставляя в исходный код инструкцию INT 3.
2 Повторное нажатие клавиши F9 удалят контрольную точку.
Если у Вас в компьютере используются процессор Pentium и мышь, вы можеb
те двойным щелчком на любой строке в окне кода устанавливать или удалять в
ней контрольную точку.
3 Установите точку прерывания на 74 строке, и командой G или X (F5) продолb
жайте выполнения программы до тех пор, пока эта точка не сработает.
:G
Окно SoftICE появится после выполнения инструкции INT 3.
В отличие от команды HERE, ставящей одноразовую контрольную точку, коb
манда BPX устанавливает постоянную точку прерывания, которая существует
до тех пор, пока Вы ее не удалите.
4 Для просмотра информации о текущей точке прерывания используйте команb
ду BL:
:BL
00) BPX #0137:00402442
Замечание: Адрес, который вы увидите, может не совпадать с данным здесь.
Команда BL показала Вам, что установлена одна контрольная точка на адрес
0x402442. Этот адрес соответствует 74 строке исходного текста в файле INIT.C.
5 Вы можете использовать вычислитель выражений SoftICE, чтобы перевести ноb
мер строки в адрес. Чтобы определить адрес 74 строки, используйте команду ?:
:? .74
void *= 0x00402442
6 Функция RegisterAppClass имеет относительно простую реализацию, поэтому
нет необходимости трассировать каждую строку исходного кода. Используя
команду P с параметром RET (функцинальная клавиша F12), можно вернуться
в точку, откуда произошел вызов функции:
:P RET
Параметр RET в команде P заставляет SoftICE полностью выполнить вызванную
процедуру до момента выхода из нее. SoftICE остановится в блоке WinMain на
инструкции, расположенной после вызова функции RegisterAppClass, так как
функция RegisterAppClass была вызвана из WinMain. Следующая строка в блоb
ке WinMain окажется подсвеченной.
msg.wParam = 1;
7 Чтобы удалить все установленные контрольные точки, введите команду BC со
звездочкой в качестве параметра:
:BC *

Использование информационных команд SoftICE
SoftICE предоставляет большое количество информационных команд, которые
позволяют вам следить за состоянием приложения или системы. Данный раздел
объясняет назначение двух команд: H (помощь) и CLASS.
1 Команды H и CLASS лучше всего работают, когда у Вас достаточно места для
размещения выводимой ими информации, поэтому закройте окно локальных
переменных командой WL, что приводит к увеличению размера окна команд.

Использование идентификаторов и таблиц символов

31

2 Команда H предоставляет общие сведения обо всех командах SoftICE или деb
тальную справку о конкретной команде. Для просмотра детальной справки о
команде CLASS введите CLASS в качестве параметра команды H:
:H CLASS
Display window class information
CLASS [-x] [process | thread | module | class-name]
ex: CLASS USER
Первая строка справки предоставляет описание команды, вторая — полный
ее синтаксис, включая все опции и/или параметры, а третья — пример исb
пользования команды.
3 Функция RegisterAppClass регистрирует шаблон класса окна, который исb
пользуется приложением GDIDEMO для создания окна. Используйте команду
CLASS, чтобы исследовать классы, зарегистрированные GDIDEMO.
:CLASS GDIDEMO
Class Name
Handle
Owner
Wndw Proc
Styles
----------------------Application Private--------------------BOUNCEDEMO
A018A3B0
GDIDEMO
004015A4
00000003
DRAWDEMO
A018A318
GDIDEMO
00403CE4
00000003
MAZEDEMO
A018A280
GDIDEMO
00403A94
00000003
XFORMDEMO
A018A1E8
GDIDEMO
00403764
00000003
POLYDEMO
A018A150
GDIDEMO
00402F34
00000003
GDIDEMO
A018A0C0
GDIDEMO
004010B5
00000003
Замечание: В этом примере показаны только классы, которые зарегистрироваb
ны приложением GDIDEMO. Классы, зарегистрированные другиb
ми модулями Windows, например USER32, опущены.
Информация, выводимая командой CLASS — это сводная информация для кажb
дого класса окна, зарегистрированного от имени процесса GDIDEMO. Она вклюb
чает имя класса, адрес внутренней структуры данных WINCLASS, модуль, который
этот класс зарегистрировал, адрес процедуры для оконного класса, заданной по
умолчанию, и значение флагов стиля класса.
Замечание: Для получения более детального описания класса окна используйте
команду CLASS с опцией –X, как показано ниже:
:CLASS –x

Использование идентификаторов и таблиц символов
Теперь, когда Вы достаточно знакомы с SoftICE, чтобы пошагово отлаживать,
трассировать и создавать точки прерывания, настало время исследовать идентифиb
каторы и таблицы. Когда Вы загружаете отладочную информацию приложения,
SoftICE создает таблицу, которая содержит все идентификаторы, определенные для
этого модуля.
1 Используйте команду TABLE, чтобы просмотреть все таблицы идентификатоb
ров, загруженных на данный момент.
:TABLE
GDIDEMO [NM32]
964657 Bytes Of Symbol Memory Available
Активная в данный момент таблица идентификаторов отображается жирным
шрифтом. Эта таблица используется для интерпретации идентификаторов
имен. Сделать активной другую необходимую Вам в данный момент таблицу
можно с помощью команды TABLE, указав в качестве параметра ее имя:
:TABLE GDIDEMO

32

3. Учебник SoftICE
2 Для вывода списка идентификаторов из текущей таблицы используется коb
манда SYM. Если текущей окажется таблица GDIDEMO, то команда SYM выb
ведет список, подобный приведенному ниже:
:SYM
.text(001B)
001B:00401000
001B:004010B5
001B:004011DB
001B:00401270
001B:00401496
001B:004014D2
001B:004014EA
001B:00401530
001B:004015A4
001B:004016A6
001B:00401787
001B:0040179C

WinMain
WndProc
CreateProc
CommandProc
PaintProc
DestroyProc
lRandom
CreateBounceWindow
BounceProc
BounceCreateProc
BounceCommandProc
BouncePaintProc

Это список символических имен из раздела .text исполняемой программы. Разb
дел .text обычно используется для процедур и функций. Все идентификаторы, отоb
браженные в этом примере, являются функциями GDIDEMO.

Установка условного прерывания
Одним из идентификаторов, определенных в GDIDEMO, является имя функции
LockWindowInfo. Эта функция предназначена для получения значения указателя,
которое является специфическим для каждого экземпляра окна.
Для изучения условных точек прерывания и контрольных точек в памяти Вами
будут выполнены следующие шаги:
 вы установите контрольную точку типа BPX на функцию LockWindowInfo;
 отредактируете эту точку с использованием условного выражение, получив
таким образом условную контрольную точку;
 установите контрольную точку на адрес в памяти для того, чтобы отлеживать
доступ к фрагменту ключевой информации, как описано это в разделе “Уста
новка контрольной точки чтения/записи в память” на странице 34.

Установка точки прерывания BPX
Перед установкой условной контрольной точки, Вам необходимо установить
точку прерывания типа BPX на функцию LockWindowInfo.
1 Установите прерывание на функцию LockWindowInfo:
:BPX LockWindowInfo
Когда одному из окон GDIDEMO необходимо вывести чтоbлибо в своей рабоb
чей области, оно вызывает функцию LockWindowInfo. Каждый раз, когда выb
зывается эта функция, будет активизирован экран SoftICE. Окна в приложеb
нии GDIDEMO меняются непрерывно, поэтому эта точка прерывания срабаb
тывает очень часто.
2 Проверьте факт установки контрольной точки командой BL.
3 Выйдите из SoftICE командой X или G.
Всякий раз, когда произойдет вызов функции LockWindowInfo, на мониторе
будет появляться экран SoftICE.

Установка условного прерывания

33

Редактирование точки прерывания
Из прототипа функции LockWindowInfo, расположенного в строке 47, видно,
что в функцию передается один параметр типа HWND, а из функции возвращается
указатель не установленного типа. Параметр HWND — это дескриптор окна, котоb
рое пытается вывести информацию в рабочей области. В настоящий момент нам
необходимо изменить существующую контрольную точку, добавив условие для
выявления нужного нам значения HWND.
1 Прежде чем устанавливать условную контрольную точку, необходимо полуb
чить значение HWND для окна POLYDEMO. Команда HWND предоставляет
информацию об окнах приложения, поэтому выполните команду HWND с паb
раметром GDIDEMO:
:HWND GDIDEMO
Ниже показано, что Вы должны увидеть на экране при использовании операb
ционной системы Windows NT. Если Вы работаете под Windows 95, информаb
ция будет немного отличаться.
Handle
Class
WinProc
TID
Module
07019C
GDIDEMO
004010B5
2D
GDIDEMO
100160
MDIClient
77E7F2F5
2D
GDIDEMO
09017E
BOUNCEDEMO
004015A4
2D
GDIDEMO
100172
POLYDEMO
00402F34
2D
GDIDEMO
11015C
DRAWDEMO
00403CE4
2D
GDIDEMO
Дескриптор окна POLYDEMO выделен подчеркиванием и жирным шрифтом.
Именно это значение Вы и будете использовать при формировании условного
выражения. Если в области вывода HWND информация об окне POLYDEMO
отсутствует, то выйдите из SoftICE, используя команду G или X (F5), и повтоb
ряйте шаг 1 до тех пор, пока данное окно не будет создано.
Значение, использованное в нашем примере, скорее всего будет отличаться от
того, которое увидите Вы. Для правильного выполнения данного упражнения
Вам следует использовать фактическое значение HWND для Вашей системы.
Используя дескриптор окна POLYDEMO, Вы можете составить условное выb
ражение для контроля вызова функции LockWindowInfo, проверяя совпадеb
ние передаваемого программе параметра с требуемым значением дескриптоb
ра. Когда будет вызвана функция LockWindowInfo с дескриптором окна
POLYDEMO, появится экран SoftICE.
2 Так как на функцию LockWindowInfo контрольная точка уже установлена, то
с помощью команды BPE (редактирование контрольной точки) ее можно изb
менить:
:BPE 0
Когда Вы выдаете команду BPE для изменения существующей контрольной
точки, SoftICE помещает ее описание в командную строку:
:BPX LockWindowInfo
В конце командной строки появится курсор, чтобы вы смогли набрать условb
ное выражение.
3 Не забудьте подставить значение дескриптора окна POLYDEMO, которое Вы
нашли с помощью команды HWND вместо значения 100172, используемого в
данном примере. Ваше условное выражение должно выглядеть следующим
образом (условное выражение выделено жирным шрифтом):
:BPX LockWindowInfo IF ESP->4 == 100172
Замечание: Приложения Win32 передают параметры через стек в точке вхоb
да функции; первый параметр имеет положительное смещение 4 относительb

34

3. Учебник SoftICE
но регистра ESP. Для вычислителя выражений SoftICE это записывается в виb
де: ESP b>4. ESP — это регистр указателя вершины стека, а оператор “b>” заb
ставляет левую часть выражения (в данном случае — ESP) принять смещение,
указанное в правой его части (4). Для более полной информации о вычислиb
теле выражений обратитесь к главе 8 "Использование выражений", а за сведеb
ниями относительно стека в условных выражениях обратитесь к разделу
"Условные прерывания" на странице 91.
4 Командой BL проверьте, что точка прерывания и условное выражение устаb
новлены правильно.
5 Выйдите из SoftICE, используя команду G или X (F5).
Когда в следующий раз появится экран SoftICE, условное выражение будет
иметь значение ИСТИНА.

Установка контрольной точки чтения/записи в память
Мы установили контрольную точку, а затем добавили условное выражение так,
чтобы иметь возможность получить адрес структуры данных, уникальной для каждоb
го экземпляра окна POLYDEMO. Это значение сохранено в дополнительных данных
окна (extra data) и является глобальным дескриптором. Функция LockWindowInfo
находит этот глобальный дескриптор и использует Win32 API LocalLock для трансляb
ции его в указатель, который может быть использован для доступа к данным этого
экземпляра окна.
1 Получите значение указателя для данных экземпляра окна, выполняя проb
грамму до строки 57.
:G .57
2 Функции Win32 API возвращают 32bразрядные значения в регистре EAX, так
что Вы можете использовать команду BPMD с регистром EAX для установки
контрольной точки в памяти на указатель данных экземпляра окна.
:BPMD EAX
Для контроля чтения и/или записи двойных слов (Dword) по линейному адреb
су команда BPMD использует аппаратные отладочные регистры процессоров
фирмы Intel. В нашем случае, вы выполняете команду BPMD для перехвата
доступа чтения и записи к первому двойному слову (Dword) данных экземпляb
ра окна.
3 Используйте команду BL для того, чтобы проверить правильность установки
контрольной точки. Вы должны увидеть примерно следующее:
:BL
00) BPX LockWindowInfo IF ((ESP->4)==0x100172)
01) BPMD #0023:001421F8 RW DR3
Контрольная точка с индексом 0 — это прерывание выполнения функции
LockWindowInfo, а точка 1 — это контрольная точка BPMD на данные экземпb
ляра окна.
4 Для отключения точки прерывания на LockWindowInfo выполните команду BD.
:BD 0
SoftICE имеет команды BC (удалить точку прерывания) и BD (отключить точку
прерывания). Отключение полезно, когда Вы хотите повторно использовать
эту же контрольную точку в следующем сеансе отладки. Если же Вы не собиb
раетесь снова использовать какоеbлибо прерывание, имеет смысл его удалить.

Установка контрольной точки чтения/записи в память

35

5 Используйте команду BL для того, чтобы проверить отключение точки прерыb
вания на LockWindowInfo. SoftICE отмечает блокированные прерывания
звездочкой "*" после его индекса. Вы должны увидеть примерно следующее:
:BL
00) * BPX LockWindowInfo IF ((ESP->4)==0x100172)
01) BPMD #0023:001421F8 RW DR3
Замечание: Снова задействовать временно отключенную точку прерывания
можно с помощью команды BE:
:BE - - 

6 Выйдите из SoftICE, используя команду G или X.
Когда окно POLYDEMO обратится к первому двойному слову (Dword) данных
экземпляра окна, сработает прерывание и появится экран SoftICE.
Если экран SoftICE появится вследствие срабатывания контрольной точки в
памяти, Вы окажетесь в функции PolyDrawBez или PolyRedraw. Обе функции
обращаются к полю nBezTotal со смещением 0 данных экземпляра окна
POLYDRAW.
Замечание: Архитектура процессоров фирмы Intel определяет точки прерыb
вания в памяти как ловушки, что означает их срабатывание после обращения
к памяти. Команда или исходная строка, подсвеченные в SoftICE в данный
момент — это команда или исходная строка, которая только что обратилась к
памяти.
7 Удалите контрольные точки, которые вы устанавливали в этом разделе, исb
пользуя команду BC.
:BC *
Замечание: Вы можете использовать символ звездочка "*" в командах BC, BD
и BE для удаления, отключения и включения всех контрольных точек одноb
временно.
8 Выйдите из SoftICE, используя команду G или X.
Операционная система завершит приложение.
Поздравляем, Вы закончили свой первый сеанс отладки. В этом сеансе Вы науb
чились трассировать исходный код, просматривать локальные данные и структуры,
устанавливать контрольные точки и добавлять к ним условия, устанавливать точки
прерывания в памяти. SoftICE предоставляет гораздо больше возможностей. Коb
манды ADDR, HEAP, LOCALS, QUERY, THREAD, TYPES, WATCH и WHAT являются одb
ними из многих команд SoftICE, которые помогут Вам отлаживать приложения боb
лее просто и быстро. За полным описанием команд обращайтесь к "Справочнику по
командам SoftICE".

Дьявол кроется в деталях.
Декарт

The devil is in the details.
Descartes

4. Загрузка кода в SoftICE
Концепции отладки
SoftICE позволяет прозводить отладку прикладных программ Windows и драйb
веров устройств на уровне исходного кода. Для этого SoftICE использует утилиту
Symbol Loader (Символьный Загрузчик), транслирующую отладочную информацию
из Вашего модуля в файл .NMS. Затем Symbol Loader может загрузить .NMSbфайл
и, по желанию, исходный код в SoftICE для их использования в сеансе отладки.
Момент загрузки .NMS зависит от того, когда исполняется отлаживаемый моb
дуль — после инициализации операционной системы, или это драйвер устройства
или статический VxD, который загружается перед инициализацией операционной
системы. Если Вы разрабатываете драйвер устройства или VxD, SoftICE загрузит
символы модуля и исходный код в момент собственного запуска. Если Вы отлажиb
ваете модуль или компонент, который исполняется после загрузки операционной
системы, с помощью Symbol Loader Вы можете загрузить символьную информацию
тогда, когда она понадобится.
Эта глава объясняет, как использовать Symbol Loader, чтобы загрузить Ваш моb
дуль в SoftICE. Здесь также рассказывается, как использовать загрузчик из коb
мандной строки DOS для автоматизации исполняемых им задач, и как пользоваться
утилиту командной строки NMSYM для создания пакетов трансляции и загрузки
символьной информации.
Замечание: Symbol Loader поддерживает только прикладные программы Windows.
Для отладки прикладных программ MSbDOS используйте утилиты каb
талога UTIL16.

Подготовка к отладке прикладных программ
Ниже приведены общие принципы подготовки к отладке модулей и их компоb
нентов, исполняемых после загрузки операционной системы. Это могут быть исb
полняемые .EXEbфайлы, библиотеки DLL, динамические .VxD и .OCX b файлы. В
последующих разделах перечисленные этапы объясняются более подробно.
1 Сформируйте модуль с отладочной информацией.
2 Загрузите SoftICE, если он еще не загружен.
3 Запустите Symbol Loader.
4 Щелкните по кнопке "OPEN", чтобы открыть отлаживаемый модуль.
5 Оттранслируйте отладочную информацию в файл .NMS и загрузите ее вместе
с исходным кодом в SoftICE.

Запуск SoftICE вручную

37

Подготовка к отладке драйверов устройств и VxD
Следующая последовательность шагов показывает, что необходимо выполнить
для отладки драйверов устройств или статических VxD, которые загружаются преb
жде, чем операционная система полностью инициализируется. В последующих
разделах перечисленные этапы объясняются более подробно.
1 Сформируйте прикладную программу с отладочной информацией.
2 Загрузите SoftICE, если он еще не загружен.
3 Запустите Symbol Loader.
4 Щелкните по кнопке "OPEN", чтобы открыть отлаживаемый модуль
5 Выберите пункт "PACKAGE SOURCE WITH SYMBOL TABLE" в режимах трансляции
Symbol Loader. (См. раздел "Изменение параметров настройки модуля" на
странице 40.)
6 Для создания нового .NMS файла щелкните по кнопке "TRANSLATE".
7 Измените параметры настройки SoftICE для загрузки отладочной информаb
ции VxD или драйвера устройства при запуске. (Подробности настройки
смотрите в разделе "Предварительная загрузка символьной информации и ис
ходного кода" на странице 121.)
8 Перезагрузите компьютер.

Запуск SoftICE вручную
SoftICE не запускается автоматически при следующих конфигурациях:
 Если Вы не запустили WINICE.EXE из AUTOEXEC.BAT перед стартом Windows 95.
 Если Вы установили ручной режим запуска SoftICE для Windows NT.
Если Вы используете такие конфигурации, то SoftICE необходимо загрузить
вручную. Следующие разделы описывают, как это сделать под операционными
системами Windows 95 и Windows NT.

Загрузка SoftICE для Windows 95
Чтобы загрузить SoftICE для Windows 95, запустите его из командной строки
DOS. После инициализации SoftICE автоматически производит запуск Windows 95.
Команды имеет следующий синтаксис:
Синтаксис команды
WINICE

[/HST n][/TRA n][/SYM n ][/M] [/LOAD [x] имяфайла]
[/EXP имяфайла] [диск:\путь\WIN.COM [WINкоманднаястрока]]
Необязательные параметры:
Параметр

Описание

/EXP имяфайла

Добавляет экспортируемые символы из DLL или приложеb
ний Windows, заданных параметром "имяфайла" данные в
SoftICE. Это позволит Вам обращаться к этим данным с поb
мощью символических имен

/HST n

Увеличивает размер буфера протокола вызова команд, где
n – количество Кб (десятичное). По умолчанию n=8 Кб .
Продолжение на следующей странице



Если речь идет о параметре "HISTORY BUFFER SIZE" (размер буфера протокола), то его
размер по умолчанию равен 256К (см. страницу 120).

38

4. Загрузка кода в SoftICE
Ключ

Описание

/LOAD
имяфайл [x]

Загружает отладочную информацию и исходный код, где
файл –полный путь и имя собранных вместе с отладочной
информацией VxD, DOS TSR, загружаемых драйверов DOS,
DOS программ, драйверов Windows, Windows DLL и проb
грамм для Windows. Если присутствует параметр "x", то исb
ходный код загружаться не будет.

/M

Направляет вывод SoftICE на дополнительный монохромb
ный монитор в обход VGA.

/SYM n

Резервирует n (десятичное) килобайт под таблицу симвоb
лов. По умолчанию n=0 Kб .

/TRA n

Устанавливает размер буфера обратной трассировки равb
ным n Кб (десятичное). По умолчанию n=8 Kb.

Совет:

Вы можете определять эти переключатели в строке инициализации.
(Смотрите раздел "Изменение начальных установок SoftICE" на
странице 119.)

Запуск SoftICE для Windows NT
Чтобы загрузить SoftICE для Windows NT, сделайте следующее:
 Выберите "START SOFTICE".
 Введите команду: NET START NTICE.
Замечание: Как только Вы загрузите SoftICE, Вы не сможете его дезактивироb
вать до тех пор, пока не перегрузите компьютер.

Создание приложений с отладочной информацией
Ниже дается сводная таблица параметров компиляции и компоновки программ.
Полную информацию, касающуюся формирования Вашей прикладной программы
с отладочной информацией, смотрите в соответствующей документации.
Компилятор

Создание отладочной информации

Borland C++ Для создания стандартной отладочной информации:
4.5 и 5.0
Компиляция с ключом /v
Компоновка с ключом /v
Delphi 2.0

Для создания стандартной отладочной информации
компилируйте проект со следующими ключами:
bV — для включения отладочной информации в исполняемый
модуль.
b$W+ — чтобы создать кадры стека.
b$D+ — чтобы создать информацию отладки.
b$L+ — чтобы создать локальные символы отладки.
b$O — чтобы отключить оптимизацию
Продолжение на следующей странице



Под отладочную информацию по умолчанию выделяется 1024 Кб в Windows 95 и
512 Кб в Windows NT (см. страницу 122).

Использование Symbol Loader для трансляции и загрузки файлов
Компилятор
MASM 6.11

39

Создание отладочной информации
Для создания отладочной информации CodeView:
Ассемблировать с ключами /Zi /COFF
Используйте 32bразрядный компоновщик Microsoft (LINK.EXE)
с ключами
/DEBUG /DEBUGTYPE:CV /PDB:NONE

Microsoft
Visual C++
2.x, 4.0, 4.1,
4.2, и 5.0

Для создания базы данных отладочной информации программы
(PDB):
Компилируйте, используя опцию командной строки /Zi
Используйте компоновщик Microsoft с ключами
/DEBUG /DEBUGTYPE:CV
Замечание: VxD требует создания отладочной информации PDB.
Для создания отладочной информации CodeView:
Компилируйте с отладочной информацией, совместимой с C7,
используя опцию командной строки /Z7
Используйте компоновщик Microsoft с ключами
/DEBUG /DEBUGTYPE:CV /PDB:NONE
Замечание: Если Вы используете стандартную процедуру
Windows NT DDK, то используйте следующие переменные
среды: NTDEBUG=ntsd и NTDEBUGTYPE=windbg.

Symantec
C++ 7.2

Компилятор фирмы Symantec создает отладочную информаb
цию CodeView по умолчанию. Все, что требуется – это разb
решить ее вывод:
Компилируйте с ключом –g
Также можно использовать –gh, –gf, и –gg
Компонуйте проект с ключом /CO

Watcom
C++ 10.5

Для создания отладочной информации CodeView:
Компилируйте с ключами –hc –d3
Компонуйте проект с ключами
DEBUG CODEVIEW OPTION CVPACK

Использование Symbol Loader для трансляции и загрузки файлов
Прежде чем SoftICE сможет отлаживать Вашу прикладную программу, .DLL или
драйвер, Вы должны создать символьный файл для каждого отлаживаемого модуb
лей, а затем загрузить их в SoftICE. Утилита Symbol Loader делает эту процедуру
простой и быстрой. Эта программа позволяет Вам выбрать необходимый модуль и
создать соответствующий символьный файл, после чего загрузит его в SoftICE вмеb
сте с исходным кодом и исполняемым файлом. По умолчанию загружаются все
файлы, упомянутые в отладочной информации. Подробности того, как можно заb
гружать только необходимые в конкретном сеансе исходные файлы смотрите в
разделе " Задание исходных файлов программы" на странице 45.
Чтобы загрузить модуль с помощью утилиты Symbol Loader, сделайте следующее:
1 Запустите Symbol Loader.

40

4. Загрузка кода в SoftICE

2 Выберите пункт "OPEN MODULE" из меню "FILE", либо щелкните по кнопке
"OPEN".
3 Выберите в диалоговом окне необходимый файл и нажмите кнопку "OPEN".
4 Если Вы открываете файл типа .SYM, Symbol Loader поинтересуется, 32bразb
рядный это файл или нет. Ответьте, соответственно YES или NО.
Изbза ограничений формата .SYMbфайлов SoftICE не может самостоятельно
определить разрядность .SYMbфайлов (16b или 32bбитный).
Совет:
Как только Вы открываете файл, он добавляется к списку недавно
открывавшихся файлов в нижней части меню "FILE". Используйте
этот список для ускорения повторного открытия файла.
1 Выберите пункт "LOAD" из меню "MODULE", либо нажмите кнопку "LOAD" для
загрузки открытого файла.
Symbol Loader транслирует отладочную информацию из Вашей прикладной
программы в символьный файл .NMS, а затем загружает его вместе с исходb
ным текстом программы в SoftICE. Если Вы загружаете исполняемый файл
(.EXE), то SoftICE запускает программу и устанавливает точку прерывания в
первом основном модуле (WinMain, Main, или DllMain), c которым он сталкиb
вается.
Объем загружаемой информации зависит от параметров настройки режимов
трансляции и отладки. Смотрите раздел "Изменение параметров настройки
модуля" на странице 40 для получения более полной информации относительb
но параметров настройки режимов трансляции и отладки.

Изменение параметров настройки модуля
Утилита Symbol Loader имеет ряд параметров для управления трансляцией и заb
грузкой файлов. Их можно разделить на 3 группы:
 Общие — параметры командной строки и пути поиска исходных файлов.
 Параметры трансляции — определяют, какую комбинацию символов
(открытая информация (Public), информация о типах, символы или символы и
источник) транслирует Symbol Loader.

Изменение параметров настройки модуля

41



Параметры отладки — определяют типы файлов (символьные или исполняеb
мые), загружаемые утилитой в SoftICE, а также действия, исполняемые
SoftICE во время загрузки.
Эти параметры устанавливаются для каждого модуля отдельно, то есть изменеb
ние индивидуальных установок сказывается только на текущем модуле. Когда Вы
открываете другой модуль, Symbol Loader использует установки по умолчанию.
Чтобы изменить заданные по умолчанию параметры настройки модуля, сделайb
те следующее:
1 Откройте файл, если он еще не открыт.
Совет:
Имя открытого в данный момент файла показано в заголовке окна
Symbol Loader.
2 Выберите пункт "SETTINGS" из меню "MODULE".
3 Щелкните на закладке, которая объединяет группу параметры настройки, коb
торые Вы хотите изменить. (Более подробная информация о параметрах наb
стройки дана в последующих разделах).
4 Когда все изменения сделаны, нажмите OK.
5 Загрузите файл, чтобы применить Ваши изменения.

Изменение Общих Параметров настройки (вкладка General)
Вкладка General позволяет установить параметры командной строки и опредеb
лить путь для поиска исходного файла.

Общие параметры настройки описаны в следующих разделах.
Command line arguments (Параметры Командной строки)
Используйте "COMMAND LINE ARGUMENTS" для задания параметров командной
строки, передаваемых Вашему приложению.

42

4. Загрузка кода в SoftICE
Source file search path for program
(Путь для поиска исходного файла данной программы)

Параметр "SOURCE FILE SEARCH PATH FOR THIS PROGRAM" задает пути поиска файb
лов, связанных с данным приложением. Если Symbol Loader не может найти файлы
по заданному пути, он использует "DEFAULT SOURCE FILE SEARCH PATH" (путь поиска
файлов по умолчанию) для развернутого поиска.
Default source file search path
(Путь поиска файлов по умолчанию)
Параметр "DEFAULT SOURCE FILE SEARCH PATH" используется для задания основного
пути, используемого SoftICE для поиска файлов. Эта установка является глобальной.
Обратите внимание, что, если Вы задаете значение параметра SOURCE FILE
SEARCH PATH FOR THIS PROGRAM для конкретной программы, то Symbol Loader испольb
зует сначала этот путь, и только потом путь, заданный по умолчанию.
Prompt for missing source files
(Запрос при отсутствии исходного файла)
Если флаг "PROMPT FOR MISSING SOURCE FILES" установлен, то Symbol Loader обраb
тится к Вам за помощью в случае, если исходный файл не будет найден. Этот параb
метр является глобальным и по умолчанию включен.
Minimize loader on successful load
(Минимизировать загрузчик при успешной загрузке)
Используйте "MINIMIZE LOADER ON SUCCESSFUL LOAD" для автоматической миниb
мизации Symbol Loader после загрузки .EXEbфайла. Этот параметр является глоb
бальным и по умолчанию включен.

Изменение параметров трансляции (вкладка Translation)
Параметры трансляции определяют, какая информация транслируется утилиb
той Symbol Loader при создании .NMSbфайла, а также нужно ли сохранять исходb
ный текст программы в символьном файле. Эти настройки определяют количество
памяти, необходимой для отладки Вашей программы, и перечислены в порядке возb
растания требуемого количества памяти.
Следующие разделы описывают параметры настройки трансляции (изображеb
ние вкладки находится на странице 43).
Public only (Только общие)
В символьный файл транслируются только глобальные имена переменных и
функций. Ни информация о типах, ни исходный код в этом случае в файл не вклюb
чаются.
Type information only (Только информация о типах)
При этом значении параметра транслируется только информацию о типах. Исb
пользуйте эту установку для добавлении информации о типах структур данных, коb
торую Вы смогли обнаружить при исследовании программ.

Изменение параметров настройки модуля

43

Symbols only (Только Символы)
Установка этого значения параметра позволяет транслировать глобальные, стаb
тические и локальные имена символов в дополнение к информации об их типах.
Исходный текст не включается.
Symbols and source code (Символы и исходный код)
При значении "SYMBOLS AND SOURCE CODE" в символьный файл помещается вся
отладочная информация, включая исходный код и номера строк. Эта установка заb
действована по умолчанию.
Package source with symbol table
(Сохранение исходного файла вместе с таблицей символов)
Установка этого флага приводит к сохранению исходный текст Вашей програмb
мы вместе с отладочной информацией в файле .NMS, что может понадобится при
следующих обстоятельствах:
 Загрузка исходного текста на этапе начальной загрузки
SoftICE не ищет кодовых файлов при начальной загрузке. Если Вам необхоb
димо загрузить исходный текст для VxD или драйвера Windows NT, установиb
те флаг "PACKAGE SOURCE WITH SYMBOLS TABLE". Затем измените параметры
инициализации SoftICE так, чтобы загрузить отладочную информацию для
VxD или драйвера устройства при запуске. Смотрите раздел "Предваритель
ная загрузка символической информации и исходного кода" на странице 121.
 Отладка в системе, которая не имеет доступа к Вашим исходным файлам
Если Вы хотите отлаживать Ваше приложение в системе, которая не имеет досb
тупа к Вашим исходным файлам, установите при трансляции флаг "PACKAGE
SOURCE WITH SYMBOLS TABLE и скопируйте файл" .NMS в эту систему.
Внимание: Если Вы устанавливаете флаг "PACKAGE SOURCE WITH SYMBOLS TABLE",
исходный текст Вашей программы будет доступен любому, кто обb

44

4. Загрузка кода в SoftICE
ращается к таблице символов. Если Вы не хотите, чтобы другие
имели доступ к исходному тексту, но Вы предоставляете .NMS файл
вместе с приложением, то выключите этот флаг.

Изменение параметров отладки (вкладка Debugging)
Параметры отладки определяют, какой тип информации загружать, и нужно ли
останавливаться в точке входа Вашего модуля.

Следующие разделы описывают настройки параметров отладки.
Load symbol information only
(Загрузка только символьной информации)
"LOAD SYMBOL INFORMATION ONLY" позволяет загрузить только файл символов
.NMS, но не загружает при этом исполняемый код. Исходные файлы загружаются
в том случае, если Вы выбрали значение параметра трансляции "SYMBOLS AND
SOURCE CODE". По умолчанию, Symbol Loader использует эту установку для файлов
.DLL, .SYS, и .VxD типов.
Load executable (Загрузка исполняемого кода)
"LOAD EXECUTABLE" позволяет загрузить и Вашу исполняемую программу, и файл
.NMS. Также загружаются соответствующие исходные файлы, если Вы выбрали
значение параметра трансляции SYMBOLS AND SOURCE CODE. По умолчанию, Symbol
Loader использует эту установку для файлов типа .ЕХЕ.
Stop at WinMain, Main, DLLMain, etc.
(Останов в WinMain, Main, DllMain и т.д.)
Установка этого флага создает контрольную точку в первом основном модуле, с
которым сталкивается SoftICE в процессе загрузки Вашего приложения.

Задание исходных файлов программы

45

Задание исходных файлов программы
По умолчанию производится загрузка всех исходных файлов приложения, коb
торые упомянуты в отладочной информации. В зависимости от Ваших задач исb
ходные коды всей программы могут Вам и не понадобиться. Кроме того, если колиb
чество исходных файлов велико, загрузка их всех непрактична.
Во избежание загромождения памяти ненужными исходными текстами, SoftICE
позволяет Вам использовать .SRCbфайл, который определяет, что именно необхоb
димо загрузить для данного сеанса работы. Этот текстовый файл, содержащий
список имен исходных файлов (по одному в строке) создается в том же каталоге,
где размещено Ваше приложение; имя файла совпадает с именем этого приложеb
ния, но имеет расширение .SRC. Файл .SRC.
Пример:
Если у Вас есть программа PROGRAM.EXE, Вы можете создать
.SRCbфайл с именем PROGRAM.SRC. Содержимое его будет выгляb
деть примерно так:
FILE1.C
FILE3.CPP
FILE4.C
Несмотря на то, что FILE2.C — это нормальный исходный файл
приложения, он не будет загружен, потому что его нет в .SRC файb
ле, а загружены будут только файлы FILE1.C, FILE3.CPP и FILE4.C.

Удаление таблиц символов
Каждый раз, когда Вы транслируете приложение, утилита Symbol Loader создаb
ет .NMSbфайл отладочной информации в форме таблицы символов. После загрузки
модуля, Symbol Loader сохраняет таблицу в памяти до тех пор, пока Вы ее не удалиb
те или не перезагрузите компьютер.
Чтобы удалить таблицу символов, сделайте следующее:
1 Выберите пункт "SYMBOL TABLES" в меню "EDIT".

2 Выберите в списке TABLE ID таблицы, которые Вы хотите удалить и нажмите
"REMOVE" (Удалить).
Совет:
Используйте заголовки таблиц для их сортировки по идентификаb
тору, типу, .SYM=, размеру .NMS или номеру версии. Список всеb
гда сортируется в порядке возрастания.

46

4. Загрузка кода в SoftICE

Запуск утилиты Symbol Loader из командной строки DOS
Утилита Symbol Loader (LOADER32.EXE) поддерживает интерфейс командной
строки, который позволяет Вам использовать многие ее свойства из командной
строки DOS без использования графического интерфейса. Таким образом, Вы моb
жете автоматизировать многие часто встречающиеся задач.
Прежде чем запускать LOADER32.EXE из командной строки DOS, с помощью
графического интерфейса утилиты установите пути поиска файлов и определите
параметры трансляции и отладки для каждого из модулей, которые Вы планируете
загружать. Symbol Loader сохраняет эти параметры настройки для каждого файла
и использует их, когда Вы запускаете ее, чтобы загружать или транслировать файb
лы из командной строки DOS. Подробности настройки смотрите в разделе "Изме
нение параметров настройки модуля" на странице 40.
Для запуска LOADER32.EXE войдите в каталог, который содержит LOADER32.EXE,
или укажите каталог SoftICE в путях поиска файлов.
Синтаксис команды
LOADER32.EXE имеет следующий синтаксис:
LOADER32 [[   ( )] -]
Имяфайла задает файл, который Вы хотите транслировать или загрузить. Неb
обязательные параметры описаны в следующей таблице.
Параметр

Описание

/EXPORTS
/LOAD

Загружает экспортируемую информацию
Транслирует модуль в .NMSbфайл, если такой файл еще не
создан, и загружает его в SoftICE. Если Вы предварительно
установили для данного файла параметры трансляции и отb
ладки, то LOADER32.EXE при работе будет использовать их, в
противном случае используются установки по умолчанию для
данного типа модуля.
Сохраняет протокол работы SoftICE в .LOGbфайле.
Указывает LOADER32.EXE не выводить сообщение при неb
возможности найти файл с исходными кодами.
Сохраняет Ваш исходный код вместе с отладочной информаb
цией в .NMSbфайле.
Транслирует модуль в .NMSbфайл, используя настройки поb
следнего сеанса трансляции, или, если таковых нет, стандартb
ные настройки для данного типа модулей.

/LOGFILE
/NOPROMT
/PACKAGE
/TRANSLATE

При формировании команды имейте в виду следующее:
 Параметры не являются обязательными. Если Вы запускаете утилиту без паb
раметров, LOADER32.EXE загружает графический интерфейс Symbol Loader и
открывает указанный файл.
 Укажите одновременно параметры /TRANSLATE и /LOAD, чтобы LOADER32.EXE
оттранслировал модуль перед его загрузкой.
 Не используйте параметры /EXPORTS или /LOGFILE совместно с другими
параметрами.
Замечание: Если Вы задаете какойbлибо параметр, LOADER32.EXE не загружаb
ет графический интерфейс, если только не сталкивается с ошибкой.
Если это произойдет, то LOADER32.EXE выведет ее в своем графиb
ческом окне.

Использование утилиты загрузчика символов командной строки

47

Использование утилиты загрузчика символов командной строки
NMSYM — это утилита, которая позволяет Вам создать пакет для трансляции и заb
грузки отладочной информации для использования с SoftICE или другими программаb
ми, которые используют таблицы символов формата NM32™. NMSYM предоставляет
ряд возможностей, аналогичных свойствам Symbol Loader (LOADER32.EXE) и выполb
няет следующие функции:
 Трансляция и загрузка отладочной информации для каждого модуля в отдельb
ности.
 Загрузка и выгрузка таблиц символов и экспортируемых модулем данных.
 Сохранение содержимого протокола работы SoftICE в файле.
 Выдача информации о версии продукта и справку.
В следующей таблице перечислены параметры каждой из этих функций:
Функция

Параметр NMSYM

Трансляция и загрузка символьной информации
для каждого модуля в отдельности.

/TRANSLATE или /TRANS
/LOAD
/SOURCE
/ARGS
/OUTPUT или /OUT
/PROMPT

Загрузка и выгрузка групп таблиц символов и
экспортов модуля.

/SYMLOAD или /SYM
/EXPORTS или /EXP
/UNLOAD

Сохранение содержимого буфера протокола раb
боты SoftICE в файле.

/LOGFILE или /LOG

Выдача информации о версии продукта и справки.

/VERSION или /VER
/HELP или /H

Синтаксис утилиты NMSYM
NMSYM.EXE имеет следующий синтаксис:
NMSYM [   ( )]
 параметры перечисляются друг за другом через косую черту (/).
 имямодуля является именем файла, который Вы хотите транслировать или заb
грузить.
Следующий пример показывает правильный вариант задания командной строки:
NMSYM /TRANSLATE C:\myproj\myproject.EXE
Использование модификаторов параметров и списка файлов
Многие параметры имеют собственные дополнительные модификаторы и возb
можность задания списка файлов, что позволяет конкретизировать режим работы
параметра, а также выполнять операции над группами файлов.
Модификаторы параметров имеют следующий синтаксис:
/Z[\[: []
Параметр заканчивается двоеточием (:), после которого через запятую идет
список модификаторов.

48

4. Загрузка кода в SoftICE

Следующий пример демонстрирует использование параметра /TRANSLATE с
модификаторами SOURCE и PACKAGE для трансляции исходного кода и символов,
и упаковки исходных текстов в .NMSbфайл:
/TRANSLATE:SOURCE, PACKAGE
Списки файлов задаются следующим образом:
/Z[\[:[; ]

В следующем примере параметр /SOURCE используется с тремя дополнительb
ными путями поиска. NMSYM использует их для обнаружения исходных файлов в
процессе трансляции и загрузки:
/SOURCE:c:\myproj\i386; c:\myproj\include; c:\msdev\include;

Использование NMSYM для трансляции отладочной информации
Основное назначение утилиты NMSYM состоит в извлечении из модуля сгенеb
рированной транслятором отладочной информации и перевод ее в формат NM32, а
затем сохранение этой информации в .NMSbфайле. С этой целью используются
следующие параметры командной строки NMSYM:
1 Параметр /TRANSLATION — для задания типа отладочной информации, коb
торую Вы хотите получить.
2 Параметр /SOURCE определяет пути, по которым NMSYM будет искать исb
ходные файлы.
3 Если Вы хотите самостоятельно определить имя .NMSbфайла, то используйте
параметр /OUTPUT.
4 Задайте имя модуля, который Вы собираетесь транслировать.
NMSYM /TRANSLATE C:\myproj\myproject.EXE
Следующие разделы описывают параметры, которые используются для управb
ления трансляцией символьной информации каждого конкретного модуля.
/TRANSLATE:
Параметр /TRANSLATE позволяет определить тип отладочной информации, коb
торую Вы хотите транслировать в .NMSbфайл, а также нужно ли заносить в него исb
ходный код. Кроме того, имеется возможность выполнить повторную трансляцию,
несмотря на то, что файл с отладочной информацией уже создан и еще не устарел.
Параметр /TRANSLATE имеет ряд дополнительных модификаторов, конкретиb
зирующих режимы работы утилиты.
Модификаторы режимов трансляции отладочной информации
Следующая таблица содержит список необязательных модификаторов, которые
определяют, какая отладочная информация будет транслироваться. Может быть
задан только один модификатор. По умолчанию утилита NMSYM использует моb
дификатор SOURCE.

Использование утилиты загрузчика символов командной строки

49

Модификатор

Описание

PUBLICS

Включаются только общедоступные (public) (глобальные)
символы. Статические функции и переменные исключаются.
В результате использования этого режима создается аналог
.MAPbфайла. Таблицы символов имеют наименьший размер.

TYPEINFO

Включена только информация о типе. Символьная инфорb
мация не включается. Используйте эту опцию, когда Вы хоb
тите внести дополнительную информацию от типах данных
без исходного кода или информации отладки.

SYMBOLS

Включает и символьную информацию, и информацию о тиb
пах. Исходный код и номера строк не добавляются. Размер
таблиц символов относительно невелик.

SOURCE

Это режим трансляции по умолчанию. Включается вся отb
ладочная информация и исходный код.

Замечание: Включение информации об исходном коде не означает непосредстb
венного внесения исходных файлов. Заносятся только имена самих
файлов с исходными текстами и номера строк.
Модификаторы упаковки исходного кода
Необязательный модификатор упаковки исходного кода определяет, будет ли
NMSYM присоединять исходный код к .NMSbфайлу или нет. По умолчанию NMSYM
делает следующее:
 Для модулей драйвера устройства исходный код добавляется в .NMSbфайл,
так как он загружается прежде, чем операционная система будет полностью
инициализирована.
 Для прикладных программ, которые исполняются после загрузки операционb
ной системы, исходные тексты приложения в .NMSbфайл не включаются.
Имеются следующие модификаторы режима включения исходных кодов в
.NMSbфайл:
Модификатор

Описание

PACKAGE

Включает исходные файлы с .NMS файлом.

NOPACKAGE

Не включает исходные файлы с .NMS файлом.

Замечание: Если Вы пакуете исходный код с .NMS файлом, то он будет достуb
пен каждому, кто обращается к таблице символов.
Модификатор ALWAYS
По умолчанию, NMSYM не транслирует символьную информацию, если .NMSbфайл
уже создан, а приложение после этого не подвергалось изменениям. Модификатор
ALWAYS позволяет заставить NMSYM провести трансляцию в любом случае.
Примеры использования параметра /TRANSLATE
Следующий пример задает имя модуля без параметра /TRANSLATON, что приb
водит к использованию при трансляции режимы в зависимости от типа модуля.

50

4. Загрузка кода в SoftICE

NMSYM myproj.exe
Замечание: Для приложений Win32 или библиотек DLL по умолчанию испольb
зуется строка "/TRANSLATE:SOURCE, NOPACKAGE", а для модуb
лей драйверов — "/TRANSLATE:SOURCE, PACKAGE".
Следующий пример показывает трансляцию отладочной информации для VxD.
Используются модификатор SYMBOLS, чтобы исключить информацию, связанную
с исходным кодом и модификатор /NOPACKAGE для запрещения включения исb
ходного кода в .NMSbфайл.
NMSYM /TRANSLATE:SYMBOLS, NOPACKAGE c:\myvxd.vxd
Следующий пример использует задает трансляцию в зависимости от типа модуb
ля, а модификатор /ALWAYS заставляет утилиту выполнить ее в любом случае.
NMSYM /TRANSLATE:ALWAYS myproj.exe
/SOURCE:
Параметр /SOURCE позволяет определить пути, в пределах которых NMSYM
должен искать исходный файл. Во время трансляции (только с модификатором
PACKAGE) или загрузки модуля (/LOAD или /SYMLOAD) утилита NMSYM будет
пытаться обнаружить все исходные файлы, заданные в таблице .NMSbфайла. По
умолчанию поиск будет проводиться в этих директориях.
Модификатор "списокпутейпоиска" — это один или несколько отделенных
друг от друга точкой с запятой (;) путей. Параметр /SOURCE может быть задан в
одной командной строке несколько раз. Порядок инструкций /SOURCE и путей
внутри каждого списка определяет последовательность поиска.
Примеры использования параметра /SOURCE
Следующий пример задает два пути поиска исходных файлов.
NMSYM /TRANSLATE:PACKAGE
/SOURCE:c:\myproj\i386; c:\myproj\include; myproj.exe
Следующий пример задает два набора исходных путей.
NMSYM /TRANS:PACKAGE
/SOURCE:c:\myproj\i386; c:\myproj\include;
/SOURCE:c:\msdev\include; myproj.exe
Следующий пример задает основной путь к исходным файлам проекта и исb
пользует DOSbоператор '%' для извлечения пути из стандартной переменной окруb
жения INCLUDE=. Список путей расширяется, чтобы включить c:\myproj\i386 и
пути, перечисленный в переменной окружения INCLUDE=.
NMSYM /TRANS:PACKAGE /SOURCE:c:\myproj\i386;
%INCLUDE% myproj.exe
Замечание: В случае, если исходный код не найден, параметр /PROMPT опреb
деляет, следует ли пропустить этот файл, или просить у Вас помощи
для его поиска.
/OUTPUT:
NMSYM составляет имя .NMSbфайла из имени основного модуля, добавляя к неb
му стандартное для таблиц NM32 расширение .NMS. Образованный файл сохраняb
ется в той же директории, где находится транслируемый модуль. Если Вам необхоb
димо изменить получаемое по умолчанию имя или расположение .NMSbфайла, то
сделать это можно с помощью параметра /OUTPUT. Если Вы задаете имя, но не опb
ределяете путь для записи файла, то он будет сохранен вместе основным модулем.

Использование утилиты загрузчика символов командной строки

51

Примеры использования параметра /OUTPUT
В следующем примере путь к .NMS файлу изменен на общий каталог для
.NMSbфайлов.
NMSYM /output:c:\ntice\symbols\myproj.nms
c:\myproj\myproject.exe
/PROMPT
NMSYM – это командная утилита, специально разработанная для автоматизации
трансляции и загрузки отладочной информации. Скорее всего, Вам не захочется поb
лучать сообщения об отсутствии исходных файлов, однако в некоторых случаях это
могло бы пригодиться. Параметр /PROMPT позволяет NMSYM определить, следует
ли ее просить у Вас помощи для обнаружения файлов исходных кодов при использоb
вании параметров /TRANSLATE:PACKAGE, /LOAD или /SYMLOAD.

Использование NMSYM для загрузки модуля
и отладочной информации
Подобно режиму трансляции функционирование параметра /LOAD в утилите
NMSYM спроектировано таким образом, чтобы иметь возможность работать с каb
ждым конкретным модулем отдельно. Любой модуль будет оттранслирован и заb
гружен. Если Вы не собираетесь транслировать или загружать и исполнять модуль,
то следует использовать параметр /SYMLOAD.
Пример использования NMSYM для трансляции, загрузки и исполнения модуля:
NMSYM /TRANS:PACKAGE /LOAD:EXECUTE myproj.exe
Следующий пример показывает альтернативные возможности загрузки группы
транслированных отладочных файлов с использованием параметра /SYMLOAD:
NMSYM /SYMLOAD:ntdll.dll; ntoskrnl.nms; myproj.exe
В этом примере будут загружены три символьные таблицы, однако трансляции
не произойдет, даже если соответствующие .NMSbфайлы устарели. Также не проb
изойдет и запуска файла MYPROJ.EXE для отладки.
/LOAD:
Параметр /LOAD позволяет загружать файлы с отладочной информацией
.NM32 в SoftICE, и, по желанию, запускать модуль для отладки.
Параметр имеет следующие модификаторы.
Модификаторы типов загрузки
Данные модификаторы используются для определения того, каким образом буb
дут загружены модуль и его отладочная информация. Значение модификатора по
умолчанию зависит от типа модуля: для исполняемых программ — это EXECUTE,
для неисполняемых — SYMBOLS.
Модификатор

Описание

SYMBOLS

Будет загружена только отладочная информация, с помоb
щью которой после загрузки модуля Вы можете устанавлиb
вать в нем контрольные точки.

EXECUTE

Загружается и отладочная информация, и исполняемая проb
грамма с возможностью ее дальнейшей отладки.

52

4. Загрузка кода в SoftICE
Модификаторы остановки после загрузки

Для управления режимом установки прерывания на входной точке модулей исb
пользуется один из следующих модификаторов:
Модификатор

Описание

BREAK

Устанавливает команду прерывания на входной точке модуb
ля (WinMain, DllMain, илиDriverEntry).

NOBREAK

Не устанавливает контрольную точку на входе модуля.

Наличие этого модификатора обусловлено зависимостью значения этого параb
метра по умолчанию от типа модуля: для прикладных программ оно равно "BREAK",
а для всех остальных модулей — "NOBREAK".
Модификатор NOSOURCE
NOSOURCE запрещает загрузку файлов исходного кода, даже если в .NMSbфайл
включен список файлов исходных текстов или информация о номерах строк.
Примеры использования параметра /LOAD
В следующем примере NMSYM загрузит и (по умолчанию) запустит модуль
MYPROJ.EXE; если таблица символов устарела, то будет выполнена трансляция для
данного типа модуля:
NMSYM /LOAD myproj.exe
В следующем примере программа должна быть запущена, но контрольной точки
на входе программы не устанавливается. В случае необходимости будет выполнен
определенный для данного типа модуля вид трансляции.
NMSYM /LOAD:NOBREAK myproj.exe
В следующем примере будет загружена только символьная информация и явно
определен тип трансляция — PUBLIC:
NMSYM /TRANS:PUBLIC /LOAD:SYMBOLS myproj.dll
/ARGS:
Параметр /ARGS служит для передачи аргументов в исполняемый модуль. Эта опb
ция полезна только при совместном использовании с параметром /LOAD:EXECUTE.
— это строка, задающая передаваемые программе
аргументы. Если она содержит пробел, то вся строка должна быть заключена в
двойные кавычки (").
Примеры использования параметра /ARGS
В следующем примере модуль MYPROJ.EXE будет загружен для отладки, и в неb
го будет передан аргумент TEST.RTF.
NMSYM /LOAD:EXECUTE /args:test.rtf myproj.exe
В следующем примере командная строка немного усложнена, так что приходитb
ся заключать ее в двойные кавычки ("):
NMSYM /LOAD:EXECUTE "/ARGS:/PRINT /NOLOGO test.rtf" myproj.exe
Использование двойных кавычек предотвращает ошибку NMSYM при разборе
командной строки изbза при наличии пробела в параметрах программы:
/PRINT_/NOLOGO_test.rtf (пробел отмечен знаком подчеркивания).

Использование утилиты загрузчика символов командной строки

53

Использование NMSYM для загрузки
таблиц символов или экспортов
Кроме трансляции и загрузки утилита NMSYM также предоставляет возможb
ность пакетной загрузки и выгрузки таблиц символов и экспортируемой информаb
ции. Это чрезвычайно полезно при загрузке "окружения" или связанного набора
файлов с отладочной информацией. Например, если Вы запускаете SoftICE вручb
ную, то можете применить NMSYM для получения возможностей, аналогичных исb
пользовании параметров настройки для загрузки символической и экспортируемой
информации.
Например, Вы можете создать пакетный файл, подобный приведенному ниже,
для управления загрузкой отладочной информации. Пакет содержит один дополb
нительный параметр, который определяет принадлежность загружаемых файлов —
для отладки драйвера или прикладной программы (по умолчанию — прикладная
программа). В обоих случаях загружается информация, экспортируемая стандартb
ными модулями Windows.
net start ntice
ECHO OFF
if "%1" == "D" goto dodriver
if "%1" == "d" goto dodriver
REM *** ^ _`[ abc bad Z[dba_ef Z[g[\\ ***
set SYMBOLS=ntdll.dll; shell32.dll; ole32.dll; win32k.sys
goto doload
:dodriver REM *** h _`[ abc bad a[i[i ***
set SYMBOLS=hal.dll; ntoskrnl.exe;
:doload
NMSYM /SYMLOAD:%SYMBOLS% EXPORTS:kernel32.exe;user32.exe;gdi32.exe
Другое преимущество использования NMSYM в том, что для поиска .NMSbфайлов
и модулей не требуется указания полного пути поиска. Если Вы не определяете путь,
а заданный модуль или .NMSbфайл не будет найден в текущем каталоге, то поиск буb
дет продолжен по дополнительным путям поиска.
/SYMLOAD:
Параметр /SYMLOAD используется для загрузки отладочной информации в
SoftICE. Символьные таблицы должны быть предварительно оттранслированы, так
как в этом случае утилита трансляцию не выполняет.
Модификатор задает необходимые .NMSbфайлы или модули с
возможностью явного указания их местонахождения. Если местонахождение модуb
ля не определено, то NMSYM будет пытаться найти файл в текущем каталоге или по
дополнительным путям поиска. Если Вы определяете абсолютный или относительb
ный каталог модуля, затем никакого дополнительного поиска производится не будет.
Примеры использования параметра /SYMLOAD
В приведенном ниже примере параметр /SYMLOAD используется для загрузки
таблицы символов, обычно используемых для отладки OLEbпрограмм. Здесь пути
не задаются, так что при необходимости будет произведен дополнительный поиск.
NMSYM /SYMLOAD:ole32.dll; oleaut32.dll; olecli32.dll

54

4. Загрузка кода в SoftICE
/EXPORTS:

Параметр /EXPORTS используется для загрузки информации, экспортируемой
одним или несколькими модулями, в SoftICE. Экспортируемая информация — это
облегченная версия символьной информации об API модуля (обычно из библиотек
DLL, но и исполняемые .EXEbфайлы также могут экспортировать информацию).
Модификатор задает необходимые модули возможностью
явного указания их местонахождения. Если местонахождение модуля не опредеb
лено, то NMSYM будет пытаться найти файл в текущем каталоге или по дополниb
тельным путям поиска. Если Вы определяете абсолютный или относительный катаb
лог модуля, затем никакого дополнительного поиска производится не будет.
Примеры использования параметра /EXPORTS
Следующий пример демонстрирует применение параметра /EXPORTS для заb
грузки экспортируемой информации из программ, обычно используемых при отb
ладке OLEbпрограмм. Здесь пути не задаются, так что при необходимости будет
произведен дополнительный поиск.
NMSYM /EXPORTS:ole32.dll; oleaut32.dll; olecli32.dll

Использование NMSYM для выгрузки отладочной информации
NMSYM имеет параметр /UNLOAD, с помощью которого Вы можете программb
ным путем удалять отладочную информацию для определенного набора таблиц
символов и(или) экспорта. Это может использоваться для экономии оперативной
памяти, занимаемой уже ненужными таблицами символов.
/UNLOAD:
Модификатор определяет таблицы символов или экспорта.
Имя таблицы получается из имени основного модуля без пути или расширения.
Для обеспечения гибкости и поддержки возможных в будущем изменений имен
таблиц, следует задавать пути или расширения, необходимых для однозначного опb
ределения таблицы.
Примеры использования параметра /UNLOAD
Следующий пример выполняет действие, обратное описанному в разделах
/SYMLOAD и /EXPORTS:
NMSYM /UNLOAD:ole32.dll; oleaut32.dll; olecli32.dll
SoftICE найдет таблицу, которая соответствует заданному имени модуля и удалит
ее, если это окажется возможным, освободив тем самым занимаемую ею память.
Замечание: По умолчанию SoftICE пытается выгрузить таблицу символов. Если
заданная таблица символов не существует, то SoftICE, пытается выb
грузить экспортную таблицу с тем же именем.

Использование NMSYM для сохранения протокола работы в файл
NMSYM предоставляет возможность сохранить буфер протокола SoftICE в файb
ле при использовании параметр /LOGFILE. Эта операция эквивалентна возможноb
сти утилиты Symbol Loader "SAVE SOFTICE HISTORY AS…". NMSYM поддерживает
возможность присоединения новых данных к существующему файлу с помощью
модификатора APPEND.

Использование утилиты загрузчика символов командной строки

55

/LOGFILE:[,список/модификаторов]
Модификатор "имяфайла" задает путь и имя файла, в котором будет сохранен
буфер протокола. Если путь не задан, то будет использован текущий каталог.
Модификатор параметра /LOGFILE
Модификатор APPEND позволяет Вам добавить текущее содержание буфера
протокола работы SoftICE к уже существующему файлу предыдущих протоколов.
По умолчанию файл переписывается заново.
Примеры использования параметра /LOGFILE
Следующий пример создаст (или перепишет) файл MYPROJ.LOG с текущим соb
держанием буфера протокола SoftICE:
NMSYM /LOGFILE:myproj.log
Следующий пример объединит текущее содержание буфера протокола SoftICE
с файлом MYPROJ.LOG (или создаст файл заново):
NMSYM /LOGFILE:myproj.log,APPEND
Внимание: NMSYM не запрашивает разрешения на перезапись существующеb
го файла, а делает это автоматически.

Получение информации об утилите NMSYM
Для получения информации об утилите NMSYM используются параметры
/VERSION и /HELP.
/VERSION
Параметр /VERSION выдает номера версий NMSYM, SoftICE, также как трансb
лятора символьного обработчика. Для правильной работы SoftICE, LOADER32.EXE
и NMSYM эти версии должны быть совместимы. Каждая из этих программ сверяет
свой номер версии с другими для проверки возможности совместной работы.
/HELP
Параметр /HELP дает краткое описание синтаксиса командной строки, параb
метров и их модификаторов.

Для меня уже давно стало аксиомой,
что мелочи имеют первостепенное значение.
Сэр Артур Конан Дойл

It has long been an axiom of mine that the little things are
infinitely the most important.
Sir Arthur Conan Doyle

5. Интерфейс SoftICE
Введение
В данной главе описана структура экрана SoftICE и его окон, и управление ими.
Если Вы новичок в SoftICE, то внимательно прочтите эту главу, а затем обраb
щайтесь к ней, как к справочнику. Если Вы уже знакомы с отладчиком, то прочиb
тайте разделы, касающиеся окна локальных переменных и окна слежения, а также
разделы, описывающие работу с мышью.

Вызов экрана SoftICE
После загрузки отладчика экран SoftICE автоматически появляется на мониторе
в следующих случаях:
 На этапе загрузки SoftICE. По умолчанию инициализационная строка содерb
жит команду X (Exit — Выход) с последующей точкой с запятой, поэтому на
данном этапе экран исчезает сразу после возникновения. Подробности смотb
рите в разделе "Изменение начальных установок SoftICE" на странице 119.
 При нажатии клавиатурной комбинации вызова "CtrlbD". С ее же помощью
экран SoftICE может быть снова закрыт.
 При срабатывании контрольной точки.
 При перехвате системной ошибки.
 При крахе Windows NT и появлении "Синего экрана смерти".
При активизации SoftICE вся остальная активность Вашего компьютера преb
кращается, все прерывания запрещаются, а SoftICE обеспечивает доступ к клавиаb
туре и вывод на монитор собственными средствами, непосредственно обращаясь к
аппаратурному обеспечению компьютера.
Совет:
Комбинация вызова отладчика (CtrlbD) может быть изменена с поb
мощью команды ALTKEY.

Отключение SoftICE на этапе загрузки
Если Вы установили SoftICE под Windows NT в качестве загрузочного или системb
ного драйвера, то Вы имеете возможность отключить его в момент старта системы,
нажав клавишу ESC, когда в нижней части экрана появится следующее сообщение:
Press Esc to cancel loading SoftICE
(jk\d Esc abc Z[[l_dc mg[nmd SoftICE)

Содержимое экрана SoftICE

57

Если Вы установили SoftICE под Windows NT в качестве автоматического драйb
вера, то Вы можете отключить его, только изменив режим загрузки и перезагрузив
компьютер. Если загрузка SoftICE вызовет сбой системы, выберите в загрузочном
меню Windows NT пункт:
Last known good configuration
(oba_cc [`Z`_c _pdgn[qdc)

Содержимое экрана SoftICE
Экран SoftICE — это Ваш основной инструмент при отладке приложения. Он
подразделяется на 7 окон и строку подсказки, позволяющие контролировать разb
личные стороны процесса отладки. В приведенной ниже таблице все окна переb
числены в порядке убывания их значимости.
Окно SoftICE

Описание

Окно команд

Ввод команд и выдача сообщений

Окно кода

Вывод машинных инструкций и/или исходных кодов

Окно локальных
переменных

Вывод содержимого текущего кадра стека

Окно слежения

Вывод значений переменных, указанных командой WATCH

Окно регистров

Вывод и изменение содержимого регистров и флагов

Окно данных

Отображение и изменение содержимого участка памяти

Окно стека
сопроцессора

Вывод содержимого стека (регистров) сопроцессора
или MMXbрегистров

Строка подсказки

Краткая информация о командах SoftICE

По умолчанию SoftICE выводит на экран строку подсказки и окна команд, кода
и локальных переменных. В зависимости от Ваших задач Вы можете открывать и
закрывать и другие необходимые Вам окна. На следующем рисунке показан тиb
пичный экран отладчика.
Окно регистров
Окно локальных
переменных
Окно данных
Окно кода

Кнопки
прокрутки окна

Окно команд
Имя
текущего процесса
Строка подсказки

58

5. Интерфейс SoftICE

Изменение размера экрана SoftICE
По умолчанию SoftICE выводит информацию на экран высотой в 25 строк, исb
пользуя их для размещения всех своих окно. Если Вы используете цветной мониb
тор (и соответствующую видеокарту), с помощью команды LINES Вы можете измеb
нить размер экрана до 43, 50 или 60 строк . Вывод на монохромные мониторы всеb
гда ограничен 25 строками.
Пример:
LINES 60

Управление окнами SoftICE
С окнами отладчика можно выполнять следующие действия:
 открывать и закрывать все окна, кроме окна команд;
 изменять размер окон кода, данных и локальных переменных;
 листать содержимое окон кода, команд, данных, локальных переменных и
слежения.
Управление окнами может быть осуществлено с клавиатуры или с помощью
мыши.
Открытие и закрытие окон
Чтобы открыть необходимое окно, используются команды, перечисленные в
следующей таблице. Если окно уже открыто, то та же самая команда закрывает
его. Чтобы закрыть окно с помощью мыши, протащите линию, ограничивающую
его снизу, до верхней границы.
Команда

Окно

WC

Окно кода

WD

Окно данных

WF

Окно стека сопроцессора

WL

Окно локальных переменных

WR

Окно регистров

WW

Окно слежения

Изменение размеров окон
Для изменения размера окна переместите мышью нижнюю границу окна так,
как Вам это необходимо. С клавиатуры это можно сделать с помощью тех же коb
манд открытия/закрытия окна, добавив после них десятичное число, означающее
высоту окна в строках.
Пример:
WD 7
Обратите внимание, что окно команд автоматически увеличивается или уменьb
шается при изменении размеров других окно. (Других способов изменить размер
окна команд нет.)



С появлением "Универсального видеодрайвера", начиная с версии 3.2, появилась
возможность менять размер экрана в пределах от 25 до 128 строк в высоту и от 80
до 160 символов в ширину.

Содержимое экрана SoftICE

59

Перемещение курсора из окна в окно
По умолчанию курсор размещается в окне команд. Для его перемещения щелкb
ните мышью в нужном Вам окне. Если курсор находится в окнах команд или кода,
то перечисленными ниже комбинациями клавиш его можно переместить в нужное
окно (и вернуть назад).
Окно

Комбинация клавиш

Окно кода

AltbC

Окно данных

AltbD

Окно стека сопроцессора

Переместить курсор в это окно невозможно

Окно локальных переменных

AltbL

Окно регистров

AltbR

Окно слежения

AltbW

Пролистывание содержимого окна
Вы можете листать содержимое окон кода, команд, данных, локальных переb
менных и слежения. Для окон стека сопроцессора и регистров это невозможно,
так как их размер всегда равен 3 и 4 строкам, соответственно.
SoftICE позволяет листать содержимое как с клавиатуры, так и с помощью мыb
ши. Все эти способы описаны в следующей таблице.
Замечание: Комбинации клавиш для некоторых окон могут меняться. Некотоb
рые окна, например, не позволяют переходить к первой и последb
ней строкам. Полное описание способов пролистывания информаb
ции в окнах дается в соответствующих разделах.
Размер и направление
листания окна

Комбинация Действие
клавиш
мышью

На одну страницу назад

PageUp

Щелкните по внутренней
стрелке вверх

На одну страницу вперед

PageDown

Щелкните по внутренней
стрелке вниз

На одну строку назад

Стрелка
вверх

Щелкните по наружной
стрелке вверх

На одну строку вперед

Стрелка
вниз

Щелкните по наружной
стрелке вниз

Перейти к первой строке кода

Home

Невозможно

Перейти к последней строке кода

End

Невозможно

На один символ влево

Стрелка
влево

Щелкните по стрелке влево

На один символ вправо

Стрелка
вправо

Щелкните по стрелке вправо

60

5. Интерфейс SoftICE

Копирование и вставка данных в окнах
Если у Вас в системе есть мышь, то Вы можете копировать и переносить данные
между окнами, что очень удобно, например, для копирования адресов и данных в
выражения. Эти действия выполняются следующим образом:
1 Выделите данные, которые Вы хотите копировать.
2 Нажмите правую кнопку мыши, чтобы появилось контекстное меню.
3 Выберите левой кнопкой мыши необходимую команду.
Команда

Описание

Copy

Копирует выделенные данные в буфер

Copy and Paste

Копирует выделенные данные и вставляет их в место, укаb
зываемое текущим положением курсора

Paste

Вставляет данные из буфера в место, указываемое текуb
щим положением курсора

Ввод команд с помощью мыши
С помощью мыши можно ввести команды D, U и WHAT. (Подробное описание
команд можно найти в "Справочнике по командам SoftICE".)
Для ввода этих команд с помощью мыши выполните следующие действия:
1 Выделите данные, к которым Вы хотите применить команду. Например, выb
делите выражение для выяснения его типа.
2 Нажмите правую кнопку мыши, чтобы появилось контекстное меню.
3 Выберите левой кнопкой мыши необходимую Вам команду. Сами команды
кратко описаны в приведенной ниже таблице.
Команда
в меню

Команда
SoftICE

Описание

Display

D

Показать содержимое памяти по указанному адресу

UnbAssemble

U

Показать исходный либо дизассемблированный код
по указанному адресу

What

WHAT

Определить, относится ли имя или выражение к изb
вестному типу

Previous

нет

Повторить последнюю команду

Получение помощи
SoftICE предоставляет 2 способа получения помощи во время отладки приложеb
ний: с использованием строки подсказки и по команде H.
Использование строки подсказки
В нижней части экрана SoftICE всегда имеется строка подсказки. Содержимое
этой строки обновляется по мере того, как Вы вводите команды. В строке показыb
вается информация следующих видов:
 До тех пор, пока вводимая команда не завершена, в строке перечисляются все
возможные команды, которые начинаются с уже введенных Вами символов.

Окно команд

61



Если введенная Вами строка совпадает с командой SoftICE, в строке подсказки
появляется краткое ее описание.
 Если после команды Вы введете пробел, то Вам будет показан синтаксис данb
ной команды.
 При редактировании содержимого окна регистров или данных в строке подb
сказки указываются допустимые команды для этого окна.
Использование команда H
Команда H выдает общие сведения по всем командам SoftICE или более детальb
ную информацию по какойbлибо конкретно указанной Вами команде. Для получеb
ния краткого описания всех команд необходимо выполнить команду H без параb
метров.
Для получения более детального описания какойbлибо конкретной команды неb
обходимо указать эту команду после H в качестве параметра. SoftICE покажет опиb
сание команды, синтаксис и пример ее использования.
Приведенный ниже пример показывает получение подсказки о команде BPINT:
:H BPINT
Breakpoint on interrupt
BPINT interrupt-number {IF expression] [DO bp-action]
ex: BPINT 50
(s_i _[bt_ ud _ Z[[ei_d
BPINT _\[-Z[[ei_dc [IF ie[k_d] [DO aid]
Z[d\[: BPINT 50)

Окно команд
Окно команд позволяет Вам вводить необходимые для управления работой отb
ладчика команды и выводит информацию о текущем процессе отладки. Содержиb
мое окна сохраняется в буфере протокола SoftICE.
Окно команд всегда открыто и имеет по крайней мере 2 строки в высоту. Хотя
Вы и не можете непосредственно изменить размер окна, тем не менее его высота
автоматически меняется при изменении размеров других окон.

Листание содержимого окна команд
Для листания содержимого окна команд используются следующие клавиатурb
ные комбинации.
Функция

Комбинация
клавиш

Перейти к предыдущей странице
содержимого буфера протокола

PageUp

Перейти к следующей странице
содержимого буфера протокола

PageDown

Перейти к предыдущей строке содержимого буфера протокола Стрелка вверх
Перейти к предыдущей строке содержимого буфера протокола Стрелка вниз

62

5. Интерфейс SoftICE

Ввод команд
Команды SoftICE можно вводить, когда курсор находится в окне команд или кода.
Для ввода команды наберите ее на клавиатуре и нажмите ENTER.
Совет:
По мере ввода команды в строке подсказки перечисляются все доb
пустимые команды, которые начинаются с уже введенных симвоb
лов. Если в этой строке показывается только одна команда, то наb
жатием пробела можно автоматически завершить ввод. SoftICE саb
мостоятельно дополнит недостающие символы.
После выполнения команды выдаваемая ею информация появляется непосредb
ственно после нее в окне команд. Если эта информация выводится в последней
строке окна, то окно автоматически пролистывается. Если выдаваемая информаb
ция не умещается в окне, то появляется следующее сообщение:
Any Key To Continue, ESC To Cancel
(jk\d bv`nv bidwn abc Z[abk_dc
dbd ESC abc Z[[l_dc ieia)
Для отключения этой подсказки можно ввести команду: SET PAUSE OFF
Синтаксис команд
Команды SoftICE имеют следующие общие правила построения:
 Все команды представляют собой нечувствительные к регистру строки длиb
ной от 1 до 6 символов.
 Все параметры представлены ASCIIbстроками или выражениями.
 Адрес в SoftICE может быть представлен парой селектор:смещение или сегb
мент:смещение, либо одним смещением.
 В выражениях могут использоваться:
 символы группировки — круглые скобки '(', ')'
 числа в шестнадцатеричном или десятичном формате
 адреса
 номера строк
 строковые литералы
 идентификаторы
 операторы
 встроенные функции
 регистры
Пример:
Выражением является строка (1+2)*3
Любой команде, которая принимает в качестве параметра число или адрес, моb
жет быть передано выражение любой сложности. Для вычисления выражения моb
жет быть использована команда '?' (вопросительный знак). Кроме того, контрольb
ные точки могут содержать условия, основанные на результате вычисления выраb
жения, а именно, контрольная точка срабатывает только в том случае, когда
результат имеет не нулевой значение (TRUE, Истина).
Использование функциональных клавиш
SoftICE присваивает некоторым функциональным клавишам (и их комбинациb
ям) значения наиболее часто используемых команд. В следующей таблице привеb
ден список таких назначений.

Окно команд

63

Клавиша Команда

Функция

F1

H

Выдать подсказку

F2

WR

Открыть/закрыть окно регистров

F3

SRC

Переключиться между режимами исходных кодов,
смешанных кодов или только ассемблерных команд

F4

RS

Показать экран отлаживаемого приложения

F5

X

Перейти

F6

EC

Перевести курсор в окно кодов или из него

F7

HERE

Выполнить приложение до команды, на которую
указывает курсор

F8

T

Шаг трассировки (с заходом в функции)

F9

BPX

Установить контрольную точку в текущей строке

F10

P

Выполнить один шаг программы (без захода в
функции)

F11

G @SS:EIP

Перейти в вызывающую функцию программу

F12

P RET

Выполнить функцию до выхода в вызывающую
программу

ShiftbF3

FORMAT

Изменить формат вывода информации в окне данb
ных

AltbF1

WR

Открыть/закрыть окно регистров

AltbF2

WD

Открыть/закрыть окно данных

AltbF3

WC

Открыть/закрыть окно кодов

AltbF4

WW

Открыть/закрыть окно слежения

AltbF5

CLS

Очистить содержимое окна команд

AltbF11

dd dataaddr->0 Показать данные по адресу, размещенному в перb

вом двойном слове окна данных
AltbF12

dd dataaddr->4 Показать данные по адресу, размещенному во втоb

ром двойном слове окна данных
Вы можете самостоятельно присвоить функциональным клавишам значения
необходимых Вам команд. Подробности смотрите в разделе "Изменение назначе
ний клавиатуре" на странице 124.
Редактирование командных строк
Для редактирования командных строк используются описанные ниже клавиши:
Функция

Комбинация
клавиш

Перевести курсор в начало командной строки
Перевести курсор в конец командной строки
Переключение режимов вставки/замены. В режиме вставки
вводимые символы вставляются на место курсора (мерцающий
блок), сдвигая вправо остаток строки. В режиме замены ввоb
димые символы заменяют символы, указываемые курсором

Home
End
Insert

Продолжение на следующей странице

64

5. Интерфейс SoftICE
Функция

Комбинация
клавиш

Удалить указываемый курсором символ со сдвигом остатка
строки влево

Delete

Удалить предыдущий символ со сдвигом остатка строки влево

Bksp

Отменить использование вводимой командной строки

Esc

Перемещение курсора влево/вправо в пределах строки

Вызов предыдущих команд
SoftICE помнит последние 32 введенные Вами команды. Любую из них можно
вызвать для повторного исполнения или для редактирования с последующим исb
полнением, как из окна команд, так и из окна кодов.
В следующей таблице приведены способы вызова предыдущих команд из окна
команд.
Функция
(курсор в окне команд)

Комбинация
клавиш

Получить предыдущую команду из буфера протокола

Стрелка верх

Получить следующую команду из буфера протокола

Стрелка вниз

Замечание: Допускается использовать префиксы. Например, если Вы введете
символ 'A', то нажатие стрелки вверх (или вниз) будет перемещать
Вас только по командам, начинающихся с 'A'.
В следующей таблице приведены способы вызова предыдущих команд из окна
кодов.
Функция
(курсор в окне кодов)

Комбинация
клавиш

Получить предыдущую команду из буфера протокола

ShiftbСтрелка верх

Получить следующую команду из буфера протокола

ShiftbСтрелка вниз

Использование макрокоманд времени исполнения
Макрокоманды представляют собой разработанные пользователем команды,
которые могут использоваться точно также, как и встроенные команды SoftICE.
Определение, или тело макрокоманды, содержит последовательность вызовов друb
гих команд, в том числе и иные макрокоманды и аргументы командной строки.
Существует 2 способа создания макрокоманд. Можно создать макрокоманды
времени исполнения, которые существуют до момента перезагрузки SoftICE, и поb
стоянные макрокоманды, которые автоматически загружаются при старте отладb
чика. Создание и использование постоянных макрокоманд подробно описаны в
разделе "Работа с постоянными макрокомандами" на странице 125.
В приведенной ниже таблице описаны способы работы с макрокомандами вреb
мени исполнения.

Окно команд

65

Действие

Команда

Создание
или изменение макрокоманды

MACRO имямакроса =
"команда1; команда2; …"

Удаление макрокоманды

MACRO имямакроса *

Удаление всех макрокоманд

MACRO *

Редактирование макрокоманды

MACRO имямакроса

Вывод списка всех макрокоманд

MACRO

Совет:

Можно изменить постоянную макрокоманду только на время теb
кущего сеанса отладки. При новом запуске SoftICE эта макрокоb
манда восстановит свое прежнее содержание.
Тело макрокоманды состоит из последовательности команд SoftICE или других
макросов, разделенных точками с запятой. При этом последняя команда не обязаb
тельно должна заканчиваться точкой с запятой. На аргументы командной строки
макрокоманды можно ссылать в любом месте тела макроса с помощью
%, где номерпараметра — это цифры от 1 до 8.
Пример:
Макрокоманда MACRO asm = "a %1" определяет псевдоним для
команды A (команда ассемблера). Идентификатор "%1" заменяется
на первый аргумент после имени макроса "asm" или просто удаляb
ется, если аргумента нет.
Если требуется вставить в тело макрокоманды символ двойных кавычек (") или
знак процента (%), то перед ними необходимо добавить символ обратной косой
черты (\). Чтобы добавить собственно знак обратной косой черты, используется
последовательность из двух таких символов (\\).
Замечание: Рекурсивный вызов макрокоманд возможен, однако, польза от этоb
го приема сомнительна, так как программного способа завершить
его работу не существует. Если макрокоманда вызывает саму себя
в последней команде тела макроса (так называемый "хвостовой выb
зов"), то такая команда выполняется до тех пор, пока пользователь
не нажмет 'ESC', чтобы прервать ее работу. Если рекурсивный выb
зов является не последней командой макроса, то такой вызов выb
полняется 32 раза (ограничение вложенности).
В следующей таблице приведены примеры допустимых макрокоманд.
Макрокоманда времени исполнения

Пример вызова

MACRO Qexp = "addr explorer; Query %1"

Qexp
Qexp 140000
1shot eip
1shot @esp
ddt
ddp
thr
thr -x
dmyfile mytable
myfile myfile.c

MACRO lshot = "bpx %1 do \”bc bpindex\”"
MACRO ddt = "dd thread"
MACRO ddp = "dd process"
MACRO thr = "thread %1 tid"
MACRO dmyfile =
"macro myfile = \”TABLE %1;file \%1\”"

66

5. Интерфейс SoftICE

Сохранение содержимого буфера протокола окна команд в файл
Буфер протокола окна команд содержит всю информацию, которая выводилась
в окне команд. Его сохранение в файле может оказаться полезным по следующим
причинам:
 выводились большие массивы данных или содержимого регистров;
 выводились листинги дизассемблированных кодов;
 необходимо сохранить протоколы исполнения контрольных точек, создаваеb
мые командой BPLOG;
 сохранение протоколов работы команды BMSG;
 сохранение отладочных сообщений приложения пользователя с помощью выb
зова функции OutputDebugString, а также отладочных сообщений программ
ядра системы через вызовы функции KdPrint.
Подробности о размерах буфера протокола и способ его изменения описаны в
разделе "Размер буфера протокола" на странице 120.
Для сохранения буфера протокола в файл необходимо выполнить следующие
действия:
1 Удостоверьтесь, что необходимая Вам информация находится в окне команд,
то есть была сохранена в буфере протокола работы.
Например, для сохранения содержимого больших массивов памяти отключите окb
но данных, чтобы быть заставить SoftICE выводить информацию в окно команд.
2 Запустите утилиту Symbol Loader.
3 В меню "FILE" выберите пункт "SAVE SOFTICE HISTORY AS..." или нажмите кнопку
"SAVE SOFTICE HISTORY".
4 С помощью диалога сохранения задайте имя файла и каталог.

Связанные с окном команды
Приведенная ниже команда имеет непосредственное отношение к окну команд.
Дополнительные подробности смотрите в "Справочнике по командам SoftICE".
Команда

Функция

SET [переменная]
[ON | OFF] [значение]

Отображает или устанавливает значение
параметров работы

Окно кодов
В окне кодов отображаются исходные тексты программы, дизассемблированb
ный код, или и то, и другое одновременно (смешанный тип вывода). С его помощью
Вы можете устанавливать контрольные точки. (Подробности установки контрольb
ных точек описаны в главе 7 "Использование прерываний".)

Управление окном кодов
Для управления окном используются следующие команды.
Команда

Описание

WC

Открыть/закрыть окно кодов

WC [количествоBстрок]
AltbC

Изменить размер окна кодов
Переместить курсор в окно кодов или из него

Окно кодов

67

Листание содержимого окна кодов
Для листания содержимого окна кодов используются стрелки скроллинга (при
работе с мышью), либо, если курсор находится в окне кодов, следующие комбинаb
ции клавиш.
Функция
(курсор в окне кодов)

Комбинация
клавиш

Перейти к предыдущей странице содержимого окна кодов
Перейти к следующей странице содержимого окна кодов
Прокрутить окно кодов на одну строку вверх
Прокрутить окно кодов на одну строку вниз
Перейти к первой строке файла исходных текстов
Перейти к последней строке файла исходных текстов
Передвинуть содержимое окна кодов на один символ влево
(только в режиме отображения исходных кодов)
Передвинуть содержимое окна кодов на один символ впраb
во (только в режиме отображения исходных кодов)

PageUp
PageDown
Стрелка вверх
Стрелка вниз
CtrlbHome
CtrlbEnd
Ctrlb
Стрелка влево
Ctrlb
Стрелка вправо

Можно листать окно кодов, даже если курсор находится в окне команд. Для
этого используются следующие комбинации клавиш.
Функция
(курсор в окне команд)

Комбинация
клавиш

Перейти к предыдущей странице содержимого окна кодов
Перейти к следующей странице содержимого окна кодов
Прокрутить окно кодов на одну строку вверх

CtrlbPageUp
CtrlbPageDown
Ctrlb
Стрелка вверх
Ctrlb
Стрелка вниз
CtrlbHome
CtrlbEnd
Ctrlb
Стрелка влево
Ctrlb
Стрелка вправо

Прокрутить окно кодов на одну строку вниз
Перейти к первой строке файла исходных текстов
Перейти к последней строке файла исходных текстов
Передвинуть содержимое окна кодов на один символ влево
(только в режиме отображения исходных кодов)
Передвинуть содержимое окна кодов на один символ впраb
во (только в режиме отображения исходных кодов)

Отображение информации
Окно кода может работать в трех различных режимах.
Режим

Описание

Исходных
Если исходный код приложения доступен, то он отображается в
текстов
окне кодов
Смешанный В этом режиме каждая строка исходного текста приложения
сопровождается соответствующими ей машинными командами.
Кодовый
Отображаются только дизассемблированные команды программы

68

5. Интерфейс SoftICE

Переключение между режимами производится с помощью команды SRC (функb
циональная клавиша F3).
Использование смешанного и кодового режима
Каждая дизассемблированная инструкция в кодовом и смешанном режимах соb
держит следующие поля.
Поле

Описание

Адрес

Шестнадцатеричный адрес инструкции. Если для данного адb
реса известен глобальный идентификатор, то он отображаетb
ся перед данной строкой.

Байты кода

Шестнадцатеричные байты, соответствующие данной инстb
рукции. По умолчанию вывод этого поля отключен, так как
эти значения, как правило, не нужны. Для включения их отоb
бражения используется команда SET CODE ON.

Инструкция

Ассемблерная мнемоника данной машинной команды. Если
адресу, на который ссылается данная инструкция, соответстb
вует известный идентификатор, то он выводится в строке
вместо шестнадцатеричного значения адреса. Для того, чтобы
отключить вывод идентификаторов и всегда отображать чиb
словые значения адресов, используется команда
SET SYMBOLS OFF.

Комментарий Дополнительные комментарии дизассемблера.
Пример:

Ниже показан пример вывода дизассемблированной инструкции:
00FD:00001DA1 56
PUSH ESI
Кроме этого, дизассемблер SoftICE предоставляет следующие комментарии:
 Команда INT 2E дополняется именем вызываемого сервиса ядра операционb
ной системы и количеством параметров, которое он требует. Если Вы загруb
зили отладочную информацию для модуля NTOSKRNL, и ее таблица является
текущей, то вместо адреса Вы увидите имя вызываемой программы.
 Если в инструкции используется непосредственный операнд, который совпаb
дает со значением кода статуса Windows NT, то его имя будет показано в комb
ментарии.
 Команда INT 21 комментируется именем DOSbфункции.
 Команда INT 31 комментируется именем DPMIbфункции.
 Так, где это имеет смысл, в качестве меток используются имена сервисов VxD.
Отображение дополнительной информации
Кроме исходных текстов и дизассемблированных команд в окне кодов отобраb
жается и некоторая дополнительная информация:
 При активизации экрана SoftICE текущая инструкция, адрес которой нахоb
дится в регистре EIP, выделяется. Если ею является относительный переход,
то в поле комментария дизассемблера содержится строка JUMP или NO JUMP
("Переход" или "Нет перехода", соответственно) в зависимости от того, будет
он выполняться или нет. Кроме того, в строке JUMP имеется стрелка вниз или
вверх, указывающая направление, куда — вперед или назад по коду будет выb
полнен этот переход, что помогает определить направление листания содерb
жимого окна кодов, чтобы посмотреть цель перехода.

Окно кодов

69



Командаbцель инструкции JUMP всегда отмечается подсвеченной стрелкой
(), перекрывающей селекторную часть адреса.
 Если инструкция ссылается на содержимое в памяти, то в конце строки инстb
рукции показывается эффективный адрес и содержимое по этому адресу. В
случае, если на экране SoftICE открыто окно регистров, то эффективный адb
рес и значение по этому адресу отображаются в этом окне непосредственно
под значениями регистра флагов.
 Если на какойbлибо инструкции в окне кодов установлена контрольная точка,
то это инструкция показывается жирным шрифтом.
 Разделительные линии выше и ниже окна кодов содержат дополнительную
информацию о коде.
В верхней разделительной линии размещаются:
 Символическое имя + смещение
 Имя файла исходного кода, если он отображается в окне
 Тип сегмента:
V86
Код реального режима с адресацией сегмент:смещение
PROT16
Код 16bбитного защищенного режима
с адресацией селектор:смещение
PROT32
Код 32bбитного защищенного режима
с адресацией селектор:смещение
В нижней разделительной линии размещаются:
 Имя модуля Windows, имя секции и смещение, если это 32bбитный модуль
Windows. Например, KERNEL32!.Text + 002f
 Имя модуля Windows и номер сегмента в скобках, если это 16bбитный моb
дуль Windows. Например, Display (01)
 Имя владельца кодового сегмента, если это код режима V86. Например, DOS.

Ввод команд из окна кодов
Находясь в окне кодов Вы, тем не менее, можете вводить и исполнять команды.
Как только Вы наберете первый символ команды, курсор автоматически переходит
в окно команд. После того как набор команды завершен нажатием клавиши ENTER
или ESC, курсор возвращается в окно кодов. Кроме того, находясь в окне кодов, Вы
можете исполнять команды с помощью функциональных клавиш. Дополнительную
информацию, касающуюся введения команд смотрите в разделе "Окно команд" на
странице 61.
В следующей таблице приведены наиболее полезные команды.
Команда

Функция

. (точка)

Показать инструкцию по текущему адресу (EIP)

A адрес

Ассемблировать инструкцию непосредственно в память

BPX (F9)

Установить постоянную контрольную точку в строке, где
находится курсор

FILE имяBфайла

Выбрать файл с исходными кодами для отображения в окне.
Параметр имяфайла может содержать неполное имя. Если Вы
не знаете точного имени, то по команде FILE * можно просмотb
реть список всех загруженных файлов исходных текстов.

HERE (F7)

Установить одноразовую контрольную точку в текущей
строке

SET

Показать или изменить переменные окружения SoftICE
Продолжение на следующей странице

70

5. Интерфейс SoftICE
Команда

Функция

SRC

Переключение между режимами отображения окна кодов:
режимом кода, исходных текстов и смешанным режимом.
Показать в окне кодов следующую инструкцию, содержаb
щую заданную подстроку
Установить позиции табуляции для отображения исходного
текста приложения.
Дизассемблировать код по любому указанному адресу.
Если в качестве адреса Вы укажите имя функции, то
SoftICE переместит отображение окна кодов на указанную
Вами функцию.

SS строка
TABS позицииB
табуляции
U адрес

Полное описание этих команд приведено в "Справочнике по командам SoftICE".

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

Управление окном локальных переменных
Для управления окном локальных переменных используются следующие команды.
Команда

Описание

WL

Открыть/закрыть окно локальных переменных

WL [количествоBстрок]
AltbL

Изменить размер окна локальных переменных
Переместить курсор в окно локальных переменных
или из него

Листание содержимого окна локальных переменных
Для листания окна содержимого используются стрелки скроллинга (при работе
с мышью), либо переместите курсор в окно командой AltbL и примените необходиb
мую комбинацию клавиш.
Функция

Комбинация
клавиш

Перейти к предыдущей странице содержимого окна лоb
кальных переменных
Перейти к следующей странице содержимого окна
Прокрутить окно на одну строку вверх
Прокрутить окно на одну строку вниз
Перейти к первому объекту содержимого окна
Перейти к последнему объекту содержимого окна
Сместить содержимое окна на один символ влево
Сместить содержимое окна кодов на один символ вправо

PageUp
PageDown
Стрелка вверх
Стрелка вниз
Home
End
Стрелка влево
Стрелка вправо

Окно слежения

71

Раскрытие и сжатие содержимого стека
Вы можете раскрывать структуры, массивы и символьные строки, отмеченные
знаком "плюс" (+), для просмотра их содержимого. Для раскрытия и сжатия соb
держимого объекта сделайте следующее:
 Только на компьютерах с процессором класса Pentium или выше — Двойной
щелчок на объекте.
 На всех компьютерах — Перейдите в окно локальных переменных (AltbL), пеb
реместите курсор на необходимый объект и нажмите клавишу ENTER.

Связанные с окном команды
Приведенные ниже команды имеют непосредственное отношение к окну лоb
кальных переменных. Дополнительные подробности о них смотрите в "Справоч
нике по командам SoftICE".
Команда

Функция

LOCALS

Показать список переменных текущего кадра стека.

TYPES [имяBтипа]

Список всех заданных типов в текущем контексте или
информацию о типе, указанном в параметре.

Окно слежения
Окно слежения позволяет постоянно наблюдать за значениями выражений,
введенными с помощью команды WATCH. Дополнительную информацию по этой
команде можно получить в "Справочнике по командам SoftICE".

Управление окном слежения
Для управления окном используются следующие команды.
Команда

Описание

WW

Открыть/закрыть окно слежения

WW [количествоBстрок]
AltbW

Изменить размер окна слежения
Переместить курсор в окно слежения или из него

Листание содержимого окна слежения
Для листания окна содержимого используются стрелки скроллинга (при работе
с мышью), либо переместите курсор в окно командой AltbW и примените необхоb
димую комбинацию клавиш.
Функция

Комбинация
клавиш

Перейти к предыдущей странице содержимого окна слежения

PageUp

Перейти к следующей странице содержимого окна

PageDown

Прокрутить окно на одну строку вверх

Стрелка вверх

Прокрутить окно на одну строку вниз

Стрелка вниз
Продолжение на следующей странице

72

5. Интерфейс SoftICE
Функция

Комбинация
клавиш

Перейти к первому объекту окна слежения

Home

Перейти к последнему объекту окна слежения

End

Сместить содержимое окна на один символ влево

Стрелка влево

Сместить содержимое окна кодов на один символ вправо

Стрелка вправо

Создание выражений для отслеживания их значений
Выражение, за значением которого Вы хотите наблюдать, задается с помощью
команды WATCH. В выражении могут использоваться как глобальные, так и лоb
кальные переменные, регистры и адреса.
Замечание: Для наблюдения за выражениями, содержащими локальные переb
менные Вы должны находиться в области их видимости.
Следующие примеры иллюстрируют применение команды WATCH.
Пример:
Наблюдение за значением "ds:esi":
WATCH ds:esi
Пример:
Наблюдение за значением, на которое указывает содержимое
"ds:esi":
WATCH *ds:esi
Удаление отслеживаемых выражений
Удалить выражение, заданное в окне слежения можно с помощью мыши или с
клавиатуры. С помощью мыши нужно выделить выражение, щелкнув по нему, а
затем нажать "DELETE". При работе с клавиатурой необходимо перейти в окно с поb
мощью клавиатурного сочетания AltbW, перевести курсор на необходимое выраb
жение и нажать "DELETE".

Отображение информации
Окно слежения содержит следующие поля (слева направо):
Поле строки

Описание

Выражение

Содержит собственно выражение, заданное командой
WATCH. Оно вычисляется всякий раз при отображении
окна

Определение типа

Тип выражения

Значение

Текущее значение наблюдаемого выражения

Развертывание и сжатие выражений
Вы можете развернуть выражения, помеченные значком "плюс" (+), чтобы проb
смотреть его содержимое. Развертывание и сжатие можно выполнить с помощью
следующих действий:
 Только на компьютерах с процессором класса Pentium или выше — Двойной
щелчок мыши на необходимом выражении.

Окно регистров


73

На всех компьютеров — Перейти в окно слежения командой AltbW, найти неb
обходимое выражение и нажать ENTER.

Связанные с окном команды
Приведенная ниже команда имеет непосредственное отношение к окну слежения.
Дополнительные подробности о ней смотрите в "Справочнике по командам SoftICE".
Команда

Функция
Добавление выражений в окно слежения.

WATCH [выражение]

Окно регистров
Окно регистров демонстрирует текущие значения регистров, флагов и эффекb
тивный адрес, если таковой используется в команде. Окно может быть использоваb
но для определения, какие регистры были модифицированы во время вызова проb
цедуры или для изменения содержимого регистров или флагов.

Управление окном регистров
Для управления окном используются следующие команды.
Команда

Описание
Открыть/закрыть окно регистров

WR
AltbR

Переместить курсор в окно регистров или из него

Если Вы не пользуетесь окном регистров, то закройте его, чтобы освободить доb
полнительное место для отображения других окон.

Отображение информации
Первые три строки окна показывают содержимое регистров, флаги и эффекb
тивный адрес, если последний используется в команде:
EAX
EBX
ECX
EDX
ESI
EDI
EBP
ESP
EIP
o d i s z a p c
CS
DS
SS
ES
FS
GS
  - 
При выполнении команд T (Trace — трассировка), P (Step over — пошаговое исb
полнение) или G (Go to — перейти к) SoftICE подсвечивает измененные регистры.
Это свойство особенно полезно для выявления вопроса, какие регистры изменяютb
ся во время вызова процедуры.
Во 2й строке окна находятся флаги процессора. Их описание приведено в слеb
дующей таблице.
Флаг Описание

Флаг

Описание

o

Флаг переполнения

z

Флаг нуля

d

Флаг направления

a

Флаг дополнительного переноса

i

Флаг разрешения прерывания

p

Флаг четности

s

Флаг знака

c

Флаг переноса

74

5. Интерфейс SoftICE

Замечание: Строчный неподсвеченный символ означает, что флаг не установb
лен и имеет значение "0". Выделенный заглавный символ показыb
вает, что флаг имеет значение "1". Например, o d I s Z a p c.
Если текущая команда обращается к адресу в памяти, то в третьей строке показыb
вается эффективный адрес и значение по этому адресу. Эффективный адрес и знаb
чение могут использоваться в выражениях с помощью встроенных функций Eaddr и
Evalue. Подробности смотрите в разделе "Встроенные функции" на странице 105.

Изменение содержимого регистров и значений флагов
Окно регистров может быть использовано для изменения содержимого регистb
ров или флагов. Для перемещения курсора в окно следует щелкнуть мышью в преb
делах окна или нажать клавиатурную комбинацию AltbC. Изменение содержимого
окна может быть выполнено с помощью следующих клавиатурных комбинаций.
Функция редактирования

Комбинация
клавиш

Перевести курсор к началу поля следующего регистра

Tab или
Shiftbстрелка вправо

Перевести курсор к началу поля предыдущего регистра

ShiftbTab или
Shiftbстрелка влево

Закончить редактирование и сохранить сделанные
изменения

Enter

Закончить редактирование, не сохраняя изменения в
текущем регистре. (Однако, все предыдущие изменеb
ния сохраняются.)

Esc

Переключение значения флага, когда курсор находитb
ся в одном из них

Insert

Перемещение курсора в пределах окна регистров

Стрелки

Связанные с окном команды
Приведенные ниже команды имеют непосредственное отношение к окну региb
стров. Дополнительные подробности о них смотрите в "Справочнике по командам
SoftICE".
Команда

Функция

CPU

Показывает значения всех регистров процессора

G [=стартовыйBадрес]
[адресBостанова]

Начать исполнение (с указанного адреса по адрес
останова)

P

Выполнить один шаг программы

T [=стартовыйBадрес]
[счетчик]

Трассирование команд (начиная с указанного адреса)

Окно данных

75

Окно данных
Окно данных позволяет Вам видеть и изменять содержимое памяти. Вы можете
задать до 4 окон данных, показывающих различные участки памяти в разных форb
матах отображения. Однако, на экране одновременно может быть открыто только
одно такое окно.

Управление окном данных
Для управления окном используются следующие команды.
Команда

Описание

WD

Открыть/закрыть окно данных

WD [количествоBстрок]

Изменить размер окна данных

AltOD

Переместить курсор в окно данных или из него

DATA

Циклическое переключение окон данных

D [адрес]

Указать адрес для отображения в окне данных

FORMAT (или ShiftbF3)

Выбрать формат отображения данных в окне

Циклическое переключение окон данных
Циклическое переключение окон данных осуществляется командой DATA или
щелчком мыши по верхней границе окна данных. Окна переключаются в порядке
от 0 до 3.
Листание содержимого окна данных
Для листания содержимого окна данных используются стрелки скроллинга (при
работе с мышью), либо переместите курсор в окно командой AltbD и примените неb
обходимую комбинацию клавиш.
Функция

Комбинация
клавиш

Перейти к предыдущей странице содержимого окна данных

PageUp

Перейти к следующей странице содержимого окна

PageDown

Прокрутить окно на одну строку вверх

Стрелка вверх

Прокрутить окно на одну строку вниз

Стрелка вниз

Отображение информации
Строка над окном данных имеет 4 поля, перечисленные в следующей таблице
(слева направо).

76

5. Интерфейс SoftICE
Поле

Описание

Строка

Если окну данных командой DEX было присвоено выражение,
то в строке показывается выражение в текстовом виде. В
противном случае здесь показывается смещение начала отоb
бражаемой в окне области памяти относительно ближайшего
символического имени; это может быть один из следующих
типов строк:


символическое имя с последующим шестнадцатеричным
смещением относительного этого имени, например,
MySYMBOL+00010



имя модуля Windows с последующим типом, если сегмент
данных является частью кучи Windows, например,
mouse.moduleDB



имя владельца сегмента данных, если он является частью
виртуальной DOSbмашины



имя модуля Windows, имя секции и шестнадцатеричное
смещение от этого имени, например,
KERNEL32!.text+001F

Тип формата
данных

Данные отображаются в виде байтов, слов, двойных слов или
коротких, длинных или 10bбайтных вещественных значений

Тип сегмента

Имеет значение V86 или PROT. Индикатор V86 обозначает
данные реального режима (сегмент:смещение), а PROT укаb
зывает на данные защищенного режима с адресацией селекb
тор:смещение

Номер окна

Номер окна данных от 0 до 4. На экране SoftICE одновременb
но может отображаться только одно окно данных.

Каждая строка окна данных отображает 16 байт области памяти в текущем форb
мате в виде байт, слов, двойных слов или коротких или длинных вещественных знаb
чений. Если текущий формат задает отображение 10bбайтных вещественных значеb
ний, то каждая строка содержит 20 байт. Если текущий формат задает отображение
данных в шестнадцатеричном виде (байт, слово или двойное слово), то в правой части
окна показываются значения данных в символьном виде.

Изменение адреса отображаемой памяти и формата данных
Для изменения формата отображения данных необходимо щелкнуть по полю
формата, указанному в верхней границе окна, либо использовать команду FORMAT
(клавиатурная комбинация ShiftbF3). В любом случае происходит циклическое пеb
реключение между форматами отображения: байт, слово, двойное слово, короткий
вещественный, длинный вещественный или 10bбайтный вещественный формат.
Для изменения адреса отображаемой области данных укажите необходимый
адрес в команде D. Например, следующая команда выводит содержимое области
памяти, начиная с адреса ES:1000h:
:D es:1000
Совет:

Команда D может быть одновременно использована и для указания
формата отображения. Подробна команда D описана в "Справоч
нике по командам SoftICE".

Окно стека FPU

77

Изменение содержимого памяти
Для изменения содержимого памяти переместите курсор в окно данных и ввеb
дите символьное или шестнадцатеричное значение. При редактировании в окне
данных могут быть использованы следующие клавиши.
Функция редактирования

Комбинация
клавиш

Перемещение между числовым и текстовым (ASCII) полями окна

Tab

Перевести курсор к началу предыдущего поля данных (предыдуb
щий байт, слово, двойное слово в шестнадцатеричном числовом
поле или к предыдущему символу в текстовом поле)

ShiftbTab

Закончить редактирование и сохранить сделанные изменения

Enter

Закончить редактирование, не сохраняя изменения в текущем поb
ле данных. (Однако, все предыдущие изменения сохраняются.)

Esc

Совет:

Для изменения содержимого памяти может быть использована коb
манда E.

Присвоение выражения
Любому окну с помощью команды DEX может быть присвоено выражение. При
активизации SoftICE это выражение вычисляется, и область данных, начинающаяb
ся с полученного адреса, отображается в этом окне. Например, в следующем приb
мере команда заставляет окно 0 всегда при активизации SoftICE показывать содерb
жимое стека:
DEX 0 SS:ESP

Связанные с окном команды
Приведенные ниже команды имеют непосредственное отношение к окну данb
ных. Дополнительные подробности о них смотрите в "Справочнике по командам
SoftICE".
Команда

Функция

D [размер] [адрес]

Отображение содержимого памяти

DEX [номерBокна [выражение]]

Отображение или присвоение выраb
жения окну данных

E [размер] [адрес] [списокBданных]

Редактирование содержимого памяти

S [Ocu] [адрес L длина списокBданных]

Поиск данных в памяти

Окно стека FPU
Окно стека FPU (Float Point Unit — блок плавающей запятой или математичеb
ский сопроцессор) показывает текущее состояние стека регистров FPU или MMX
(MMX или MultiMedia Extention означает расширение системы команд процессоb
ров Pentium или Pentium Pro).
Для открытия и закрытия окна используется команда WF.

78

5. Интерфейс SoftICE

Отображение информации
Если данные в окне FPU отображаются в виде вопросительных знаков (?), то это
означает, что математический сопроцессор отключен или отсутствует в системе. В
Windows NT FPU подключается к потоку после исполнения первой FPUbинструкции.
Архитектура процессоров фирмы Intel предполагает совместное (но не одноb
временное) использование регистров блоками FPU и MMX. Для отображения соb
держимого стеков используются следующие форматы.
Команда

Функция

WF F

Плавающая запятая

Только для FPU

WF B

Упакованные байты

Только для MMX

WF W

Упакованные слова

Только для MMX

WF D

Упакованные двойные слова

Только для MMX

При отображении стека в виде вещественных чисел регистры обозначаются от
ST0 до ST7. При отображении данных в виде упакованных байтов, слов или двойb
ных слов регистры обозначаются MM0bMM7. (Подробности о команде WF смотриb
те в "Справочнике по командам SoftICE".)
Совет:
Для отображения содержимого регистров, статуса и управляющего
слова используйте команду WF OD (с дефисом!).

Ошибки являются частью нашей жизни.
Их последствия — вот с чем необходимо считаться.
Никки Джиованни

Mistakes are a fact of life. It is the response to error that counts.
Nikki Giovanni

6. Использование SoftICE
Отладка нескольких программ одновременно
Утилита Symbol Loader позволяет загружать в одном сеансе несколько таблиц с
отладочной информацией. Следовательно, Вы можете отлаживать сложные комb
плексы программного обеспечения, состоящие из таких разных компонентов как,
например, приложения, библиотеки и драйверы.
Для того, чтобы просмотреть список всех загруженных таблиц и выбрать необb
ходимую в данный момент, применяется команда TABLE. Когда программа в проb
цессе своего исполнения достигает установленной Вами контрольной точки, приb
менение команды TABLE в сочетании с несколькими первыми символами имени
таблицы позволяет сменить текущую таблицу на ту, которая соответствует исполb
няемой в данный момент программе.
Если же Вы не знаете, какая таблица является текущей, то команда TABLE без
параметров покажет список всех загруженных отладочных таблиц, а текущая табb
лица будет выделена цветом.
Возможно переключение на таблицу, которая не соответствует исполняемой в
данный момент программе. Это может понадобиться, например, для установки с их
помощью контрольных точек в еще незагруженной программе.

Перехват ошибок
SoftICE позволяет перехватывать ошибки для следующих типов программных
кодов:
 32bбитный код защищенного режима кольца 3 (программы Win32)
 Драйверы кольца 0 (драйверы устройств режима ядра)
 16bбитный код защищенного режима кольца 3 (16bбитные Windows программы)
SoftICE не перехватывает ошибки окон DOS. Это касается как программ виртуb
альных машин V86, так и расширителей DOS.
В следующих разделах поддержка перехвата ошибок описана подробнее.

32oбитный код защищенного режима кольца 3 (программы Win32)
SoftICE перехватывает все необрабатываемые исключения, которые в обычных
ситуациях приводят к выводу сообщения об ошибке. SoftICE автоматически возb
вращается к инструкции, вызвавшей ошибку, выводит на экран свое рабочее окно
и показывает эту инструкцию и примерно следующее сообщение:
Break due to Unhandled Exception NTSTATUS=STATUS_ACCESS_VIOLATION
(o[[ei_d ibaid _`[`ei\g dbvu_dc …).

80

6. Использование SoftICE

Поле NTSTATUS содержит сообщение об ошибке, соответствующее коду статуса.
(Полный список статусных кодов находится в заголовочном файле NTSTATUS.H в
Windows NT DDK.)
Если исполнение программы после перехвата ее отладчиком продолжить, то
SoftICE проигнорирует эту ошибку и предоставит операционной системе выполb
нить обычную процедуру обработки ошибок, например, вывести окно диалога с соb
общением об ошибке приложения.

Драйверы кольца 0 (драйверы устройств режима ядра)
SoftICE обрабатывает все исключения 0 кольца, которые приводят к вызову
KeBugCheckEx. KeBugCheckEx — это программа, которая выводит в Windows NT
"синий экран смерти".
Если KeBugCheckEx вызвана в результате ошибки обращения к странице, обb
щей ошибки защиты, ошибки стека или недопустимого кода команды, то SoftICE
пытается повторно выполнить ошибочную инструкцию. Если снова будет выдано
сообщение об ошибке на той же самой инструкции, то либо произойдет рестарт
системы, либо будет сделана попытка обойти данную ситуацию, изменяя содержиb
мое EIP или меняя условия функционирования системы.
Если KeBugCheckEx вызвана по другим причинам, то инструкция повторена
быть не может. В этом случае SoftICE активизируется на входе в KeBugCheckEx с
сообщением примерно следующего содержания:
Break Due to KeBugCheckEx (Unhandled kernel mode exception) Error=1E
(KMODE_EXCEPTION_NOT_HANDLED) P1=8000003 P2=804042B1 P3=0 P4=FFFFFFFF

(o[[ei_d i [mnbt KeBugCheckEx (_`[`ei\ dbvu_d ca[ …))
Поле ошибки содержит шестнадцатеричный код с кратким описанием. Опреb
деления кодов ошибок содержится в заголовочном файле BUGCODES.H в NT DDK.
Поля P1bP4 содержат параметры, передаваемые в программу KeBugCheckEx.
Эти поля не имеют стандартных значений.
Если Вы попытаетесь продолжить работу в этой точке, то Windows NT продеb
монстрирует "синий экран" и зависнет. Если же Вы хотите контролировать ситуаb
цию и после "синего экрана", то включите режим I3HERE (SET I3HERE ON); после
появления "синего экрана" Windows NT выполнит инструкцию INT 3.

16oбитный код защищенного режима кольца 3 (16oбитные
Windows программы)
SoftICE обрабатывает перехват ошибок 16bбитных программ несколько иным
способом, чем 32bбитных. Обычно при возникновении ошибки 16bбитного прилоb
жения Windows NT выводит диалоговое окно с описанием ошибки и предоставляет
Вам выбор — CANCEL или CLOSE.
Если Вы выберите CANCEL, то команда, вызвавшая ошибку, будет повторена, а
Windows NT выдаст отладочное сообщение для перехвата ошибочной инструкции.
SoftICE использует его для своей активизации и выводит эту инструкцию на экран.
Иными словами, SoftICE появляется после того, как Вы получите сообщение об
ошибке и "проигнорируете" ее (то есть нажмете кнопку CANCEL), но не перед этим.
Если же Вы нажмете кнопку CLOSE, то Windows NT не будет делать попытку поb
вторного исполнения инструкции, а SoftICE не будет активизирован. Следовательно,
если Вы хотите отлаживать исключения, всегда нажимайте кнопку CANCEL.
Некоторые ошибки приводят к демонстрации целой серии диалоговых окон. В
этом случае первое окно содержит выбор CLOSE или IGNORE. IGNORE заставляет

Контекст адресов

81

Windows NT пропустить инструкцию, вызвавшую ошибку, и продолжить выполнеb
ние программы. Если же нажать CLOSE, то Windows NT покажет следующее диаb
логовое окно.

Контекст адресов
Как Windows 95, так и Windows NT выделяют каждому процессу собственное
адресное пространство в диапазоне адресов от 0 до 2 Гб. Кроме того, Windows 95
резервирует первые 4 Мб каждой виртуальной машины (для размещения DOS и ее
драйверов). Область памяти от 2 до 4 Гб разделяется всеми процессами.
Выделенное процессу виртуальное адресное пространство называется адресb
ным контекстом (или контекстом процесса). SoftICE выводит имя текущего проb
цесса в правой части строки статуса в нижней части экрана. Учтите, что текущий
контекст не обязательно совпадает с контекстом Вашего приложения, особенно есb
ли Вы самостоятельно активизировали SoftICE. Если это так, то прежде чем проb
сматривать или модифицировать какиеbлибо данные, или устанавливать контрольb
ные точки в Вашем приложении, выполните команду ADDR, чтобы переключиться
на контекст приложения.
SoftICE автоматически переключает адресный контекст в следующих случаях:
 Если Вы используете команду TABLE для переключения 32bбитных таблиц, то
SoftICE меняет текущий контекст адресов на контекст модуля указанной в
команде таблицы.
 Если Вы выполняете команду FILE для просмотра файла с исходными текстами из
32bбитной таблицы, SoftICE выполняет аналогичное переключение контекста.
 Если Вы используете в выражении символические имена, то SoftICE также выb
полняет необходимое переключение контекста. Эта ситуация включает в себя
и экспортируемые символы, загруженные с помощью утилиты Symbol Loader.
Если Вы меняете адресный контекст, то при просмотре кодов или данных, расb
положенных в адресном пространстве приложения (линейные адреса от 0x400000
до 0x7FFFFFFF для Windows 95 и от 0 до 0x7FFFFFFF для Windows NT), могут возb
никать недоразумения. Отображаемые коды или данные меняются, хотя значения
селектор:смещение остаются неизменными. Это нормально. Линейный адрес осb
тается тем же самым, однако используемые теперь системные таблицы страниц
указывают на физическую память иного адресного контекста.
SoftICE не позволяет использовать в выражениях адресный контекст. Если Вы
используете в выражении непосредственные значения адресов, то проверьте, устаb
новлен ли необходимый Вам адресный контекст. Например, команда D 137:401000
покажет содержимое памяти для текущего адресного контекста.
Внимание: Прежде чем устанавливать контрольные точки с использованием
непосредственных значений адресов, проверьте правильность конb
текста, так как SoftICE использует его для трансляции линейных
адресов в физические.

Использование команд '.' (точка) INT 0x41
Windows 95 предоставляет набор расширений, которые позволяют виртуальным
драйверам VxD или 32bбитным библиотекам DLL взаимодействовать с отладчиком
уровня ядра. (Подробности смотри в файле DEBUGSYS.INC Windows 95 DDK.) API
команд с точкой '.' позволяет получать специфическую VxD отладочную информаb
цию или выдавать необходимые команды через стандартный интерфейс отладчика
уровня ядра операционной системы. Хотя первоначально эти команды разрабатыb
вались для отладчика WDEB386 фирмы Microsoft, SoftICE также поддерживает

82

6. Использование SoftICE

большой набор команд с точкой, и Вы можете использовать их для доступа к VMM
и VxD, а также добавлять любые собственные команды с точкой для Ваших VxD.
Внимание: Реализация всех '.'bкоманд встроена в VMM или в соответствующие
VxDbдрайверы. Они не являются частью SoftICE, и поэтому отладb
чик не может гарантировать корректность их работы. Кроме того,
эти команды не обеспечивают проверку ошибок, что может приb
вести к краху системы при неверном задании параметров. И, накоb
нец, SoftICE не может определить, находится ли операционная сисb
тема в состоянии, необходимом для правильного выполнения данb
ной команды с точкой, что также может привести к краху системы,
если команда была выдана в неподходящий момент.
SoftICE поддерживает следующие '.'bкоманды Windows 95:
 Зарегистрированные расширения для команд с точкой.
Для получения списка зарегистрированных расширений используется слеb
дующая команда
.?
 DebugbQuery расширения.
Чтобы вызвать обработчик этих команд с точкой наберите после точки имя
VxD. Большинство обработчиков (если они существуют для данного VxD),
выводят на экран меню. Например, перечисленные ниже VxD имеют обраb
ботчики команд с точкой как в отладочной, так и в коммерческой версии
Windows 95:
.VMM
.VPICD
.VXDLDR
Чтобы узнать, существует ли обработчик команд с точкой для данного VxD,
просто выдайте команду. Для некоторых VxD в отладочной версии DDK обесb
печивается поддержка большего количества команд, чем в коммерческой.
 Встроенные '.'bрасширения для VMM.
VMM предоставляет большое количество команд с точкой как в отладочной,
так и в коммерческой версии. Для получения полного списка воспользуйтесь
командой
..?
В коммерческой версии Windows 95 команда "..?" выдает следующий список
расширений для команд с точкой:
. (точка)[команда
.R[#]
.VM[#]
.VC[#]
.VH[#]
.VR[#]
.VS[#]
.VL
.DS
.VMM
.

Описание

Показывает регистры текущего потока
Показывает полное состояние виртуальной машины
Показывает блок управления (control block) текущей виртуb
альной машины
Показывает VMM linked list и, если возможно, список обраb
ботчиков
Показывает регистры текущей виртуальной машины
Показывает стек текущей виртуальной машины
Показывает список всех обработчиков виртуальной машины
Выводит дамп стека защищенного режима с метками
Меню для получения информации о состоянии VMM
Показывает информацию о состоянии заданного устройства

Переходы из 3 кольца защиты к 0 кольцу — общие сведения

83

Переходы из 3 кольца защиты к 0 кольцу — общие сведения
Много раз во время трассировки программ под управлением Windows 95 Вам
приходилось достигать команд INT 30h или ARPL. Обе они используются для выполb
нения перехода из 3 кольца защиты в кольцо 0. Если Вы хотите выполнить такой пеb
реход, но при этом сэкономить силы и время, не трассируя большие объемы кода
VMM, то с помощью команды G (Go — перейти) Вы можете запустить исполнение
VMM с остановкой на адресе, который Вы обнаружите в окне дизассемблирования.
Windows 95 применяет следующие методы для перехода из 3 кольца защиты к
кольцу 0.
 В режиме V86 Windows 95 использует команду ARPL, которая вызывает ошибb
ку исполнения недопустимой команды. Обработчик такой ошибки передает
управление соответствующему VxD. В Windows 95 используется единственb
ная команда ARPL, которая задается различными сочетаниями сегb
мент:смещение в V86, чтобы указать адреса различных VxD. Например, если
используется ARPL по адресу 0xFFFF:0, то Windows 95 применяет комбинации
адресов 0xFFFF:0, 0xFFFE:10, 0xFFFD:20, 0xFFFC:30 и так далее.
Ниже показан пример вывода команды ARPL в окне дизассемблера:
FDD2:220D ARPL DI,BP ; #0028:C0078CC9 IFSMgr(01)+0511


В защищенном режиме для перехода Windows 95 использует программное
прерывание с номером 30h. Сегмент 3Bh не содержит никакого другого кода
кроме инструкций INT 30h, передающих управлением соответствующим VxD.
Ниже приведены результаты дизассемблирования кода по адресу 3B:31A.
003B:031A
INT30
; #0028:C008D4F4
VPICD(01)+0A98
003B:031C
INT30
; #0028:C007F120
IOS(01)+0648
003B:031E
INT30
; #0028:C02C37FC
VMOUSE(03))00F0
003B:0320
INT30
; #0028:C02C37FC
VMOUSE(03))00F0
003B:0322
INT30
; #0028:C023B022
BIOSXLAT(05)=0022
003B:0324
INT30
; #0028:C230F98
BIOSXLAT(04)=0008
003B:0326
INT30
; #0028:C023127C
BIOSXLAT(04)=02EC

Вам известны мои методы. Примените их.
Сэр Артур Конан Дойл

You know my methods. Apply them.
Sir Arthur Conan Doyle

7. Использование прерываний
Введение
При отладке приложений в SoftICE Вы можете устанавливать прерывания (или
контрольные точки) на исполняемые команды, на чтение и запись в области памяb
ти, на прерывания, на операции чтения или записи в порты ввода/вывода. SoftICE
присваивает каждой контрольной точке номер от 0 до 0FFh, который используется
для установки, удаления, включения/выключения соответствующего прерывания
или для задания условий его возникновения.
Все прерывания в SoftICE являются постоянными, что означает, что отладчик
отслеживает и поддерживает их до тех пор, пока Вы их самостоятельно не удалите
или не отключите с помощью команд BC или BD, соответственно. После своего
удаления контрольная точка может быть восстановлена с помощью команды BH,
которая показывает протокол установки контрольных точек.
Одновременно Вы может установить до 256 прерываний. Однако, число конb
трольных точек на обращение к памяти (BPM) и к портам ввода/вывода в сумме не
может быть больше 4 изbза архитектурных особенностей процессоров x86.
Если доступна отладочная информация, то прерывание может быть установлено
с использованием имен функций. В режиме исходных кодов или смешанном реb
жиме можно устанавливать контрольные точки методом "укажи и установи" на люb
бой строке исходного текста. Особую ценность в данном случае представляет то,
что Вы можете установить прерывания в модуле еще до его фактической загрузки.

Типы контрольных точек, поддерживаемых SoftICE
SoftICE, основываясь на особенностях архитектуры процессоров x86, обеспечиb
вает поддержку множества разнообразных типов прерываний:
 Прерывания исполняемых команд. SoftICE заменяет существующие инструкb
ции командами INT 3. Этот тип прерываний устанавливается командой BPX.
 Прерывания на обращение к памяти. SoftICE использует отладочные регистb
ры для прерывания работы, когда читается (или исполняется) определенный
байт, слово или двойное слово в памяти, или по этому адресу производится заb
пись. Для установки такого типа прерываний используется команда BPM.
 Контрольные точки на прерываниях. SoftICE перехватывает прерывания, моb
дифицируя IDT (таблицы дескрипторов прерываний). Для таких контрольных
точек используется команда BPINT.
 Прерывания ввода/вывода. SoftICE использует расширения отладочных реb
гистров процессоров Pentium и Pentium Pro, чтобы отслеживать инструкции
IN и OUT по заданному номеру порты. Этот тип прерываний устанавливается
командой BPIO.

Типы контрольных точек, поддерживаемых SoftICE


85

Прерывания на сообщения Windows. SoftICE отслеживает поступление в окb
но определенного сообщения (или сообщений из заданного диапазона). Этот
тип прерываний не является фундаментальным, скорее это полезная надb
стройка над другими типами прерываний. Для установки контроля на поступb
ление сообщения Windows применяется команда BMSG.

Дополнительные возможности контрольных точек
Любое из вышеперечисленных прерываний может быть задано со следующими
дополнительными параметрами:
 Условное выражение [IF
]. Для возникновения прерывания выb
ражение должно иметь в результате ненулевое значение (TRUE, Истина).
Подробности смотрите в разделе "Условные прерывания" на странице 91.
 Действие при прерывании [DO "1; 2; …"]. При возникноb
вении прерывания будет автоматически выполнена указанная последовательb
ность команд. В качестве команд могут быть использованы и пользовательb
ские макрокоманды. Подробности смотрите в разделе "Задание действия при
прерывании" на странице 90.
Замечание: Полная информация по каждому типу прерываний приведена в
"Справочнике по командам SoftICE".

Прерывание исполняемых команд
Контрольные точки на исполняемых командах перехватывают управление проb
цессором при выполнении, например, вызова функции или строки на исходном
языке программирования. Это наиболее часто используемый тип прерывания.
SoftICE замещает исходную команду на инструкцию INT 3 и получает управление
при ее выполнении.
Контрольная точка на исполняемой команде в SoftICE может быть установлена
двумя способами: с помощью мыши или командой BPX. В следующих разделах
подробно описаны оба эти способа.
Установка прерывания с помощью мыши
Если у Вас в компьютере используется процессор Pentium и подключена мышь,
то с ее помощью Вы может устанавливать (и удалять) постоянные и одноразовые
контрольные точки. Для установки прерывания необходимо выполнить двойное
нажатие на строке программе, где Вы хотите его установить. После установки преb
рывания SoftICE выделит эту строку цветом. Повторный двойной щелчок на той же
строке удаляет данную контрольную точку. Для установки одноразовой контрольb
ной точки, необходимо щелкнуть по командной строке, где Вы хотите ее устаноb
вить, и выполнить команду SoftICE HERE (функциональная клавиша F7).
Использование команды BPX для установки прерывания
Для установки прерывания исполнения программы можно применять команду
BPX со следующими параметрами:
BPX [ ] [IF
] [DO “1; 2; …”]
IF

Подробности смотрите в разделе "Условные
прерывания" на странице 91.
DO “1;2;…” Подробности смотрите в разделе "Задание дей
ствия при прерывании" на странице 90.

86

7. Использование прерываний
Пример:

Для установки прерывания на функцию WinMain используется коb
манда:
BPX WinMain
Без какихbлибо параметров команда может быть использована для установки
контрольной точки на текущей строке исходного кода. Для этого перейдите в окно
кодов (комбинация клавиш AltbC), с помощью стрелок переместите курсор в строb
ку, где необходимо установить .прерывание, и выполните команду BPX (или наb
жмите функциональную клавишу F9). Если Вы предпочитаете использовать мышь,
то пролистайте кодовое окно до необходимого фрагмента, а затем двойным щелчb
ком установите контрольную точку в нужной строке.

Прерывания на обращение к памяти
Прерывания на обращение к памяти основаны на использовании отладочных
регистров, впервые введенных в процессорах серии 386. Этот тип прерываний
чрезвычайно полезен для выяснения вопроса, когда и где происходит изменение
программных переменных, а также для установки контрольных точек в исполняеb
мом коде, размещенном в памяти "только для чтения". Одновременно может быть
установлено не более 4 таких прерываний, так как процессоры x86 содержать тольb
ко 4 необходимых отладочных регистра.
Команда BPM имеет следующий синтаксис:
BPM[B|W|D]   [R|W|RW|X] [  -  ]
[IF
] [DO “1;2;…”]
BPM и BPMB
Прерывание по обращению к байту по указанb
ному адресу.
BPMW
Прерывание по обращению к слову.
BPMD
Прерывание по обращению к двойному слову.
R, W и RW
Прерывание по чтению, записи или по чтению
и записи.
X
Прерывание по исполнению указанного адреса.
Это более мощная команда, чем BPX, так как в
этом случае в памяти не делается какихbлибо
изменений, что позволяет устанавливать преb
рывание в памяти "только для чтения" или по
адресам, которые еще недоступны.
  - 
Указывает, какой регистр необходимо испольb
зовать для работы команды. Как правило, в
этом нет необходимости, так как SoftICE самоb
стоятельно находит свободный регистр.
IF

Подробности смотрите в разделе "Условные
прерывания" на странице 91.
DO “1;2;…” Подробности смотрите в разделе "Задание дей
ствия при прерывании" на странице 90.
Пример:
Ниже приведена команда установки прерывания по записи значеb
ния "5" в переменную размером двойное слово с именем
MyGlobalVariable.
BPMD MyGlobalVariable W IF MyGlobalVariable==5
Имейте в виду, что если обращение к указанному адресу происхоb
дит достаточно часто, то производительность системы может знаb
чительно снизится, даже несмотря на то, что выражение может
иметь результатом FALSE (Ложь).

Типы контрольных точек, поддерживаемых SoftICE

87

Контрольные точки на прерываниях
Контрольные точки на прерывании используются для перехвата прерывания с
использованием IDT. Контрольная точка срабатывает только в том случае, когда
прерывание передается через IDT.
Для установки контрольной точки используется команда BPINT:
BPINT  - 
 [IF
] [DO “1;2;…”]
 - 

Число в диапазоне от 0 до 255 (от 0 до 0FFh).
IF

Подробности смотрите в разделе "Условные
прерывания" на странице 91.
DO “1;2;…” Подробности смотрите в разделе "Задание дей
ствия при прерывании" на странице 90.
Если возникает программное прерывание, вызываемое инструкцией INT, то в
окне кодов показывается эта команда. (SoftICE активизируется по достижению
команды INT, на номер которой установлена контрольная точка, но до ее фактичеb
ского исполнения.) В противном случае текущей командой будет первая инструкb
ция обработчика прерывания. Список всех прерываний и их обработчики можно
получить с помощью команды SoftICE IDT.
Пример:
Следующая команда задает прерывание по обращению к програмb
ме ядра NtCreateProcess из пользовательского режима.
BPINT 2E IF EAX==1E
Замечание:
Программа NtCreateProcess обычно вызывается из
ZwCreateProcess в NTDLL.DLL, которая в свою очередь вызывается
из CreateProcessW KERNEL32.DLL. В условном выражении значеb
ние 1Eh соответствует номеру сервиса NtCreateProcess. Для полуb
чения этого значения можно использовать команду NTCALL.
Команду BPINT можно использовать для перехвата программных прерываний, наb
пример, прерывания INT 21h, вызываемого программами Windows. Обратите внимаb
ние на то, что программные прерывания в режиме V86 не проходят через векторы IDT.
В данном режиме инструкции INT вызывают генерацию общей ошибки защиты (GPF),
которая передается через вектор 0Dh IDT. Обработчик GPF операционной системы
определяет причину ошибки и передает управление обработчику, определенному для
конкретного типа прерывания V86. Иногда обработка такого прерывания может проb
должиться передачей управления обратно в виртуальную машина V86 с вызовом необb
ходимого обработчика через таблицу векторов прерывания виртуального режима
(Interrupt Vector Table — IVT). В некоторых случаях прерывание реального режима
отображается (эмулируется) с помощью вектора прерываний реального режима.
В тех случаях, когда прерывание эмулируется, его можно перехватить, устаноb
вив командой BPX контрольную точку на начало обработчика прерывания реальноb
го режима.
Пример:
Для установки контрольной точки на обработчик прерывания реb
ального режима INT 21h используется следующая команда:
BPX *($0:(21*4))

Прерывания на ввод/вывод
Прерывания на ввод/вывод позволяют отслеживать операции чтения или записи
по заданному адресу порта. Прерывание перехватывает обращение к порту команд
IN или OUT. SoftICE обрабатывает этот тип контрольных точек с использованием
специального расширения отладочных регистров, введенного в процессоры Pentium.
Следовательно, для установки такого прерывание необходимо наличие в компьютере

88

7. Использование прерываний

процессора класса Pentium или Pentium Pro. Одновременно на ввод/вывод может
быть установлено до 4 контрольных точек. Прерывания могут быть обработаны как
на уровне ядра (кольцо 0), так и в режиме пользователя (кольцо 3).
Замечание: SoftICE под управлением Windows 95 полагается на битовую карту
разрешения ввода/вывода, которая ограничивает возможности пеb
рехвата операций ввода/вывода кольцом 3.
Использовать контрольные точки ввода/вывода для перехвата коb
манд IN/OUT в программах MSbDOS невозможно. Эти команды пеb
рехватываются и, в последующем, эмулируются операционной сисb
темой и, следовательно, реальные обращения к портам ввода/вывода
могут не полностью соответствовать исходным командам.
Команда BPIO имеет следующий синтаксис:
BPIO _\[-Z[ [R|W|RW]
[IF ie[k_d] [DO “\_a1;\_a2;…”]
R, W и RW
Прерывание по чтению из порта (команда IN),
записи в порт (команда OUT) или по любой из
них.
IF

Подробности смотрите в разделе "Условные
прерывания" на странице 91.
DO “1;2;…” Подробности смотрите в разделе "Задание дей
ствия при прерывании" на странице 90.
Когда происходит прерывание по вводу/выводу, и активизируется SoftICE, теb
кущей командой оказывается инструкция, следующая за командой IN или OUT,
вызвавшей прерывание. В отличии от команды BPM в данном случае невозможно
установить размер передаваемых данных; любое обращение к заданному порту
приводит к генерации прерывания независимо от того, передается байт, слово или
двойное слово. Кроме того, любые операции, перекрывающие указанный номер
порта, также приводят к генерации прерывания. Например, если Вы установили
контрольную точку на обращение к порту 2FFh, то передача слова через порт с ноb
мером 2FEh также приведет к активизации SoftICE.
Пример:
Приведена установка прерывания на чтение из порта с номером
3FEh значения, у которого установлены два старших бита.
BPIO 3FE R IF (AL & C0)==C0
Проверка условия происходит после завершения операции ввоb
да/вывода. Значение будет находиться в регистрах AL, AX или
EAX, так как все операции ввода/вывода через порты за исключеb
нием строчных команд вводы/вывода (которые, однако, применяb
ются редко) используют регистр EAX.

Прерывания на сообщения Windows
Контрольные точки на сообщениях Windows устанавливаются для перехвата опb
ределенного сообщения или сообщений из заданного диапазона, передаваемого проb
цедуре окна. Хотя данный тип прерываний может быть установлен с использованиb
ем условной команды BPX, однако, задавать его командой BMGS значительно проще.
BMSG    - [L]
[1-#$- % [ -#$- %]]
[IF
] [DO “1;2;…”]
   -
Значение, возвращаемое при создании окна;
для получения полного списка всех окон и их
дескрипторов может быть использована команb
да HWND.

Понятие о контексте прерывания

89

L

Параметр указывает, чтобы сообщение было
просто отображено в окне команд без активиb
зации SoftICE.
1-#$- %
Единственное сообщение или нижнее значения
диапазона сообщений Windows. Если диапазон
сообщений не задается, то данный параметр
указывает именно то сообщение, передачу коb
торого необходимо зафиксировать.
Как для первого, так и для последнего сообщеb
ния их значения могут быть заданы либо шестb
надцатеричными числами, либо действительныb
ми именами сообщений, например, WM_QUIT.
-#$
Старшее значение для диапазона сообщений.
IF

Подробности смотрите в разделе "Условные
прерывания" на странице 91.
DO “1;2;…” Подробности смотрите в разделе "Задание дей
ствия при прерывании" на странице 90.
При задании сообщения (или диапазона сообщений) можно использовать их
символические имена, например, WM_NCPAINT. С помощью команды WMSG (без
параметров) можно получить список всех имен сообщений, который SoftICE пониb
мает. Если сообщение (или диапазон сообщений) не заданы, то прерывания устаb
навливаются на все сообщений Windows.
Пример:
Для установки прерывания на сообщения окна с дескриптором
1001E необходимо задать следующую команду.
BMSG 1001E WM_NCPAINT
SoftICE достаточно разумен, чтобы принимать во внимание адресb
ный контекст процесса, который владеет данным окном, поэтому
при использовании команды BMSG об этом можно не беспокоитьb
ся.
С помощью команды BPX и условных выражений можно сконстb
руировать эквивалент команды BMSG. Используя команду HWND
можно получить адрес процедуры окна, а затем командой BPX усb
тановить на нее контрольную точку (только для Win32).
BPX 5FEBDD12 IF (esp->8)==WM_NCPAINT
Внимание: Если при установке контрольной точки используются действительb
ные адреса (а не символические имена), чрезвычайно важно укаb
зать правильный адресный контекст.

Понятие о контексте прерывания
Контекст прерывания состоит из адресного контекста, в котором была установb
лена данная контрольная точка, а также в каком модуле это прерывание срабатыb
вает. Понятие контекста прерывания применимо к командам BPX и BPM, а также к
контрольным точкам, установленным такими командами, как BMSG.
Для приложений Win32 контрольные точки, установленные в 2 верхних гигаb
байтах памяти, являются глобальными, и прерывания по ним происходят в любом
контексте. Контрольные точки, установленные в 2 нижних гигабайтах памяти, явb
ляются контекстноbзависимыми, они срабатывают лишь при выполнении следуюb
щих условий:
 SoftICE активизируется лишь в том случае, если адресный контекст совпадает
с контекстом, в котором данная контрольная точка была установлена.

90

7. Использование прерываний


Если прерывание срабатывает в том же модуле, к котором оно было установb
лено, то SoftICE активизируется, игнорируя адресный контекст. Это означаb
ет, что контрольная точка, установленная в разделяемом модуле (например,
KERNEL32.DLL), будет срабатывать при любом адресном контексте, в котоb
рый данный модуль загружен, независимо от того, каким он был в момент ее
установки.
Исключения из этого правила возникают лишь тогда, когда другой процесс
отображает данный модуль по иному базовому адресу, чем он был в момент
установки контрольной точки. В этом случае прерывания не возникнет. Чтоb
бы избежать этого, базируйте Ваши модули по стандартным "не конфликтb
ным" адресам.
Прерывания, установленные в MSbDOS и 16bбитных Windows программах, так же
являются контекстноbзависимыми, что означает срабатывание прерывания лишь в
том процессе NTVDM, в котором оно было установлено. Исключений не бывает даb
же для тех случаев, когда одна и та же программа запускается несколько раз.
Контекст прерывания более важен для контрольных точек, установленных коb
мандами BPM, чем BPX, так как они являются аппаратными прерывания по опредеb
ленному виртуальному адресу. Механизм аппаратных прерываний ничего не знает
об адресном пространстве, и возможны ситуации, когда он активизируется в несоb
ответствующем участке кода или данных. Именно контекст прерываний позволяет
отладчику SoftICE различать фальшивые и действительные срабатывания конb
трольных точек.

Виртуальные контрольные точки
Используя SoftICE, Вы можете устанавливать контрольные точки в модулях еще
до их загрузки в память, так же как нет необходимости, чтобы при установке
BPXbпрерывания (инструкция INT 3) страница была загружена в физическую паb
мять. Такие контрольные точки называются виртуальными, фактически они устаb
навливаются автоматически в момент загрузки модуля или, когда страница окажетb
ся физически доступной. Виртуальные прерывания могут быть установлены лишь
с помощью символических имен или по строкам в исходных кодах.

Задание действий при прерывании
Вы можете заставить SoftICE выполнить некоторую последовательность дейстb
вий при срабатывании контрольной точки. Эта последовательность задается параb
метром "DO", который существует у всех типов прерываний:
DO “1;2;…”
Тело параметра представляет собой список команд SoftICE или макрокоманд,
разделенных точкой с запятой. Последнюю команду завершать точкой с запятой
необязательно.
Действие при прерывании тесно связано с понятием макрокоманды. Более
подробную информацию о макрокомандах можно найти в разделе "Работа с по
стоянными макрокомандами" на странице 125. Фактически сама последовательb
ность действий при прерывании является неименованной макрокомандой, которая
не может получать аргументы командной строки. Подобно макрокомандам, сама
эта последовательность может содержать и другие макрокоманды, ведь изначально
они разрабатывались именно для задания сложной последовательности команд при
возникновении прерывания.
Если в тело макрокоманды (или в последовательность действий при прерываb
нии) необходимо вставить символ двойной кавычки (") или знак процента (%), то их

Условные прерывания

91

необходимо предварить обратной косой чертой (\). Сам же символ обратной косой
черты задается последовательностью двух таких знаков (\\).
Если производится протоколирование контрольных точек (подробнее смотри
описание встроенной функции BPLOG на странице 94), то заданная последовательb
ность действий не выполняется.
Ниже приведены примеры задания наиболее употребительных действий:
BPX EIP DO “dd eax”
BPX EIP DO “data 1;dd eax”
BPMB dataaddr if (byte(*dataaddr)==1) do “? IRQL”

Условные прерывания
Условные прерывания представляют собой быстрый и удобный способ выявлеb
ния особых условий или состояния операционный системы или отлаживаемого
приложения. При задании условного выражения в контрольной точке SoftICE акb
тивизируется только тогда, когда это выражение имеет ненулевой результат (TRUE,
Истина). Так как вычислитель SoftICE позволяет обрабатывать любые сложные
выражения, Вы легко можете выявить требуемую Вам ситуацию.
Все команды прерывания SoftICE допускают использование условных выражеb
ний со следующим синтаксисом:
- 
 [   - 
]
[IF
] [DO “ ”]
Ключевое слово "IF" (Если) сопровождается выражением, которое должно быть
вычислено при достижении данной контрольной точки. Контрольная точка будет
проигнорирована, если результат этого выражения окажется равен нулю (FALSE
или Ложь). Когда же результатом выражения является TRUE (ненулевой резульb
тат), SoftICE активизируется и показывает причину возникновения прерывания, в
данном случае команду, включающую в себя и условное выражение.
Приведенные ниже примеры демонстрируют условные выражения, используеb
мые при отладке.
Замечание: Большинство примеров содержат системные переменные, значеb
ния которых могут различаться в зависимости от версии операциb
онной системы.
 Отслеживание активизации потока:
bpx ntoskrnl!SwapContext IF (edi==0xFF8B4020)


Отслеживание выключение потока:
bpx ntoskrnl!SwapContext IF (esi==0xFF8B4020)



Отслеживание создания объекта CSRSS "HWND" (1 тип):
bpx winsrv!HMAllocObject IF (esp->c == 1)



Отслеживание уничтожения информационного объекта потока (6 тип CSRSS):
bpx winsrv!HMFreeObject+0x25 IF (byte(esi->8) == 6)



Отслеживание создание таблицы дескрипторов объектов процесса:
bpx ntoskrnl!ExAllocatePoolWithTag IF (esp->c == ‘Obtb’)



Отслеживание завершения потока (enum == 4):
bpmb _thread->29 IF (byte(_thread->29) == 4)



Отслеживание освобождения блока кучи (230CD8):
bpx ntddl!RtlFreeHeap IF (esp->c == 230CD8)



Отслеживание ситуации, когда процесс делает системный вызов:
bpint 2E if (process == _process)

92

7. Использование прерываний

Во многих примерах используются функции потоков и процессов, встроенные в
SoftICE. Эти функции предоставляют ссылки на активный поток или процесс опеb
рационной системы. В некоторых примерах имя функции предваряется символом
подчеркивания "_". Этот специальный знак позволяет ссылаться на динамические
переменные, такие как содержимое регистров или текущий поток или процесс как
на константу. Следующие примеры должны помочь Вам уяснить эту возможность:
 Показанное ниже условное прерывание срабатывает, когда динамическое (в
момент исполнения программы) содержимое регистра EAX равно его значеb
нию на момент установки прерывания.
bpx eip IF (eax == _eax)
Эта команда соответствует последовательности:
? EAX
00010022
bpx eip IF (eax == 10022)


Условное прерывание из следующего примера сработает, когда идентификаb
тор потока, исполняющегося в этот момент, совпадет с идентификатором теb
кущего потока на момент установки прерывания.
bpx eip IF (tid == _tid)
Эта команда соответствует последовательности:
? tid
8
bpx eip IF (tid == 8)

Если Вы в выражении предварите имя какойbлибо функции или регистра симb
волом подчеркивания ("_"), то значение этой функции будет вычислено и останется
постоянным на протяжении всего времени существования данного выражения.

Функции статистики условных прерываний
SoftICE предоставляет возможность наблюдать и управлять контрольными точb
ками на основании того, сколько раз то или иное прерывание срабатывало или, наb
оборот, было пропущено. Для этого в условных выражениях используются слеb
дующие встроенные функции:
 BPCOUNT
 BPMISS
 BPTOTAL
 BPLOG
 BPINDEX
BPCOUNT
Функция BPCOUNT возвращает количество случаев, когда выражение в данном
условном прерывании было равно TRUE. Каждый раз при попадании в контрольb
ную точку вычисляется заданное в ней условное выражение (если оно существует),
и, если его результатом будет TRUE, счетчик исполнений (BPCOUNT) увеличиваетb
ся на 1. Если же условное выражение равно FALSE, то на 1 увеличивается счетчик
"промахов" (BPMISS).
Пример:
На пятое исполнение прерывания счетчик BPCOUNT окажется
равным 5, поэтому условное выражение равно TRUE, и будет актиb
визирован SoftICE.
bpx myaddr IF (bpcount==5)

Условные прерывания

93

Функцию BPCOUNT следует использовать только в крайней правой части соb
ставных условных выражений, чтобы правильно происходило изменение счетчика:
bpx myaddr if (eax==1) && (bpcount==5)
В соответствии с алгоритмом работы вычислителя SoftICE, если EAX не равно 1,
то подвыражение 'BPCOUNT==5' вычисляться не будет. (Аналогичным образом выb
числяются логические выражения в языке C.) А к тому моменту, когда потребуется
определить результат 'BPCOUNT==5', вычисленная часть выражения окажется равb
ной TRUE, счетчик BPCOUNT будет увеличен и, если окажется, что он стал равb
ным 5, значение всего выражения станет TRUE, и произойдет активизировизация
SoftICE. Если же BPCOUNT окажется неравным 5, общий результат будет FALSE,
увеличится счетчик BPMISS, а SoftICE активизирован не будет.
Как только общий результат всего выражение оказывается равен TRUE, происхоb
дит активизация SoftICE, а оба счетчика (и BPCOUNT, и BPMISS) сбрасываются в 0.
Замечание: Не используйте проверку счетчика BPCOUNT в начале условного
выражения, в противном случае изменения счетчика будут произb
водиться неправильно.
bpx myaddr if (bpcount==5) && (eax==1)
BPMISS
Значением функции BPMISS является количество попаданий на контрольную
точку, когда результат ее условного выражения оказывался равным FALSE.
Исполнение данной функции подобно функции BPCOUNT. Она используется
для активизации SoftICE в тех случаях, когда в течение нескольких раз результатом
условного выражения оказывается FALSE. При этом значение BPMISS всегда будет
на 1 меньше, чем Вы ожидаете, так как оно не изменяется до окончания вычислеb
ния всего выражения. Чтобы скорректировать данную "задержку" обновления,
следует применять оператор ">=" (больше или равно).
bpx myaddr if (eax==43) || (bpmiss>=5)
Пример:
Вследствие алгоритма работы вычислителя SoftICE, если результат
подвыражения 'EAX==43' равен TRUE, то и все условное выражение
равно TRUE, и SoftICE будет активизирован. В противном случае
счетчик BPMISS обновляется всякий раз, когда результат равен
FALSE. После серии из 5 безуспешных попаданий в контрольную
точку подряд, выражение станет равным TRUE, и появится окно
SoftICE.
BPTOTAL
Значением функции BPTOTAL является общее количество выполнения данного
прерывания.
Эта функция используется для определения состояния, в котором SoftICE будет акb
тивизирован. Значением функции является общее количество попаданий в данную
контрольную точку за все время ее существования (смотри поле "Hits" (Попадание) в
результатах, выводимых командой BSTAT). Этот счетчик никогда не сбрасывается.
Пример:
В первые 50 исполнений контрольной точки, показанной ниже, реb
зультатом условного выражения будет FALSE, и SoftICE не активиb
зируется. Во все последующие попадания будет происходить актиb
визация отладчика, так как результат окажется равен TRUE.
bpx myaddr if (bptotal > 50)

94

7. Использование прерываний

Используя функцию BPTOTAL, можно составить выражение, соответствующее
действию функции BPCOUNT. Для этого используется деление по модулю:
if (!(bptotal%COUNT))
Константа COUNT определяет частоту, с которой будет происходить срабатыb
вание данного прерывания. Так, если COUNT, например, равен 4, то SoftICE будет
активизироваться на каждое 4 попадание в данную контрольную точку.
BPLOG
Функция BPLOG используется для записи события прерывания в протокол
SoftICE. Сам отладчик при этом не активизируется.
Замечание: Так как действия, заданные в команде контрольной точки, выполb
няются только при активизации SoftICE, то использовать команду
"DO" совместно с функцией BPLOG смысла не имеет.
Значением функции BPLOG всегда является TRUE. Это заставляет SoftICE сдеb
лать запись в о данном прерывании в протоколе работы.
Пример:
Каждый раз, когда происходит попадание в данную контрольную
точку, и значение регистра EAX при этом равно 1, отладчик делает в
протоколе запись об этом событии. Окно SoftICE при этом на экраb
не монитора не появляется.
bpx myaddr if ((eax==1) && bplog)
BPINDEX
Функция BPINDEX используется для получения индекса контрольной точки для
передачи его в параметр "DO".
Эта функция возвращает индекс контрольной точки, вызвавшей активизацию
SoftICE. Это тот же самый индекс, который используется командами BL, BC, BD,
BE, BPE, BPT и BSTAT. Вы можете использовать его в качестве параметра при задаb
нии этих функций в "DO"bпоследовательности.
Пример:
Следующий пример демонстрирует использование команды BSTAT
для выдачи статистики о контрольной точке:
bpx myaddr do “bstat bpindex”
Другой пример показывает контрольную точку, которая создает
другую контрольную точку:
bpx myaddr
do “t;bpx @esp if(tid==_tid) do \“bc bpindex\”;g”
Замечание: Функция BPINDEX предполагает, что она будет использована в заb
дании последовательности действий, и вызывает ошибку, когда ее
используют в условном выражении. Тем не менее, ее использоваb
ние вне последовательности действий допустимо, однако, ее значеb
ние в данном случае не определено, и на него не следует полагаться.

Использование локальных переменных в условных выражениях
SoftICE разрешает Вам использовать имена локальных переменных в условных
выражениях исполняемых контрольных точек (BPX или BPM X). В других типах
контрольных точек (таких как BPIO или BPMD RW) локальные символы не распоb
знаются, так они требуют определенной области действия. Эти типы прерываний
не привязаны к определенному участку исполняемого кода, поэтому локальные пеb
ременных в них не имеют смысла.

Условные прерывания

95

Использование локальных переменных возможно, когда функция имеет пролог,
где они создаются, и эпилог, где происходит их уничтожение. Локальные переменb
ные доступны с момента завершения кода пролога и до начала исполнения кода
эпилога. Использование символьных имен параметров функции во время исполнеb
ния пролога и эпилога также невозможно, так как в эти моменты происходит корb
ректировка кадра стека.
Чтобы избежать этих ситуаций, устанавливайте прерывания на первую, либо на
последнюю строки исходного текста тела функции. В следующем примере в качеb
стве примера приводится функция "foobar".
Foobar Function
1:DWORD foobar ( DWORD foo )
2:{
3: DWORD fooTmp=0;
4:
5: if(foo)
6: {
7: fooTmp=foo*2;
8: }else{
9: fooTmp=1;
10: }
11:
12: return fooTmp;
13:}
1 и 2 строки лежат вне тела функции. В этих строках происходит исполнение
пролога. Если Вы будете использовать в этих точках имя локальной переменной, то
получите сообщение об ошибке:
:BPX foobar if (foo==1)
error: Undefined Symbol (foo)
Ставьте контрольную точку на строке 3, где декларируется и инициируется лоb
кальная переменная "fooTmp":
:BPX .3 if (foo==0)
Строка 13 исходного текста содержит закрывающую скобку тела функции. Здесь
также начинается исполнение кода эпилога, следовательно в данной точке и локальb
ные переменные, и параметры находятся вне области видимости. Чтобы установить
условное прерывание на окончание функции "foobar", используйте строку 12:
:BPX .12 if (fooTmp==1)
Замечание: Хотя использование локальных переменных в качестве параметра
команды прерывания BPMD RW и не запрещено, этого следует избеb
гать. Локальные переменные указываются относительно стека, и их
абсолютные адреса меняются во время каждого вызова функции.
После окончания первого исполнения функции, когда контрольная
точка была установлена, адрес, к которому она оказалась привязана,
больше не будет ссылаться на требуемую локальную переменную.

Использование стека в условных выражениях
Если Вы отлаживаете собственное приложение с полной отладочной информаb
цией, то Вы можете обращаться к параметрам функций и локальным переменным
через их символьные имена, как это описано в разделе "Использование локальных
переменных в условных выражениях" на странице 94. Однако, если Вы проводите
отладку без отладочной информации, например, если Вы транслировали модуль

96

7. Использование прерываний

только с общими (public) символами, или хотите изучать работу функции операциb
онной системы, то Вам придется ссылаться на параметры и локальные переменные
через указатели стека.
В данном разделе рассматривается адресация в 32bбитной непрерывной (flat)
модели памяти.
Параметры функции передаются через стек, следовательно, для обращения к
ним Вам необходимы регистры ESP или EBP. Что именно Вы будете использовать,
зависит от пролога функции, и того, в какой точке функции (относительно пролога)
Вы собираетесь устанавливать прерывание.
Большинство 32bбитных функций имеют следующий пролог:
PUSH EBP
MOV EBP, ESP
SUB ESP, size ( % -#- &-   &)
Данный пролог размещает в стеке информацию следующим образом:
Вершина стека
Параметр #n

ESP+(n*4) или
EBP+(n*4)+4

Параметр #2

ESP+0x8 или EBP+0xC+4 программой

Параметр #1

ESP+4 или EBP+8

Адрес возврата

Устанавливаются
вызывающей

PUSH EBP;
MOV EBP,ESP
4 == 1001E)
Замечание: Выражение esp->4 является сокращением для *(esp+4)

Операторы
SoftICE поддерживает следующие типы операторов:
Операторы адресации Примеры



b>

ebpb>8 (двойное слово, адресованное ebp+8)

.

eax.1C (двойное слово, адресованное eax+1c)

*

*eax (значение двойного слова по адресу eax)

@

@eax (значение двойного слова по адресу eax)

Нагляднее было бы: ebpO>8 результат — Dword
*(ebpO>8)
— Dword по адресу (ebpb>8)

Выражения

101

Математические
операторы
Примеры
унарный +
унарный 
+

*
/
%
деление по модулю
> логический
сдвиг влево

+42 (десятичное)
42 (десятичное)
eax + 1
ebp  4
ebx * 4
Symbol / 2
eax % 3
bl > 2
(результат: eax, сдвинутый вправо на 2 бита)

Побитовые операторы

Примеры

&
|
^
~

побитовое AND
побитовое OR
побитовое XOR
побитовое NOT

eax & F7
Symbol | 4
ebx ^ 0xFF
~dx

Логические операторы

Примеры

!
&&
||
==
!=
<
>
=

!eax
eax && ebx
eax || ebx
Symbol == 4
Symbol != al
ax < 7
bx > cx
ebx = Symbol

логическое NOT
логическое AND
логическое OR
равно
не равно

Специальные операторы Примеры
.

номер строки

(, ) группирующие
скобки
,
список аргументов
:
оператор сегмента
имяbфункции
# селектор
защищенного режима
$ сегмент реального
режима

.123 (значением является адрес 123 строки
текущего файла с исходным текстом)
(eax+3) * 4
function(eax, ebx)
es : ebx
word(Symbol)
#es:ebx (адрес типа селектор:смещение
в защищенном режиме)
$es:di (адрес типа сегмент:смещение
в реальном режиме)

102

8. Использование выражений

Приоритет операторов
Приоритет операторов при вычислении выражений в SoftICE соответствует
правилам языка С, дополненным несколькими специфическими для SoftICE операb
торами. Приоритет играет при вычислениях ключевую роль, поэтому то, как опеb
раторы располагаются в выражении, может оказать существенное влияние на его
конечный результат. Для того, чтобы изменить последовательность выполнения
операторов, необходимо использовать круглые скобки.
Пример:
В предыдущих версиях SoftICE оператор сложения (+) и оператор
умножения (*) имели одинаковые приоритеты, поэтому результатом
выражения ‘3+4*5’ было число 35. В новых версий оператору умноb
жения присвоен более высокий приоритет, поэтому результатом выb
ражения ‘3+4*5’, эквивалентного по обычным правилам арифметики
‘3+(4*5)’, является число 23. Для получения прежнего результата (35)
необходимо воспользоваться скобками, чтобы заставить вычислиb
тель сначала выполнить оператор сложения: ‘(3+4)*5’.
В следующей таблице перечислены все операторы в порядке уменьшения приb
оритета. Операторы, имеющие одинаковые приоритет, выполняются в соответстb
вии правилами порядка.
Оператор

Порядок

(, ), имяbфункции

Комментарий
скобки, функции

b>, .

слева b направо

адресация

:

слева b направо

селектор : смещение

#, $

справа b налево

переопределение селектора (сегмента)

*, @,

справа b налево

адресация

унарный +

по умолчанию b десятичное основание

унарный 

по умолчанию b десятичное основание

!,~
.

номер строки

*, /, %

слева b направо

+, b

слева b направо

слева b направо

=

слева b направо

==, !=

слева b направо

&

слева b направо

^

слева b направо

|

слева b направо

&&

слева b направо

||

слева b направо

, (запятая)

слева b направо

список аргументов

Выражения

103

Составные части выражений
SoftICE использует разнообразные операнды, такие, например, как идентифиb
каторы и числа, которые можно свободно комбинировать с любыми операторами
SoftICE. При этом акцент делается на обеспечении гибкости составления выражеb
ний, чтобы сделать его более естественным.
Совет:
Результат любого выражения может быть получен с помощью коb
манды '?' (вопросительный знак).
Числовые константы
SoftICE допускает использование следующих видов численных констант:
Ввод

Описание

Шестнадцатеb Шестнадцатеричная система является для SoftICE основной
системой счисления при вводе и выводе значений. Допустиb
ричные
мым набором символов для шестнадцатеричных чисел являb
ются [0b9, AbF]. Шестнадцатеричному числу может предшеb
ствовать стандартный для языка С префикс ‘0x’. Допустимыb
ми примерами шестнадцатеричных чисел являются:
FF, ABC, 0x123, 0xFFFF0000
Символьная форма ввода шестнадцатеричных чисел может,
однако, конфликтовать с идентификаторами. Например,
ABC. В этом случае использование префикса ‘0x’ может убеb
речь от ошибочной интерпретации чисел в качестве символьb
ных имен.
Десятичные

Для временного изменения основания системы счисления с
шестнадцатеричной на десятичную SoftICE использует унарb
ные операторы ‘+‘ и ‘b‘. Это основано на том факте, что шеb
стнадцатеричные числа со знаком, например, +FF или bABC
выглядят достаточно неестественно, хотя и являются матемаb
тически допустимыми (равняясь, соответственно, 255 и b
2748). Если Вы перед числом укажите унарные ‘+‘ или ‘b‘, то
SoftICE попытается вычислить его как десятичное, и лишь заb
тем, если это не удастся, как шестнадцатеричное.
Следующие примеры демонстрируют, как использование
унарных операторов ‘+‘ и ‘b‘ влияет на интерпретацию осноb
вания системы счисления:
 ? +42
0000002A 0000000042 "*"
 ? -42
FFFFFFD6 4294967254 (-42) "cccq"
 ? -1a
FFFFFFE6 4294967270 (-26) "ccck"
 ? +ff
000000FF 0000000255 "c"
 ? +(12)
00000012 0000000018 "·"
Замечание: Оператор номера строки SoftICE (.) также измеb
няет основание счисления на десятичное. Оператор
‘унарный +’, за исключением изменения системы счисления,
иного влияния на вычисление выражения не оказывает.

104

8. Использование выражений
Символьные константы

SoftICE поддерживает использование стандартных для языка С символьные
констант, таких как '\b', 'ABCD', или '\x23'. Основанием системы счисления для
символьных констант, начинающихся с обратной косой черты ‘\’, является десяb
тичная система. Для того, чтобы задать шестнадцатеричную константу, необходиb
мо использовать префикс ‘x’, например, ‘\x23’.
Регистры
SoftICE поддерживает стандартные имена набора регистров процессоров x86
фирмы Intel.
AH
CS
EBX
FL

Совет:

AL

CX

ECX

FS

AX

DH

EDI

GS

BH

DI

EDX

IP

BL

DL

EFL

SI

BP

DS

EIP

SP

BX

DX

ES

SS

CH

EAX

ESI

CL
EBP
ESP
Для доступа к отдельным флагам флаговых регистров EFL и FL
можно использовать встроенные функции SoftICE. Смотрите разb
дел "Встроенные функции" на странице 105.

Идентификаторы
Идентификаторы служат для символьного представления адресов или значений.
Они могут встречаться во множестве форм, например в таблицах переменных, табb
лицах экспорта или во встроенных функциях.
Идентификаторы, за некоторыми исключениями, сделанными для некоторых
языков, например, ассемблера и C++, строятся по правилам языка С. Допустимые
имена начинаются с символов ‘at’ (@), подчеркивания (_) или букв латинского алфаb
вита от A до Z и представляют собой непрерывную цепочку из букв (от A до Z), цифр
(от 0 до 9) или других допустимых символов, таких как, например, подчеркивание (_).
Совет:
Идентификаторы для языка C++ могут включать в себя оператор
разрешения области видимости (::), когда идентификатор представb
ляется в виде класс::членbкласса.
Когда идентификаторы загружены в SoftICE, они размещаются в таблицах симb
волов, причем идентификаторы разных исполняемых модулей размещены в разb
ных таблицах, поэтому SoftICE не сможет обнаружить идентификатор, если он наb
ходится в неактивной в данный момент таблице. Смотрите команду TABLE в "Спра
вочнике по командам SoftICE".
Совет:
Это не относится к таблицам экспорта, так как SoftICE рассматриваb
ет все экспортируемые имена как однородное целое, в то время как
таблицы идентификаторов используются независимо друг от друга.
Указатель таблицы идентификаторов может предшествовать самому символиb
ческому имени, что позволяет использовать идентификаторы из разных таблиц в
одном выражении. Идентификаторы и имена их таблицы разделяются восклицаb
тельным знаком (!), например:
-#' !

Выражения

105

Встроенные функции
SoftICE предоставляет пользователю ряд собственных функций. Они обеспечиb
вают доступ к статическим и динамическим переменным операционной системы
или к собственным переменным SoftICE; некоторые из этих функций могут быть
использованы для изменения значений или для преобразования типов данных.
Использование функций, не требующих аргументов, сходно с применением
обычных идентификаторов из таблиц символов. Функции с аргументами по своему
виду и поведению схожи с функциями языка С:
-'( -  )
Замечание: В пределах одной таблицы символов или экспорта имена идентиb
фикаторов имеют более высокий приоритет по сравнению с имеb
нами функций и замещают их в выражениях.
В следующей таблице представлены функции, определенные в SoftICE:
Имя функции
Byte

Возвращает младший байт

Пример
? Byte(0x1234) = 0x34

Word

Возвращает младшее слово

? Word(0x12345678) = 0x5678

Dword

Возвращает двойное слово

? Dword(0xFF) = 0x000000FF

HiByte

Возвращает старший байт

? HiByte(0x1234) = 0x12

HiWord

Возвращает старшее слово

Sword

Преобразует байт
в слово со знаком

? HiWord(0x12345678)
= 0x1234
? Sword(0x80) = 0xFF80

Long

Преобразует байт или слово в
длинное целое со знаком

? Long(0xFF) = 0xFFFFFFFF
? Long(0xFFFF) = 0xFFFFFFFF

WSTR

Показать как строку
в UNICODE

? WSTR(eax)

Flat

Преобразовать адрес на базе
селектора в линейный адрес
(непрерывная (flat) модель
адресации).

? Flat(fs:0) = 0xFFDFF000

CFL

Флаг переноса

? CFL =  -

PFL

Флаг четности

? PFL =  -

AFL

Флаг
вспомогательного переноса

? AFL =  -

ZFL

Флаг нуля

? ZFL =  -

SFL

Знаковый флаг

? SFL =  -

OFL

Флаг переполнения

? OFL =  -

RFL

Флаг возобновления

? RFL =  -

TFL

Флаг трассировки

? TFL =  -

DFL

Флаг направления

? DFL =  -

IFL

Флаг разрешения прерываний ? IFL =  -
? NTFL =  -
Флаг вложенной задачи

NTFL

Описание

Продолжение на следующей странице

106

8. Использование выражений
Имя функции

Описание

Пример
? IOPL = $   
 
/


IOPL

Уровень привилегий
ввода/вывода

VMFL

Флаг режима
виртуального процессора

? VMFL =  -

IRQL

Текущий IRQ для драйверов
Windows NT

? IRQL = #%% -'

DataAddr

Возвращает начальный адрес dd @dataaddr
блока данных, отображаемого
в Окне Данных
Возвращает адрес первой инb ? codeaddr
струкции, отображаемой в
Окне Кода

CodeAddr

Eaddr

Возвращает эффективный
адрес текущей инструкции,
если таковой существует.
Подробнее смотрите в раздеb
ле "Функция Eaddr" на страb
нице 107

Evalue

Возвращает значение по теb
кущему эффективному адреb
су. Подробнее смотрите в
разделе "Функция Evalue" на
странице 108

Process

Блок среды активного проb
цесса операционной системы
(KPEB — Kernel Process
Environment Block)

? process

Thread

Блок среды активного потока
операционной системы
(KTEB — Kernel Thread
Environment Block)

? thread

PID

Идентификатор активного
процесса

? pid == Test32Pid

TID

Идентификатор активного
потока

? tid == Test32MainTid

BPCount

Возвращает количество попаb
даний в контрольную точку,
при которых значение условb
ного выражения было равно
TRUE. Более подробную инb
формацию относительно
BPxxx функций см. в разделе
"Функции статистики услов
ных прерываний" на страниb
це 92

bp <   - >
IF bpcount==0x10

Продолжение на следующей странице

Выражения

107

Имя функции

Описание

Пример
bp <   - >
IF bptotal>0x10

BPTotal

Возвращает общее количестb
во попаданий в контрольную
точку

BPMiss

Возвращает количество попаb
даний в контрольную точку,
при которых условие возникb
новения прерывания не выb
полнялось и SoftICE не был
активизирован

bp <   - >
IF bpmiss==0x20

BPLog

Сохраняет в буфере инфорb
мацию о попадании в конb
трольную точку без выполнеb
ния какихbлибо дополнительb
ных действий

bp <   - >
IF bplog

BPIndex

Возвращает номер текущей
контрольной точки в общем
списке точек прерывания

bp <   - >
DO "bd bpindex"

Функция Eaddr
Функция Eaddr возвращает эффективный адрес, если таковой существует, коb
торый использует текущая инструкция, указанная регистром EIP.
Замечание: Эффективный адрес, если он существует, а также значение по данb
ному адресу высвечиваются в Окне Регистров непосредственно под
значениями флагов.
Процессоры семейства x86 предоставляют различные способы адресации таb
кие, как, например, ’регистр + смещение’ или ’регистр + регистр’. Результат выb
числения адреса памяти называется эффективным адресом. Об инструкции, обb
ращающейся к памяти, говорят, что она использует эффективный адрес источника
или адресата. Команды процессоров x86 никогда не используют эффективные адb
реса одновременно для обращения к источнику и приемнику.
Некоторые инструкции не используют эффективный адрес, так как они обраb
щаются только к регистрам, или потому, что адресация производится специфичеb
ским для данного типа инструкций образом, как, например, у инструкций обращеb
ния к стеку PUSH и POP.
Пример:
Для текущей инструкции:
MOV ECX,[ESP+4]
функция Eaddr возвратит значение равное [ESP]+4, то есть содерb
жимое регистра ESP плюс 4.
Пример:
Текущей инструкцией является:
ADD BYTE PTR [ESI+EBX+2],55
Функция Eaddr возвратит результат сложения содержимого региb
стров ESI, EBX и числа 2.

108

8. Использование выражений
Функция Evalue

Функция Evalue возвращает значение по эффективному адресу текущей инстb
рукции, если таковой для нее существует. При этом результат не обязательно соотb
ветствует ‘Eaddrb>0’, так как функция Evalue чувствительна к размеру операнда.
Она возвращает в качестве результата байт, слово или двойное слово.
Замечание: Эффективный адрес, если он существует, а также значение по данb
ному адресу высвечивается в Окне Регистров непосредственно под
значениями флагов.

Типы выражений
SoftICE использует очень простую систему, которая сводит все типы выражеb
ний к одному из следующих:
Тип

Пример

Литерный тип

1, 0x80000000, 'ABCD'

Регистровый тип

EAX, DS, ESP

Тип ‘идентификатор’

PoolHitTag, IsWindow

Адресный тип

40:17, FS:18, &Symbol

Замечание: Функции, как таковые, типа не имеют, однако они возвращают реb
зультат одного из вышеперечисленных типов.
В большинстве случаев Вы можете игнорировать различия между типами, так
как это важно только для SoftICE. Однако, в случае идентификаторов и адресного
типа имеются некоторые семантические особенности (или ограничения), которые
необходимо понимать.
Идентификаторы используются в качестве символических имен и размещаются в
таблицах экспорта или символов. Как правило, этот тип данных представляет собой
линейный адрес в сегменте кода или данных. Кроме того, этот тип символизирует
содержимое памяти по этому линейному адресу. Это сходно с использованием пеb
ременных в программах на языке С, однако, вследствие того, что SoftICE — это отb
ладчик, а не компилятор, имеются некоторые семантические различия. SoftICE опb
ределяет, что именно Вы имеете в виду — ‘адрес’ или ‘содержимое по адресу’ на осb
новании того, как символ (переменная) используется в выражении. В общем случае,
обращение SoftICE с идентификаторами достаточно естественно (в отличии от языb
ка С); однако, если Вы не уверены в том, каким именно способом SoftICE будет их
интерпретировать в конкретном случае, следует точно указать, что это:
a[ (&Symbol) или a[kd\ Z a[n (*Symbol)
SoftICE обращается с идентификатором, как с адресным типом, если Вы испольb
зуете его в выражении, где применение адресного типа допустимо, и имеет смысл.
В противном случае, SoftICE автоматически использует ‘содержимое’, извлекая его
по тому адресу, который представляет данный идентификатор. Существует мноb
жество операций, в которых недопустимо или не имеет смысла использовать адb
ресный тип, таких, например, как умножение или деление, поэтому большинство
операторов обращаются с идентификаторами подобно языку С и автоматически
извлекают содержимое по адресу, им указанному.
В следующей таблице показано, как SoftICE интерпретирует идентификаторы в
выражениях.

Выражения
Пример

109
Точное
выражение

Symbol
интерпрети[
руется как:

u Symbol

u &Symbol

адрес

db Symbol + 1

db &Symbol + 1

адрес

db Symbol + ds:8000

db *Symbol + ds:8000

содержимое

db Symbol + Symbol2

db &Symbol + *Symbol2

адрес

? Symbol - 1

? &Symbol - 1

адрес

? Symbol - ds:8000

? &Symbol - ds:8000

адрес

? Symbol - Symbol2

? *Symbol - *Symbol2

содержимое

? Symbol && 1

? *Symbol && 1

содержимое

? Symbol && ds:8000

? *Symbol && ds:8000

содержимое

? Symbol && Symbol2

? *Symbol && *Symbol2

содержимое

? Symbol , .] a[
a[ [ : ] bv` dZ
[-, ., &] a[
a[ - a[
Замечание: Это выражение недопустимо,
если селекторы имеют различное содерb
жимое и тип

Пример
&Symbol * 4
ds:80ff ^ &Symbol
ebp->&Symbol2
&Symbol : 8000
- &Symbol,
.&Symbol (_\[ [d)
23:8fff - 23:4ff0
(aZnd\)
1b::0 - 23:0
(_aZnd\)

Замечание: В отличие от идентификаторов SoftICE не может самостоятельно поb
лучать содержимое памяти с помощью адресного типа. Вам необхоb
димо прямо указать это, используя один из операторов адресации.
Адресация содержимого
Существует тонкое различие между парой операторов (b>) и (.) и операторами
(*) и (@). Результатом оператора (b>) или (.) является простое двойное слово, тогда
как результатом (*) и (@) будет адрес.

110

8. Использование выражений

Следующее выражение недопустимо, так как операция умножения для адреса
невозможно:
? (*Symbol)*3
Если вы попытаетесь вычислить это выражение, то получите сообщение об
ошибке: Expecting value, not address (Ожидается значение, а не адрес).
Однако, следующее выражение вполне допустимо, так как результатом
Symbol->0 является значение, а не адрес:
? (Symbol->0)*3
Это различие полезно, когда выполняются многочисленные переадресации в
16bбитном коде, так как адреса содержат в себе информацию о сегменте и смещении.
Размеры операндов
SoftICE обращается со всеми операндами как с двойными словами (длинное
беззнаковое целое). Это означает, что в случае необходимости Вы должны самоb
стоятельно указывать размер операнда, используя операторы приведения типа или
одну из функций преобразования, такую как, например, byte() или word().
Пример:
Если Вы ссылаетесь на содержимое в области памяти, то SoftICE
всегда возвращает значение в виде двойного слова. Чтобы праb
вильно сравнить битовое значение в условном выражении, необхоb
димо замаскировать 24 старших бита, оставив неизмененными
младшие 8 (предположим, что Symbol представляет собой битовое
значение):
BPX EIP IF (Symbol == 32)
Данное условие, скорее всего, не выполнится, так как SoftICE полуb
чит из памяти 32bбитовое значение и сравнит его с двойным слоb
вом 32 или 0x00000032. А это не то, что Вам было нужно. Следуюb
щие выражения выполнят свою задачу правильно.
BPX EIP IF ((Symbol & FF) == 32)
или
BPX EIP IF (byte(Symbol)== 32)
Можно пользоваться любым из выше приведенных способов, они
равноценны.

Приведение типов
SoftICE поддерживает следующие способы приведения типов:
 Способ приведения, подобный языку C++:
Для приведения любого значения к желаемому типу используется следующая
форма:
ИмяТипа (Выражение)
Замечание: ‘ИмяТипа’ является регистрbзависимым, так как для поиска испольb
зуется хеширование, а не линейный поиск.
 Адресация через члены структур или классов:
ИмяТипа (выражение)b>член
После выполнения адресации тип выражения автоматически приводится к
типу члена. Возможна множественная переадресация.
ИмяТипа (выражение)b>членb>членb>член
При каждой последующей переадресации вычисляется значение очередного
члена и применяется приведение типа, затем вычисляется следующий член, и
так до тех пор, пока все выражение не будет вычислено.

Выражения

111



Получение адреса члена или типа:
Можно использовать оператор & (адрес) для получения адреса структуры или
члена структуры.
&ИмяТипа (выражение)b>член[b>член[b>член]]
Это позволит Вам установить контрольную точку на член структуры с помоb
щью оператора ‘BPM’.
 Отображение типизированного выражения:
Когда это возможно, команда ‘? (выражение)’ выводит результат выражения в
соответствии с его типом. Многие типы выражений, подобно регистрам,
имеют свои основные типы.
Для сложных типов происходит распространение типа члена класса или
структуры. При этом распространяется тип только членов корневого уровня.
Заметьте себе, что базовые или виртуальные базовые классы рассматриваютb
ся как корневые объекты.
Пример:
:? LPSTR (*(ebp-30))
char * = 0x009D000C
char = 0x43 , 'C'
Пример:
:? STHashTable (a7bcb0)
class STHashTable = {...}
struct STHashNode ** pHashTable = 0x0089000C
unsigned long bucketSize = 0x25
class GrowableArray * pHashEntries = 0x00A7BCC0

Пример:
:? STHashTable (a7bcb0)->pHashEntries
class GrowableArray * =0x00A7BCC0
unsigned char * arrayBase = 0x00790078
unsigned char * nextItem = 0x00790078
unsigned long memAvail = 0x1000
unsigned long elementSize = 0x10
 Отображение указателя на указатель:
Типом указателя на указатель является значение, на которое ссылается поb
следний:
typedef LPSTR *LPLPSTR;
? LPLPSTR (eax)
char **eax = 0x127894
где 0x127894 представляет собой значение указателя, а является
значением, которое размещено данному (0x127894) адресу.
 Отображение строк в Unicode:
Для отображения строк в Unicode используется оператор приведения WSTR:
? WSTR (eax)
short *eax =

Исчисление идентификаторов
Когда имеется информация о типе данных, использование команды ? (вычисb
лить выражение) с идентификатором позволяет получить значение данного иденb
тификатора, а не его адрес. Так, например, если MyVariable является переменной
целого типа, содержащей значение 5, то
? MyVariable
int=0x5,"\0\0\0\x05"

112

8. Использование выражений
Для получения адреса MyVariable, следует использовать:
? &MyVariable

Использование операторов адресации с идентификаторами
Когда Вы создаете файл, содержащий полную информацию о типах и идентиb
фикаторах, то SoftICE способен вычислять ссылки через символические имена, исb
пользуя тип идентификатора. Вы также сможете получить адрес члена класса чеb
рез его идентификатор.
typedef struct Test
{
DWORD dword ;
LPSTR lpstr ;
} Test ;
Test test={ 1, "test String" } ;
? test->dword
unsigned long dword=1
? test->lpstr
char * lpstr =0x123456 ,
? &test
void * =0x123440
? &test->dword
void * =0x123440
? &test->lpstr
void * =0x123444
Того же самого можно достичь при использовании оператора приведения типа:
Test(eax)->dword или Test(eax)->lpstr
и
&Test(eax)->dword или &Test(eax)->lpstr

Отчетливо и зримо символы выделяются…
Джон Китс

Distinct, and visible; symbols devine...
John Keats

9. Загрузка символов для
системных компонентов
Загрузка экспортируемых символов для DLLo и EXEoфайлов
Экспортируемые символы являются одной из составных частей 16b и 32bбитного
формата исполняемых файлов в Windows, которые позволяют производить динаb
мическое связывание между исполняемым модулем (как правило), который импорb
тирует функции, и библиотекой .DLL, которая эти функции экспортирует.
В исполняемом файле имя в ASCIIbформате и порядковый номер (ordinal
number), или, иногда, только порядковый номер, ставятся в соответствие точкам
входа в модуле. Вполне разумно загрузить экспортируемую информацию в отладb
чик в символьном виде, особенно, когда собственная отладочная информация приb
ложения отсутствует. Как правило, таблицы экспорта присутствуют только в DLL,
но иногда и EXEbфайлы могут экспортировать функции; примером такого файла
является NTOSKRNL.EXE.
Вы можете настроит установки SoftICE таким образом, чтобы загружать эксb
портируемые символы любых 16b и/или 32bбитных .DLL и .EXEbфайлов. Во время
своего запуска SoftICE загружает также и таблицы экспорта указанных файлов, что
делает идентификаторы доступными для использования в любых выражениях.
Кроме того, все они автоматически показываются вместе с дизассеблированным
кодом. Для получения дополнительной информации о загрузке экспортируемой
информации при старте SoftICE смотрите раздел "Предварительная загрузка экс
портируемой информации" на странице 123.
Если модуль еще не запущен в работу, то информация о 32bбитном экспорте
программы для сегмента отображается в виде порядкового номера «FE», а смещеb
ние является просто смещением относительно начала загружаемой части файла.
После того, как модуль задействован в какомbлибо процессе, появляются настояb
щие адреса в формате "селектор : смещение". В состав смещения теперь входит баb
зовый адрес загрузки.
Когда 32bбитный модуль исключается из всех функционирующих процессов,
которые могли бы его использовать, все адреса снова превращаются в обычные паb
ры "номерbсегмента:смещение".
Замечание: Когда .DLL задействована в двух процессах с различными виртуальb
ными базовыми адресами, таблица экспорта использует базовый адрес
первого процесса, задействовавшего данную DLL, однако эти адреса
будут неверными для второго процесса. Вы можете избежать этого,
указав необходимый адрес для этой DLL, или перебазировав ее.

114

9. Загрузка символов для системных компонентов
Замечание: Для 16bбитных программ загружается экспортируемая информация
только из нерезидентных таблиц имен; однако, как правило, это вся
или почти вся экспортируемая таким модулем информация.

Использование неименованных точек входа
Для 32bбитного экспорта SoftICE показывает все экспортированные точки входа
даже, если они не имеют ассоциированных с ними имен. Для 16bбитного экспорта
SoftICE показывает только имена. Если была экспортирована точка входа без имеb
ни, SoftICE создает для нее имя в виде:
ORD_xxxx
где xxxx b это порядковый номер.
Такие имена могут конфликтовать друг с другом, так как многие DLL могут
иметь свои неименованные точки. Для того, чтобы быть уверенным, что используb
ется требуемый идентификатор, следует добавить перед ним имя модуля с послеb
дующим восклицательным знаком.
Пример:
Чтобы сослаться на первую точку входа KERNEL32, следует испольb
зовать выражение:
KERNEL32!ORD_0001
Нет необходимости вставлять после префикса ORD_ точное колиb
чество нулей, допустимым является как идентификатор ORD_0001,
так и ORD_1. Следующее выражение эквивалентно предыдущему
примеру:
KERNEL32!ORD_1

Использование экспортируемых имен в выражениях
SoftICE сначала просматривает все 32bбитные таблицы экспорта и лишь затем
ведет поиск в 16bбитных. Это означает, что, если одно и то же имя присутствует в
обоих типах таблиц, то будет использована 32bбитная. Если же требуется изменить
такую последовательность действий, то следует добавить перед именем экспортиb
рованного символа имя модуля с последующим восклицательным знаком.
Пример:
Когда задается имя GlobalAlloc, SoftICE использует 32bбитную табb
лицу экспорта модуля KERNEL32.DLL, а не 16bбитное имя, экспорb
тируемое из KRNL32.EXE. Вы сможете использовать 16bбитную
версию GlobalAlloc, задав полное имя экспортированного идентиb
фикатора:
KERNEL!GlobalAlloc
Кроме того, порядок поиска внутри каждого типа таблиц экспорта (32b и 16bбитноb
го) определяется той последовательностью, в которой эти таблицы загружались.

Динамическая загрузка 32oбитного DLLoэкспорта
SoftICE позволяет Вам загружать 32bбитные таблицы экспорта без перезагрузки
системы. Для того, чтобы загрузить 32bбитные таблицы динамически, необходимо:
1 Запустить утилиту Symbol Loader.
2 Затем либо выбрать из меню "FILE" пункт "LOAD EXPORTS", либо нажать аналоb
гичную кнопку на панели управления.
Появится окно загрузки экспорта (‘Load Exports’).
3 Выбрать файлы, которые Вы хотите загрузить и нажать "OPEN".

Использование символьных файлов Windows NT (.DBG) с SoftICE

115

Использование символьных файлов Windows NT (.DBG) с SoftICE
Microsoft предоставляет отладочную информацию для ключевых компонентов
Windows NT. Она поставляется в виде .DBGbфайлов, которые содержат отладочные
данные в формате COFF для соответствующих .EXE и .DLL. .DBGbфайлы можно
найти на CDbROM с Windows NT или загрузить их с соответствующими сервисныb
ми комплектами (service pack). Чтобы использовать .DBGbфайлы с SoftICE, необхоb
димо транслировать их с помощью утилиты Symbol Loader в формат .NMS и загруb
зить полученные файлы.

Использование символьных файлов Windows 95 (.SYM) с SoftICE
Windows 95 DDK включают в себя символьную информацию для некоторых сисb
темных модулей в виде .SYMbфайлов. Используйте утилиты Symbol Loader или
NMSYM для трансляции их в формат .NMS и загрузите полученные файлы в SoftICE.

Однако, если только я не ошибся, вот и наш клиент
Сэр Артур Конан Дойл

But here, unless I am mistaken, is our client.
Sir Arthur Conan Doyle

10. Использование SoftICE
с модемом
Введение
Вы можете управлять SoftICE удаленно с помощью модема. Это чрезвычайно
полезно для отладки ошибок, которые проявляются на удаленном компьютере, и
которые невозможно воспроизвести иным путем.
Когда Вы работаете с SoftICE через модем, на локальном компьютере запущены
и SoftICE, и отлаживаемое приложение. Удаленный компьютер при этом функциоb
нирует как неинтеллектуальный терминал, отображая выводимую отладчиком инb
формацию, и воспринимая ввод с клавиатуры. В таком режиме SoftICE не поддерb
живает работу с мышью на удаленном компьютере.

Аппаратные требования
Модем, используемый для связи локального и удаленного компьютеров, должен
отвечать следующим требованиям:
 Модем должен поддерживать стандартные ATbкоманды, такие, например, как
ATZ и ATDT, а также возвращать стандартные коды типа RING и CONNECT.
 Модем должен поддерживать протокол коррекции ошибок, такой как V.42
или MNP5. Это важно потому, что протокол, используемый SoftICE для свяb
зи, автоматическую коррекцию ошибок в себя не включает.

Установление соединения
При управлении SoftICE через модем процедура установки связи может быть
запущена как с локального, так и с удаленного компьютера.
Для установления соединения, когда локальный компьютер звонит на удаленb
ный, выполните следующие действия:
1 На удаленном компьютере запускается программа SERIAL.EXE
2 Пользователь на локальном компьютере в SoftCE вызывает команду DIAL.
Устанавливается соединение, и удаленный компьютер оказывается под конb
тролем SoftICE.
Если необходимо звонить с удаленного компьютера локальный, то выполните
иную последовательность действий:


Скорее всего, имеется в виду протокол MNP4, так как MNP5 является протоколом
сжатия данных.

Установление соединения

117

1 На локальном компьютере в программе SoftICE выполняется команда ANSWER.
2 С удаленного компьютера с помощью программы SERIAL.EXE звонят на лоb
кальный.
Устанавливается соединение, и удаленный компьютер оказывается под конb
тролем SoftICE.
В следующем разделе описывается, как пользоваться программой SERIAL.EXE и
командами DIAL и ANSWER. За более подробным описанием команд обращайтесь
к "Справочнику по командам SoftICE".

Использование программы SERIAL.EXE
SERIAL.EXE является MSbDOS программой, которая выполняет для SoftICE роль
неинтеллектуального терминала, воспроизводя выводимую отладчиком информаb
цию, и воспринимая ввод с клавиатуры удаленного компьютера. Все, что выводится с
помощью программы SERIAL.EXE на экран монитора, в точности соответствует тому,
что Вы бы увидели, если бы просто запустили SoftICE на локальном компьютере.
Замечание: Вы можете использовать программу SERIAL.EXE при связи компьb
ютеров как по модему, так и с помощью последовательного соедиb
нения. Если Вы хотите связать компьютеры с помощью последоваb
тельного соединения, то за дополнительной информацией обратиb
тесь к разделу "Подключение удаленного компьютера через после
довательный порт" на странице 21.
Программа SERIAL.EXE имеет следующие параметры командной строки:
SERIAL.EXE [r] [com-port] [baud-rate] [I”init-string”] [P ]
r
Опция "r" используется, когда Вы запускаете программу на удаленb
ном компьютере в окне DOS под управлением Windows NT. Этот паb
раметр отключает FIFObбуфер и автоматически устанавливает такие
параметры, как скорость связи, стоповые биты и бит четности.
com-port Номер коммуникационного порта, 1b4; это обязательный параметр.
baud-rate Скорость, с которой SERIAL.EXE взаимодействует с модемом. Она
не всегда совпадает со скоростью, которая сообщается командами
DIAL и ANSWER программы SoftICE на локальном компьютере. Это
также обязательный параметр.
I
Используется для задания строки инициализации модема.
"init-string"
Строка с командами, передаваемыми модему перед начаb
лом работы.
P
Используется для задания телефонного номера.
Если задан параметр "P", то SERIAL набирает номер телефона, к коb
торому подключен локальный компьютер, и на котором в програмb
ме SoftICE уже выполнена команда ANSWER.
Например: SERIAL 1 57000 p1-603-555-1212.
Если параметр не задан, то программа SERIAL работает в режиме
ответа, ожидая входящего звонка. Например: SERIAL 1 57000.

Номер телефона, по которому необходимо звонить (когда SERIAL
используется для исходящего звонка). Модему посылается коb
мандная строка в виде "ATDTnumber". Для звонка с применением
импульсного набора номера используйте букву "P" в качестве перb
вой цифры (работает не со всеми модемами).
После установления соединения пользователь на удаленном компьютере видит
привычный экран SoftICE и может управлять работой отладчика.

118

10. Использование SoftICE с модемом

Команда DIAL
Команда DIAL программы SoftICE используется для звонка на удаленный комb
пьютер. На самом удаленном компьютере уже должна быть запущена программа
SERIAL.EXE в режиме ответа.
Команда имеет следующие параметры:
DIAL [ON [com-port] [baud-rate] [I=init-string] [P= ] | OFF]
ON
Запуск набора номера.
OFF
Окончание сеанса связи.
com-port Номер коммуникационного порта: 1b4 (по умолчанию 1 порт).
baud-rate Скорость, с которой SoftICE взаимодействует с модемом (по умолb
чанию равна 57000). Она не обязательно должна совпадать со скоb
ростью, которая сообщается программой SERIAL.EXE на удаленном
компьютере. Если этот параметр задан, то должен быть указан и
номер коммуникационного порта.
I
Используется для задания строки инициализации модема.
init-string Строка с командами, передаваемыми модему перед началом раb
боты. Если параметр не задан, то используется значение строки поb
следнего сеанса связи; если и оно не определено, то передается
строка из начальных установок программы SoftICE.
P
Используется для задания телефонного номера.
Если задан параметр "P", то SoftICE набирает номер телефона и пыb
тается установить соединение с программой SERIAL.EXE, которая
должна ожидать звонка в режиме ответа.

Номер телефона, по которому необходимо звонить. Модему посыb
лается командная строка в виде "ATDTnumber". Для звонка с приb
менением импульсного набора номера используйте букву "P" в каb
честве первой цифра (работает не со всеми модемами). Если параb
метр не задан, то используется номер телефона последнего сеанса
связи или, если таковой не задавался вообще, номер из начальных
установок программы SoftICE.
Например, DIAL ON 1 57000 p=603-555-1212.

Команда ANSWER
Команда ANSWER переводит SoftICE в режим ответа на входящий звонок, котоb
рый производится с удаленного компьютера программой SERIAL.EXE.
Команда имеет следующие параметры:
ANSWER [ON [com-port] [baud-rate] [I=init-string] | OFF]
ON
Включает режим ответа.
OFF
Выключает режим ответа.
com-port Номер коммуникационного порта: 1b4 (по умолчанию 1 порт).
baud-rate Скорость, с которой SoftICE взаимодействует с модемом. По умолb
чанию она равна 57000. Она не обязательно должна совпадать со
скоростью, которая сообщается программой SERIAL.EXE на удаb
ленном компьютере. Если этот параметр задан, то должен быть
указан и номер коммуникационного порта.
init-string Строка с командами, которые используются для инициализации
модема. Если параметр не задан, то используется значение строки
последнего сеанса связи; если и оно не определено, то передается
строка из начальных установок программы SoftICE.
Например, ANSWER ON 1 57000.

В значительной степени формирование человеческой личности
находится в ее собственных руках
Сэр Френсис Бэкон

Chiefly the mould of a man’s fortune is in his own hands.
Sir Francis Bacon

11. Настройка SoftICE
Изменение начальных установок SoftICE
Программа SoftICE предоставляет пользователю широкие возможности для наb
стройки режимов работы на этапе ее начальной загрузки. Параметры начальных
установок можно разделить на следующие категории:
 Общие (General) — Множество полезных параметров, включая строку коb
манд, которые автоматически выполняются при запуске SoftICE.
 Отладочная информация (Symbol) — Позволяют указать .NMSbфайлы с отлаb
дочной информацией, которые загружаются при запуске отладчика.
 Экспортируемая информация (Exports) — Указывают .DLLb и .EXEbфайлы, из
которых при старте SoftICE будут загружены экспортируемые таблицы.
 Удаленная отладка (Remote Debugging) — Задание телефонного номера и
строки инициализации модема для использования при удаленной отладке чеb
рез коммуникационный порт.
 Переназначение клавиш (Keyboard Mappings) — Присваивают функциональb
ным клавишам клавиатуры значения команд SoftICE.
 Определение макрокоманд (Marco Definitions) — Позволяют создавать собстb
венные макрокоманды для использования при работе с SoftICE.
 Неисправности (Troubleshooting) — Предоставляют решения возможных
проблем.
Для изменения начальных установок выполните следующие действия:
1 Запустите утилиту Symbol Loader.
2 Выберите пункт "SOFTICE INITIALIZATION SETTINGS..." (Начальные установки
SoftICE) из меню EDIT.
SoftICE обозначает диалог начальных установок следующим образом:
SOFTICE INIT SETTINGS DIALOG BOX HERE
(Окно диалога начальных установок SoftICE).
3 Выберите категорию параметров, которые Вы хотите изменить.
4 Измените необходимые параметры и нажмите OK.
В следующих разделах все параметры описаны подробно.
5 Перезапустите компьютер для запуска SoftICE с учетом сделанных Вами изb
менений.

120

11. Настройка SoftICE

Изменение общих установок (General)
На вкладке "GENERAL" могут быть модифицированы следующие параметры:
Initialization string (Инициализационная строка)
Строка инициализации содержит последовательность команд, которые выполb
няются при старте SoftICE. По умолчанию она содержит команду X (eXit — Выход),
завершаемую точкой с запятой:
X;
В строку могут быть добавлены дополнительные команды, например, для измеb
нения стандартной комбинации клавиш CtrlbD, вызывающей экран SoftICE, для изb
менения размеров экрана отладчика или увеличения количество строк, им отобраb
жаемых, или для установления командой SERIAL соединения для удаленной отладb
ки. Если Вы занимаетесь отладкой драйверов устройств, то, возможно, Вы захотите
убрать команду X (или точку с запятой после нее) для предотвращения автоматичеb
ского выхода из стадии инициализации.
Чтобы добавить команды в строку инициализации, впечатайте новые команды,
разделенные точкой с запятой, перед командой X. Команды будут обрабатываться в
той последовательности, в какой Вы их поместите. Так, помещение команд после
команды X означает, что они не будут выполнены до тех пор, пока находитесь в окb
не SoftICE. Если Вы напечатаете команду без точки с запятой, то SoftICE только заb
грузит ее в окно команд, но не выполнит.
Пример:
Следующая инициализационная строка переключает SoftICE в реb
жим отображения экрана размером 50 строк, изменяет клавиатурb
ную последовательность вызова на "AltbZ", включает окно регистb
ров и производит выход из стадии инициализации:
LINES 50; ALTKEY ALT Z; WR; X;
Замечание: Если Вы набираете строку, превосходящую по ширине поле ввода,
то строка автоматически сдвигается влево, позволяя Вам видеть
вводимую информацию.
History buffer size (Размер буфера протокола)
Параметр "HISTORY BUFFER SIZE" определяет размер буфера протокола работы
SoftICE. По умолчанию он равен 256 Кб.
Протокол SoftICE содержит всю информацию, которая выводилась в окне коb
манд. Поэтому сохранение протокола в файл полезно для записи больших объемов
данных, дизассемблированных кодов, сохранения истории выполнения контрольb
ных точек, выданной командой BPLOG, а также последовательности сообщений
Windows, полученной по команде BMSG. Подробности смотрите в разделе "Сохра
нение содержимого буфера протокола окна команд в файл" на странице 66.
Trace buffer size (Размер буфера обратной трассировки)
(только для Windows 95)
Этот параметр определяет размер буфера обратной трассировки. Буфер подb
держивает обратную трассировку для команд BPR и BPRW. По умолчанию его разb
мер 8 Кб.

Изменение начальных установок SoftICE

121

Total RAM (Размер оперативной памяти) (только для Windows 95)
Этот параметр указывает количество физической памяти на Вашем компьютеb
ре. Устанавливайте его величину равной или большей, чем количество памяти на
Вашем компьютере.
В результате особенностей архитектуры операционной системы SoftICE под
управлением Windows 95 не может точно определить размер физической операb
тивной памяти. Чтобы правильно отобразить взаимосвязь между линейной и фиb
зической памятью, SoftICE использует значение, равное по умолчанию 128 Мб. Но,
хотя это значение справедливо для большинства компьютеров, на которых заниb
маются созданием и отладкой программ, оно неверно работает на системах с больb
шими размерами физической памяти. Это происходит вследствие того, что соотb
ветствующие структуры данных для страниц памяти выше 128 Мб не создаются.
Если на Вашем компьютере установлено меньше 128 Мб оперативной памяти,
то Вы можете сэкономить некоторое количество памяти, устанавливая в этом параb
метре действительное значение, так как для отображения физической памяти буb
дут созданы структуры меньшего размера.
Display diagnostic messages
(Отображение диагностических сообщений)
Параметр "DISPLAY DIAGNOSTIC MESSAGES" определяет, будет ли SoftICE показыb
вать в окне команд такую дополнительную информацию, как, например, загрузка и
выгрузка модулей. По умолчанию этот параметр включен.
Trap NMI (Перехват немаскируемого прерывания)
Этот параметр определяет включен или нет перехват немаскируемого прерывания
(Nonbmaskable interrupt b NMI). По умолчанию он включен. Генерирование немаскиb
руемого прерывания позволяет Вам перейти в SoftICE даже, если запрещены все преb
рывания. Такие прерывания генерируются, например, системами энергопитания.
Lowercase disassembly
(Вывод дизассемблерованного кода строчными буквами)
Параметр "LOWERCASE DISASSEMBLY" определяет будут ли использованы символы
нижнего регистра для вывода дизассемблированных инструкций. По умолчанию
параметр выключен.

Предварительная загрузка символической информации и исo
ходного кода (Symbols)
Установки параметров инициализации символьной информации в сочетании с
параметрами трансляции модулей (Module Translation) используются для предвариb
тельной загрузки отладочной информации и исходных кодов при старте SoftICE. Таb
кая предварительная загрузка полезна, например, при отладке драйверов устройств.
Для предварительной загрузки символической информации или исходных коb
дов выполните следующее:
1 В установках "MODULE TRANSLATION" выберите пункт "SYMBOLS AND SOURCE
CODE" или нажмите соответствующую кнопку на панели управления для заb
грузки исходных кодов в дополнение к отладочной информации.
2 Выберите пункт "PACKAGE SOURCE WITH SYMBOL TABLE".

122

11. Настройка SoftICE
3 В утилите Symbol Loader выберите пункт "TRANSLATE" из меню "MODULE" для того,
чтобы оттранслировать файл с отладочной информацией в файл формата .NMS.
4 С помощью вкладки "SYMBOLS" добавьте созданный Вами .NMSbфайл к списку
символьных файлов. Что для этого надо сделать, описано в следующем разделе.
Добавление символьных файлов в список
На вкладке "SYMBOLS" начальных установок SoftICE:
1 Нажмите кнопку "ADD" (Добавить).
SoftICE откроет диалог, чтобы Вы нашли .NMSbфайл, который содержит отлаb
дочную информацию и исходные коды, которые Вы хотите загрузить.
2 Выберите необходимые .NMSbфайлы и нажмите OK.
Совет:
Обычно .NMSbфайл имеет то же имя, что и файл, из которого Вы
его транслировали. Работая под управлением Windows 95, SoftICE
не может выполнять предварительную загрузку файлов отладочной
информации с длинными именами, так как начальная загрузка
SoftICE выполняется в реальном режиме DOS. Если Ваш модуль
имеет длинное имя, то после создания .NMS файла переименуйте
его, присвоив имя из 8 символов с расширением .NMS, и при добавb
лении в список выбирайте переименованный файл.
Другой подход состоит в использовании вместо Symbol Loader утиb
литы командной строки NMSYM, которая позволяет задавать имя
создаваемого в результате трансляции .NMSbфайла.
Совет:
Если вы выбираете режим " PACKAGE SOURCE WITH SYMBOL TABLE ", исb
ходные тексты становятся частью .NMS файлов. В этом случае нет огb
раничения длины имени файлов даже при использовании Windows 95.
3 Всякий раз, когда вы изменяете исходные коды своей программы, транслиb
руйте модуль заново, чтобы иметь свежую версию .NMS файла.
Удаление исходных файлов и файлов с символьной информацией
из списка предварительной загрузки

Чтобы отменить предварительную загрузку отладочной информации, выделите
соответствующие файлы в списке и нажмите кнопку "REMOVE" (Убрать).
Резервирование памяти под отладочную информацию
Пункт "SYMBOL BUFFER SIZE" определяет объем памяти (в Кб), резервируемой для
хранения отладочной информации (например, номеров строк исходного кода). Под
управлением Windows 95 эта область памяти также используется SoftICE в качестве
буфера для хранения .NMS в процессе загрузки отладчика. По умолчанию SoftICE
резервирует для буфера 1024 Кб памяти под Windows 95 и 512 Кб под Windows NT.
Как правило, 512 Кб достаточно как в том, так и в другом случае. Однако, иногда
Вам может понадобиться увеличить размер буфера:
 Если Вы отлаживаете большие программы, используйте значение 1024 Кб или
более.
 Если Вы работаете под Windows 95 и загружаете отладочную информацию при
старте SoftICE, то подсчитайте общий размер всех используемых на этапе заb
грузки .NMSbфайлов и установите величину буфера равной этому значению.
Чтобы определить количество памяти, доступной для хранения отладочной инb
формации, используйте команду TABLE. Учтите, что основная часть этой информаb
ции находится в динамически выделяемой памяти.

Изменение начальных установок SoftICE

123

Предварительная загрузка экспортируемой информации (Exports)
Начальные установки в вкладке "EXPORT" используются для назначения файлов,
из которых SoftICE в момент старта сможет извлечь экспортируемую информацию.
Экспортируемая информация может быть полезна, например, при работе с бибb
лиотекой DLL, когда отладочная информация вообще отсутствует.
Извлечение экспортируемой информации
Чтобы выбрать один или несколько файлов, из которых будет извлекаться эксb
портируемая информация сделайте следующее:
1 Нажмите кнопку "ADD" (Добавить).
SoftICE покажет диалог, чтобы Вы смогли найти необходимые файлы. Помниb
те, что, если Вы подключены к сети, то Вы можете нажать кнопку "NETWORK"
(Сеть), чтобы просмотреть содержимое доступных Вам сетевых устройств.
2 Выберите необходимые файлы и нажмите OK.
3 SoftICE поместит выбранные Вами файлы в список для экспорта.
Удаление файлов из списка экспорта
Чтобы удалить файл из списка экспорта, выберите требуемый файл и нажмите
кнопку "REMOVE" (Убрать).

Настройка удаленной отладки (Remote Debugging)
Параметры удаленной отладки позволяют Вам определить тип последовательноb
го соединения и задать строку инициализации модема и номер телефона, которые
будут использоваться командами DIAL и ANSWER. (Вышеупомянутые параметры
могут быть непосредственно заданы в этих командах.) За точным описанием коb
манд управления Вашим модемом обращайтесь к соответствующей документации.
Telephone number (Номер телефона)
Параметр "TELEPHONE NUMBER" задает номер телефона, используемый командой
DIAL (например, 421b555b1212).
Serial connection (Последовательное соединение)
(только для Windows 95)
Если Вы запускаете SoftICE для отладки удаленной системы под управлением
Windows 95, выберите на локальном компьютере коммуникационный порт (COM1,
COM2, COM3 или COM4), который будет использован для последовательного соb
единения. После окончания отладки измените параметр на "NONE". По умолчанию
параметр "SERIAL CONNECTION" установлен на "NONE".
Замечание: Если Вы используете SoftICE под управлением Windows NT, то отладчик
автоматически определит параметры последовательного соединения.
DIAL initialization string
(Строка инициализации модема командой DIAL)
Параметр "DIAL INITIALIZATION STRING" устанавливает строку инициализации моb
дема при использовании команды DIAL, например ATX0.

124

11. Настройка SoftICE
ANSWER initialization string
(Строка инициализации модема командой ANSWER)

Параметр "ANSWER INITIALIZATION STRING" устанавливает строку инициализации
модема при использовании команды ANSWER, например ATX0.

Изменений назначений клавиатуре (Keyboard Mappings)
Раздел установок "KEYBOARD MAPPINGS" используется для назначения функциоb
нальным клавишам клавиатуры команд SoftICE. Команды SoftICE могут быть наb
значены любой из 12 функциональных клавиш или их комбинациям с клавишами
SHIFT, CTRL или ALT.
Синтаксис команд
При модификации исходных или при создании новых назначений могут быть исb
пользованы любые допустимые команды SoftICE и символы вставки (^) и "точка с заb
пятой" (;). Наличие символа вставки (^) перед началом команды указывает SoftICE
выполнить ее, не помещая в окно команд. Символ "точка с запятой" (;) работает поb
добно клавише Enter, инициируя исполнение команды. В одной командной строке
может находиться более одного символа "точка с запятой".
Изменение значений функциональных клавиш
Чтобы изменить команды SoftICE, присвоенные функциональной клавише, неb
обходимо выполнить следующие действия:
1 Выберите функциональную клавишу, которую Вы хотите модифицировать, в
списке назначений и нажмите кнопку "ADD" (Добавить).
Замечание: SoftICE использует следующие сокращения для функциональных
клавиш и клавиш ALT, CTRL и SHIFT.
Клавиша

Сокращение

Пример

Функциональные
Alt
Ctrl
Shift

F
A
C
S

F1
AF1
CF1
SF1

2 Измените команду в поле "Command" и нажмите OK.
Присвоение значений незадействованным функциональным клавишам
Чтобы присвоить команду новой функциональной клавише (или комбинации
клавиш), выполните следующие действия:
1 Определите функциональную клавишу (или комбинацию функциональной клаb
виши с SHIFT, CTRL или ALT), которой никаких команд SoftICE еще не присвоено.
2 Нажмите кнопку "ADD" (Добавить).
3 Выберите код функциональной клавиши из списка.
4 Выберите модификатор. Чтобы присвоить команду просто функциональной
клавише, выберите "NONE". Для присвоении команды комбинации клавиш,
выберите SHIFT, CTRL или ALT.
5 Наберите необходимую команду в поле "COMMAND" и нажмите OK.

Изменение начальных установок SoftICE

125

Удаление назначения функциональной клавише
Чтобы удалить назначение команды функциональной клавише, выберите в спиb
ске необходимую комбинацию и нажмите "REMOVE" (Убрать).
Восстановление значений функциональных клавиш
В следующей таблице приведен список команд SoftICE, присваиваемых функb
циональным клавишам по умолчанию.
Клавиша Команда

Клавиша Команда

F1 =

H;

F11 =

^G @SS:ESP;

F2 =

^WR;

F12 =

^P RET;

F3 =

^SRC;

SF3 =

^FORMAT;

F4 =

^RS;

AF1 =

^WR;

F5 =

^X;

AF2 =

^WD;

F6 =

^EC;

AF3 =

^WC;

F7 =

^HERE;

AF4 =

^WW;

F8 =

^T;

AF5 =

F9 =

^BPX;

AF11=

CLS;
dd dataaddr->0;

F10 =

^P;

AF12=

dd dataaddr->4;

Вы можете модифицировать назначения отдельных клавиш или нажать кнопку
"RESTORE DEFAULTS" (Восстановить исходные), чтобы восстановить всем модифицироb
ванным или удаленным функциональным клавишам их исходные значения. Однако,
эта кнопка не удаляет команды, присвоенные новым функциональным клавишам.

Работа с постоянными макрокомандами (Macro Definitions)
Макрокоманды являются определяемыми пользователем командами, которые
могут использоваться точно так же, как и встроенные команды. Определение (или
тело) макрокоманды состоит из последовательности команд SoftICE. Набор допусb
тимых команд включает в себя также пользовательские макросы и аргументы коb
мандной строки.
Существует 2 способа создания макрокоманд. Вы можете создать макрокоманды
времени исполнения, которые существуют до момента перезапуска SoftICE, или созb
дать постоянные макросы, которые сохраняются в файле начальных установок и авb
томатически загружаются каждый раз во время старта отладчика. В данном разделе
описывается создание постоянных макрокоманд. Дополнительную информацию о
создании макрокоманд исполнения времени смотрите в разделе "Использование
макрокоманд времени исполнения" на странице 64.
Создание постоянных макрокоманд
Постоянные макрокоманды создаются следующим образом:
1 Нажмите "ADD" (Добавить).
Появляется окно "Add Macro Definition" (Добавление определения макроса).
2 В поле "NAME" впишите имя макрокоманды.

126

11. Настройка SoftICE
Имя макроса может иметь длину от 3 до 8 символов и содержать любые буквы,
цифры и знак подчеркивания (_). Имя обязательно должно содержать хотя
бы одну букву. Имена макрокоманд не должны дублировать имена встроенb
ных команд SoftICE.
3 Наберите содержимое макроса в поле "Definition" (Определение).
Определение (или тело) макроса состоит из последовательности команд SoftICE
или других макросов, разделенных точками с запятой. При этом последняя коb
манда не обязательно должна заканчиваться точкой с запятой. На аргументы
командной строки макрокоманды можно ссылать в любом месте тела макроса с
помощью %, где номерпараметр — это цифры от 1 до 8.
Пример:
Макрокоманда MACRO asm = "a %1" определяет псевдоним для
команды A (команда ассемблера). Идентификатор "%1" заменяется
на первый аргумент после имени макроса "asm" или просто удаляb
ется, если аргумента нет.
Если требуется вставить в тело макрокоманды символ двойных кавычек (")
или знак процента (%), то перед ними необходимо добавить символ обратной
косой черты (\). Чтобы добавить собственно знак обратной косой черты, исb
пользуется последовательность из двух таких символов (\\).
Замечание: Рекурсивный вызов макрокоманд возможен, однако, польза от этоb
го приема сомнительна, так как программного способа завершить
его работу не существует. Если макрокоманда вызывает саму себя
в последней команде тела макроса (так называемый "хвостовой выb
зов"), то такая команда выполняется до тех пор, пока пользователь
не нажмет 'ESC', чтобы прервать ее работу. Если рекурсивный выb
зов не является последней командой макроса, то такой вызов выb
полняется 32 раза (ограничение вложенности).
4 Нажмите OK.
SoftICE поместит Вашу постоянную макрокоманду в список макроопределений.
Примеры макрокоманд
В следующей таблице приведены примеры допустимых макрокоманд.
Допустимое
имя

Допустимое
определение

Пример

Qexp

addr explorer; Query %1

1shot

bpx %1 do \”bc bpindex\”

ddt
ddp
thr

dd thread
dd process
thread %1 tid

dmyfile

macro myfile =
\”TABLE %1;file \%1\”

Qexp
Qexp 140000
1shot eip
1shot @esp
ddt
ddp
thr
thr -x
dmyfile mytable
myfile myfile.c

В следующей таблице приведены примеры недопустимых макрокоманд.

Изменение начальных установок SoftICE
Недопустимое имя
или тело макроса

127

Пояснение

Имя: DD
Тело: dd dataaddr

Макрокоманда использует имя встроенной команды
SoftICE. Команды SoftICE не могут быть переопределены.

Имя: AA
Тело: addr %1

Имя макрокоманды слишком короткое. Имя макроса
должно содержать от 3 до 8 символов.

Имя: tag
Тело: ? *(%2-4)

Макрокоманда ссылается на параметр %2 без ссылки на
параметр %1. Нельзя ссылаться на параметр %n+1, не
ссылаясь на параметр %n.

Запуск и остановка работы постоянных макрокоманд
Для того, чтобы исполнить постоянную макрокоманду, просто наберите ее имя.
Чтобы остановить работу макроса, нажмите клавишу ESC.
Параметр Macro Limit
Параметр "MACRO LIMIT" определяет максимальное число макрокоманд и точек
прерывания, которые Вы можете определить во время работы SoftICE. Это количеb
ство включает в себя как постоянные, так и макрокоманды времени исполнения.
По умолчанию параметр установлен на минимальное значение — 32. Максимально
допустимое значение равно 256.
Модификация постоянных макрокоманд
Чтобы модифицировать постоянную макрокоманду необходимо:
1 Выбрать макрокоманду, которую Вы хотите изменить и нажать "ADD".
2 В окне "ADD MACRO DEFINITION" (Добавление определения макроса) изменить
имя и/или определение макрокоманды и затем нажать OK.
Удаление постоянной макрокоманды
Чтобы удалить постоянную макрокоманду, выберите соответствующий макрос
и нажмите кнопку "REMOVE" (Удалить).

Параметры для устранения неисправностей (Troubleshooting)
Эти параметры позволяют Вам устранить некоторые проблемы при работе с
SoftICE. Изменяйте их только в том случае, если Вы получили соответствующее
указание от службы технической поддержки фирмы NuMega, или оказались в сиb
туации, описанной в данной документации. По умолчанию все параметры данного
раздела установлены в состояние "Выключено".
Совет:
Если Вы хотите вернуть все установки параметров данного раздела
в исходное состояние, нажмите кнопку "RESTORE DEFAULTS" (Восстаb
новить исходные значения). То же самое можно сделать, если Вы
включили некоторые из параметров и теперь хотите все их выклюb
чить, не обращаясь к каждому из них по отдельности.

128

11. Настройка SoftICE
Disable mouse support (Отключить поддержку мыши)

Отметьте данный флажок, если у Вас возникли проблемы с использованием
мыши при работе с SoftICE.
Disable Num Lock and Caps Lock programming
(Отключить программирование клавиш Num Lock и Caps Lock)
Если при загрузке SoftICE у Вас блокируется клавиатура, или она ведет себя
странно, то установите данный флажок. Если, однако, это не решит Вашей проблеb
мы, но Вы работаете под Windows NT, попробуйте установить флаг "DO NOT PATCH
KEYBOARD DRIVER".
Do not patch keyboard driver
(Не использовать модификацию клавиатурного драйвера) (только для
Windows NT)
Если при загрузке SoftICE у Вас блокируется клавиатура, или она ведет себя
странно, установите данный флажок, чтобы не разрешать SoftICE модифицировать
драйвер клавиатуры. В данном случае SoftICE будет использовать иной, обычно меb
нее устойчивый способ управления клавиатурой. Если это не решит Вашей проблеb
мы, попробуйте установить флаг "DISABLE NUM LOCK AND CAPS LOCK PROGRAMMING".
Disable mapping of nonopresent pages
(Отключить отображение незагруженных страниц)
SoftICE пытается осуществить поиск страниц в физической памяти даже, если
данная страница помечена как отсутствующая. Отметьте данный флажок, чтобы
отключить эту функцию.
Disable Pentium support
(Отключить поддержку процессоров "Pentium")
SoftICE автоматически определяет используете Вы процессор класса Pentium или
нет. Если же Вы используете новый тип процессора, с которым SoftICE не знаком, а
отладчик ошибочно определяет его как процессор Pentium, то установите данный флаг.
Disable threadospecific stepping
(Отключение потокоoзависимой трассировки)
Команда P (steP over — пошаговая трассировка) является потокоbзависимой.
Работа отлаживаемой программы будет прервана SoftICE только в том случае, если
будет активным тот поток, в котором была выполнена команда P. Заметьте, что, как
правило, Вам как раз и необходимо оказаться именно в том потоке, который Вы отb
лаживаете. Чтобы выключить такую зависимость, установите данный флаг.

— А корольBто голый! — кричал маленький ребенок.
Ганс Христиан Андерсен

But the Emperor has nothing on at all! cried a little child.
Hans Christian Andersen

12. Исследование Windows NT
Обзор
Не вызывает никакого сомнения, что операционная система Windows NT — это веb
ликолепное произведение разработчиков и программистов. Трудно представить себе
какуюbлибо иную столь же сложную систему, способную решать все поставленные
перед нею задачи, включая и три самых непростых: переносимость, устойчивость и
расширяемость, не поступаясь при этом ни интерфейсом, ни производительностью.
Какимbто чудом разработчики фирмы Microsoft ухитрились обеспечить четкое взаиb
модействие всех компонентов, подобное работе механизма хорошо отлаженных часов.
И, если Вы собираетесь разрабатывать приложения для Windows NT, Вам необходимо
понимать то, что лежит в основе Вашей программы — саму операционную систему
Windows NT. Знания, которые Вы приобретете, потратив время на изучение особенb
ностей ее строения, обогатят как Вас, так и Ваши приложения.
В этой главе дается краткий обзор наиболее важных и интересных особенноb
стей Windows NT. Особое внимание уделяется слабо или вообще недокументироb
ванным сторонам функционирования системы.

Ресурсы для квалифицированных разработчиков
Фирма Microsoft предоставляет некоторые дополнительные ресурсы для разработки
и отладки приложений, среди которых отладочная версия системы, Windows NT DDK и
.DBGbфайлы. В следующих разделах все эти три ресурса обсуждаются подробнее.
Отладочная версия системы
Если Вы не используете в своей работе отладочную версию Windows NT, то знаb
чит Вы не получаете того значительного количества дополнительной информации и
поддержки, которые она предоставляет, и которая отсутствует в коммерческой верb
сии операционной системы. Вам будут доступны многочисленные отладочные соb
общения, специальные флаги, используемые компонентами ядра и позволяющие
проследить за работой системы, а также достаточно строгая проверка большинства
API вызовов. Размеры и строение структур данных, а также организация системных
вызовов в отладочной и коммерческой версиях практически идентичны. Это позвоb
ляет Вам изучить работу приложения, используя более информативные сообщения
отладочной версии, а замет успешно завершить работу под управлением коммерчеb
ской версии Windows NT. Следовательно, если Вы хотите разрабатывать как можно
более устойчивые приложения и драйверы, используйте отладочную версию.

130

12. Исследование Windows NT
Windows NT DDK

Windows NT DDK (Driver Development Kit — средства для разработки драйверов)
содержит заголовочные файлы, примеры программ, систему подсказок, а также спеb
циальные программы, позволяющие исследовать различные составные части ядра
системы. Самым полезным из них является файл NTDDK.H. Несмотря на то, что
значительная часть информации в нем отсутствует, тем не менее его стоит изучить.
Кроме основных структур данных, необходимых для разработки драйверов, в нем
описаны и многие другие (одни подробно, другие кратко, а некоторые и не описаны
вовсе). Здесь приведены прототипы многих API вызовов и перечислители, полезные
как для исследования, так и для разработки. Имеется множество полезных комменb
тариев об особенностях строения системы, ее возможностях и ограничениях. Больb
шинство остальных заголовочных файлов касаются редко используемых сторон раb
боты системы, из них наиболее полезны NTDEF.H, BUGCODES.H и NTSTATUS.H.
Windows NT DDK также включает в себя несколько полезных утилит. Например,
POOLMON.EXE позволяет наблюдать за использованием системной памяти,
OBJDIR.EXE предоставляет информацию об иерархии объектов в системе, и конb
кретно о каждом из них. Программа SoftICE для Windows NT позволяет получить
аналогичные сведения с помощью команд OBJDIR, DEVICE и DRIVER. Утилита
DRIVERS.EXE, подобно команде MOD SoftICE, перечисляет все драйверы и выдает их
основные параметры. Некоторые версии Windows NT DDK включают расширенную
версию стандартной утилиты PSTAT.EXE. PSTAT — это консольное приложение,
которое позволяет получить информацию о процессах и потоках в системе. Среди
включаемых в состав Win 32 SDK и Visual C++ утилит следует упомянуть две: PVIEW
и SPY++. Обе предоставляют информацию о процессах и потоках системы; SPY++,
кроме того, позволяет получать значения HWND и CLASS.
В Windows NT DDK включены HELPbфайлы и справочный материал для разраb
ботки драйверов, а также примеры программ. Это примеры очень полезны при
создании реальных драйверов. Найдите чтоbлибо похожее на Вашу разработку,
скомпилируйте образец и изучите его с помощью SoftICE.
.DBG файлы
Microsoft предоставляет .DBGbфайлы всех исполняемых файлов как для отлаb
дочной, так и для коммерческой версий Windows NT. Сюда входят системные комb
поненты ядра, драйверы устройств, DLL системы Win32, приложения контрольной
панели и даже игры. .DBGbфайлы содержат основную отладочную информацию,
подобную PUBLICbразделам .MAPbфайлов. Каждый APIbвызов или глобальная пеb
ременная, как экспортируемая, так и импортируемая, имеют свое определение
(например, имя, секцию и смещение). Информация о структурах данных или лоb
кальных переменных в них отсутствует, однако описание каждого API делает отb
ладку системных вызовов более легкой.
Совет:
.DBGbфайлы являются наиболее важным инструментом в Вашей отлаb
дочной и исследовательской работе. Определите необходимые Вам
ключевые компоненты, найдите соответствующие им .DBGbфайлы, и с
помощью программы Symbol Loader создайте .NMSbфайлы, которые
можно будет загрузить в SoftICE.
Независимо от специфики Вашей работы используйте отладочную информаb
цию для ключевых компонентов системы. Наиболее важные их них отмечены в
таблице жирным шрифтом.

Обзор

131

NTOSKRNL.EXE Ядро Windows NT. Основная часть операционной системы
реализована именно здесь.
HAL.DLL

Уровень аппаратной абстракции (Hardware Abstraction
Layer). Важные примитивы для NTOSKRNL.

NTDLL.DLL

Основа реализации Win32 API и других функций, традициb
онно приписываемая KERNEL. Здесь также реализован инb
терфейс между Системой и Пользователем. Сюда переадb
ресуются вызовы из KERNEL32.DLL.

CSRSS.EXE

Сервер подсистемы Win32. Большинство системных вызоb
вов проходят через этот процесс.

WINSRV.DLL

В версии Windows NT 3.51 — ядро реализации функций
USER и GDI. Единственный процесс, загруженный в конb
текст CSRSS.

WIN32K.SYS

Драйвер системных устройств, замещающий WINSRV.DLL
и минимизирующий межпроцессовые взаимодействия меb
жду приложениями и CSRSS. В некоторых версиях операb
ционной системы может быть отсутствовать.

USER32.DLL

Основа реализации функций USER. Содержит, главным
образом, переадресацию в WINSRV.DLL (через LPC к
CSRSS). В последних версиях сюда перенесена реализация
большего числа функций для уменьшения количества переb
ключений контекста.

KERNEL32.DLL

Реализация некоторых традиционных функций KERNEL,
однако в основном содержит переадресацию в NTDLL.DLL.

Другие источники информации
Следующие источники предоставляют обширную информацию по разработке
драйверов и приложений для Windows NT.
 Microsoft Developers Network (MSDN)
MSDN выходит ежеквартально на CDbROM и содержит много полезной инфорb
мации, а также статьи по всем аспектам программирования для семейства операb
ционных систем фирмы Microsoft. Это одно из немногих мест, где Вы можете
найти подробности по написанию драйверов устройств для Windows NT.

 Inside Windows NT b Helen Custer, Microsoft Press
В книге "Inside Windows NT" сначала рассматривается общее строение операb
ционной системы, а затем в деталях обсуждается каждая достаточно важная
подсистема и приводится множество диаграмм для иллюстрации внутренних
структур данных, правил и алгоритмов работы. Несмотря на то, что содержаb
ние этой книги может показаться достаточно абстрактным с точки зрения разb
работки приложений, после ее прочтения взаимосвязи систем Windows NT
становятся более понятными. В настоящее время это наиболее ценный источb
ник информации по строению и функционированию Windows NT. И еще
большую пользу Вы сможете извлечь, если параллельно будете исследовать
внутреннее устройство операционной системы с помощью SoftICE.


Имеется русский перевод: Хелен Кастер "Основы Windows NT и NTFS". — Microb
soft Press "Русская редакция", 1996 г.

132

12. Исследование Windows NT


Advanced Windows, 2nd Edition b Jeffery Richter, Microsoft Press
Книга "Advanced Windows" является ценным пособием для программистов,
разрабатывающих приложения для систем Win32. Автор подробно обсуждает
процессы, потоки, управление памятью и синхронизацию объектов. Привоb
дятся образцы кодов и утилиты.

Внутри ядра Windows NT
Чтобы получить общее представление о работе Windows NT, давайте взглянем
на нее с разных точек зрения. Это позволит понять ограничения и допущения, сдеb
ланные при ее разработке.
Данный раздел касается наиболее важного компонента операционной системы
— его ядра. Здесь рассказывается, как Windows NT заполняет основные структуры
ядра, такие как IDT и TSS, и каким образом можно использовать команды SoftICE,
чтобы оценить работу системы. Будет показано распределение системных обласb
тей памяти, описаны важные структуры данных и роль, которую они играют в раb
боте операционной системы.
Большая часть этого раздела строится на деталях организации двух следующих
модулей:
 HAL.DLL — Уровень аппаратной абстракции (Hardware Abstraction Layer).
Роль этого модуля состоит в изоляции в пределах одного модуля аппаратную
зависимость системы настолько, насколько это только возможно, что делает
код Windows NT легко переносимым на другие платформы. Однако, с целью
повышения производительности аппаратноbзависимые коды присутствуют и
в других частях ядра.
Главным образом, HAL отвечает за работу с устройствами на самом низком
уровне: за программирование контроллера прерывание, обслуживание порb
тов ввода/вывода и взаимодействие процессоров в мультипроцессорных сисb
темах. Многие программы HAL предназначены для работы с конкретным тиb
пом шины (PCI, EISA, ISA), с различными шинными адаптерами. HAL также
отвечает за первичную обработку ошибок и управление прерываниями.
 NTOSKRNL.EXE — собственно ядро системы.
Основная часть операционной системы Windows NT реализована в ядре или
Windows NT Executive. Именно на нем базируется работа всех остальных
подсистем, такой, например, как Win32. Ядро выполняет множество различb
ных функций, а именно:
 управление памятью;
 управление объектами;
 создание процессов и потоков и управление их работой;
 обеспечение протокола LPC (Local Procedure Call — местный вызов процедуры);
 обеспечение системы безопасности;
 обработка исключений;
 функционирование виртуальных DOSbмашин (VDM);
 примитивы синхронизации — семафоры и взаимоисключения;
 библиотека времени исполнения;
 файловая система;
 подсистема ввода/вывода.



В 1998 г. на русском языке вышло 3bе издание книги: Джеффри Рихтер "Windows
для профессионалов". — Microsoft Press "Русская редакция".

Внутри ядра Windows NT

133

Управление процессорами Intel
При запуске операционной системы в защищенном режиме необходимо заполb
нить основные структуры процессора, установить параметры работы и выделить
адресное пространство, которое она будет использовать. Инициализация системы
выполняется модулями NTLDR, NTDETECT, NTOSKRNL и HAL. Применение переb
численных в приведенной ниже таблице команд SoftICE поможет Вам понять, каb
ким образом Windows NT использует архитектуру процессоров x86 для обеспечеb
ния безопасной и устойчивой работы.
Команда

Описание

IDT

Показывает содержимое таблицы дескрипторов прерывания
(Interrupt Descriptor Table)
Показывает содержимое сегмента состояния задачи
(Task State Segment)
Показывает содержимое глобальной таблицы дескрипторов
(Global Descriptor Table)
Показывает содержимое локальной таблицы дескрипторов
(Local Descriptor Table)

TSS
GDT
LDT

Замечание: Подробное описание каждой из этих команд дается в "Справочнике
по командам SoftICE".
IDT (Interrupt Descriptor Table — таблица дескрипторов прерываний)
Windows NT создает таблицу IDT для 256 векторов прерываний и размещает ее в
системной области адресного пространства. Первые 48 векторов обычно используb
ются ядром для перехвата исключений, однако некоторые вектора используются для
системных нужд или приложений. Для получения содержимого таблицы дескриптоb
ров прерываний Windows NT в SoftICE следует воспользоваться командой IDT.
Преры[
вание

Назначение

2h

Немаскируемое прерывание. Установленный здесь вентиль задачи
имеет чистый набор регистров, таблиц страниц и стек уровня 0. Это
позволяет операционной системе продолжить работу и успеть вывесb
ти "Синий экран смерти".
8h
Двойная ошибка. Установленный здесь вентиль задачи имеет чистый
набор регистров, таблиц страниц и стек уровня 0. Это позволяет опеb
рационной системе продолжить работу и успеть вывести "Синий экb
ран смерти".
21h
Перехват 21h прерывания MSbDOS. Используется только виртуальb
ной DOSbмашиной или подсистемой "Windows on windows".
2Ah
Сервис для получения текущего значения системных часов.
2Bh,2Ch Сервис прямого переключения цепочек.
2Dh
Отладка.
2Eh
Выполнить системный сервис. Используется при передаче управлеb
ния в Windows NT с пользовательского на системный уровень. За доb
полнительной информацией обращайтесь к описанию команды
NTCALL в "Справочнике по командам SoftICE".
Продолжение на следующей странице

134

12. Исследование Windows NT
Преры[
вание

Назначение

30hb37h

Первичный контроллер прерываний (IRQ0bIRQ7). 30h b прерывание
от системных часов (IRQ0).

38hb3Fh

Вторичный контроллер прерываний (IRQ8bIRQ15).

Векторы прерываний 30hb3Fh назначены первичному и вторичному контроллеb
рам прерываний, следовательно аппаратные прерывания IRQ0bIRQ15 тоже прохоb
дят через IDT. Как правило, эти прерывания не перехватываются, а система переb
дает их в стандартные программыbзаглушки. Если требуется перехват этих аппаb
ратных прерываний, то необходимо подключить специальные драйверы, а после
работы отключить их.
Стандартные программыbзаглушки имеют имена KiUnexpectedInterrupt#, где
# соответствует номеру прерывания. Чтобы определить, какой вектор присвоен
данной заглушке следует прибавить 30h к интересуемому номеру. Например
KiUnexpectedInterrupt2 подключен к вектору 32h (30h + 2) таблицы прерываний IDT.
Прерывания виртуальной DOSbмашины, которая включает в себя и подсистему
WOW (Windows on Windows), непосредственно через IDT не передаются, а эмулиb
руются генерацией общей ошибки защиты (GPF), которую анализирует специальb
ная программа в составе NTOSKRNL. В большинстве случает прерывания возвраb
щается обратно в VDM для дальнейшей обработки. Прерывание 21h MSbDOS обраb
батывается особым образом — для него существует нормальный дескриптор в IDT.
Это было сделано либо по соображениям производительности, либо для совместиb
мости программ (а, возможно, и по обоим причинам).
Драйверы могут подключать и отключать обработчики прерываний по мере необb
ходимости, используя системные вызовы IoConnectInterrrupt и IoDisconnectInterrupt.
Эти вызовы создают специальные переходники, содержащие данные и код, располоb
женные в невыгружаемой области памяти (NonbPageable Pool), чтобы обеспечить одb
новременное использование одного прерывания несколькими драйверами.
TSS (Task State Segment — Сегмент состояния задачи)
TSS предназначен для сохранения состояния процессора при переключении заb
дач или контекста. По соображениям производительности Windows NT не испольb
зует эту архитектурную особенность процессора, а поддерживает единственный
TSS, общий для всех процессов. Как было отмечено в предыдущем разделе, касаюb
щемся IDT, в Windows NT существуют и другие TSS, однако они используются
только в исключительных случаях, чтобы обезопасить систему от перезарузки
раньше, чем она сможет соответствующим образом это исключение обработать.
Для получения содержимого текущего сегмента состояния задачи в SoftICE испольb
зуется команда TSS.
TSS имеет специальное поле, в котором содержится смещение начала карты
ввода/вывода относительно начала сегмента. Карта ввода/вывода определяет, к
каким портам, если таковые вообще существуют, возможен доступ для программы,
исполняемой в 3 кольце защиты. При работе виртуальной DOSbмашины под управb
лением Windows NT 3.51 TSS содержит действительное значение смещения начала
карты ввода/вывода, которая перехватывает обращения к портам для последующей
эмуляции их операционной системой. Во время работы приложений Win32 TSS соb
держит смещение, указывающее за пределы сегмента, что позволяет операционной
системе перехватывать все обращения к портам ввода/вывода.

Внутри ядра Windows NT

135

В составе структуры TSS лишь одно поле представляет реальный интерес — адb
рес стека для нулевого кольца защиты. Этот стек используется при переходе с
пользовательского уровня (кольцо 3) на системный.
GDT (Global Descriptor Table — глобальная таблица дескрипторов)
Windows NT использует непрерывную (flat) 32bбитную модель адресации. Хотя
применение селекторов все еще необходимо, использует она их крайне ограниченb
но. Большинство приложений Win32 и драйверов вообще не знают об их сущестb
вовании. Ниже приведен фрагмент вывода команды GDT, который демонстрирует,
какие селекторы содержит глобальная таблица.
GDTbase=80036000
Limit=03FF
0008
Code32
Base=00000000
Lim=FFFFFFFF
DPL=0
P
RE
0010
Data32
Base=00000000
Lim=FFFFFFFF
DPL=0
P
RW
001B
Code32
Base=00000000
Lim=FFFFFFFF
DPL=3
P
RE
0023
Data32
Base=00000000
Lim=FFFFFFFF
DPL=3
P
RW
0028
TSS32
Base=8000B000
Lim=000020AB
DPL=0
P
B
0030
Data32
Base=FFDFF000
Lim=00001FFF
DPL=0
P
RW
003B
Data32
Base=7FFDE000
Lim=00000FFF
DPL=3
P
RW
0043
Data16
Base=00000400
Lim=0000FFFF
DPL=3
P
RW
0048
LDT
Base=E156C000
Lim=0000FFEF
DPL=0
P
0050
TSS32
Base=80143FE0
Lim=00000068
DPL=0
P
0058
TSS32
Base=80144048
Lim=00000068
DPL=0
P
Обратите внимание, что первые 4 селектора адресуют весь 4 Гб диапазон памяb
ти. Эти селекторы используются драйверами и приложениями Win32. Первые два
селектора имеют DPL, равный нулю, и используются драйверами и системными
компонентами для обращения к системным кодам, данным и стекам. Селекторы
1Bh и 23h предназначены для приложений Win32 и адресуют коды, данные и стеки
пользовательского уровня; фактически это константы, и Windows NT часто обраb
щается к ним, используя их абсолютные значения.
Селектор 30h адресует область контроля процессора ядра (Kernel Processor
Control Region) и всегда имеет на базовый адрес 0xFFDFF000. При выполнении
системного кода этот селектор хранится в сегментном регистре FS. Кроме множеb
ства других функций, эта область содержит по смещению 0 текущий кадр обработb
ки исключений ядра.
Аналогично, селектор 3Bh является селектором пользовательского уровня, коb
торый адресует текущий блок переменных окружения потока (User Thread
Environment Block b UTEB). Этот селектор сохраняется в регистре FS при исполнеb
нии кода пользовательского уровня и содержит текущий кадр обработки исключеb
ний пользовательского уровня по смещению 0. Базовый адрес этого селектора изb
меняется в зависимости от того, какой поток выполняется в настоящий момент.
Когда происходит переключение потоков, базовый адрес этого селектора в GDT
изменяется, чтобы указать на новый UTEB.
Селектор 48h является селектором LDT и используется только процессами
VDM. Приложения Win32 и драйверы не используют LDT. Во время исполнения
процесса Win32 регистр LDT процессора Intel содержит NULL. В этом случае коb
манда LDT SoftICE выдаст сообщение об ошибке "No LDT" (LDT отсутствует). При
выполнении VDMb или WOWbпроцесса действительное значение регистра LDT усb
танавливается из этого селектора GDT. Во время переключения контекста процесb
са содержимое LDT восстанавливается в этот селектор из блока окружения проb
цесса ядра (Kernel Process Environment Block b KPEB), для установки правильных
значений базового адреса и предела.

Область
каталогов
таблиц страниц

Таблица
объектов
GDI Win32

Таблица
объектов
USER Win32

NTOSKRNL

Дополнительные
драйверы
этапа загрузки

Невыгружаемая
область

IDT

База данных
страниц

Невыгружаемая
область

Системный
поток ядра
системы

GDT

Выгружаемая
область N

Блок контроля
процессора
(Nй процессор)

...

Блок контроля
процессора
(2й процессор)

Блок контроля
процессора
(1й процессор)

Автоматически
загружаемые
драйверы
Драйверы,
загружаемые
пользователем

Блок контроля
процессора

Контроль
процессоров
0xFEDFF000 O
0xFFFFFFFF

Системные
драйверы

Невыгружаемая
область памяти
0xFB000000 O
0xFEDFEFFF

Таблица
дескрипторов
системы

Кэш таблицы
дескрипторов
системы

...

Выгружаемая
область 2

Выгружаемая
область 1

Выгружаемая
область памяти
0xE1000000 O
0xE57FFFFF

TSS

Уровень
аппаратной
абстракции

Менеджер кэша
отображаемой
памяти
Windows NT

Область
таблиц
страниц

В Windows
NT 3.51
не выделяется

Драйверы
этапа загрузки

Таблица
страниц
системы

Системный
кэш
0xC1000000 O
0xD8FFFFFF

Системные
таблицы
0xC0000000 O
0xC0FFFFFF

Область системной
видимости
0xA0000000 O
0xBFFFFFFF

Область
системных кодов
0x80000000 O
0x9FFFFFFF

136
12. Исследование Windows NT

Внутри ядра Windows NT

137

LDT (Local Descriptor Table — локальная таблица дескрипторов)
Под управлением Windows NT локальные таблицы дескрипторов используются
только в виртуальных DOSbмашинах (VDM — Virtual DOS Machines) и создаются
для каждой структуры данных процесса. 16bбитная WOWbподсистема исполняется
в рамках NTVDM процесса и также имеет LDT. Подобно Windows 3.1 LDT для
WOW содержит селекторы для каждого 16bбитного исполняемого кода защищенb
ного режима и для сегментов данных каждого загруженного 16bбитного приложеb
ния или DLL. Также она содержит селекторы каждой базы данных задач, базы данb
ных модулей, каждой локальной кучи и блока памяти, выделенного в глобальных
областях, и для всех USER и GDIbобъектов, требующих создания селектора. Так
как при работе WOW количество необходимых селекторов может оказаться достаb
точно большим, создается LDT максимального размера, основная масса элементов в
которой зарезервирована для дальнейшего использования. Эти селекторы выдеb
ляются по мере необходимости. При работе обычных (неbWOW) VDM размер LDT
значительно меньше.

Распределение памяти в Windows NT
Windows NT резервирует старшие 2 Гб адресного пространства для системного
использования. В область с адресами 0x80000000 b 0xFFFFFFFF загружаются драйb
веры устройств, системные переменные, таблицы и структуры данных потоков и
процессов. Хотя точную карту распределения адресов системной памяти составить
невозможно, однако можно в целом охарактеризовать различные области, выдеb
ляемые для определенных нужд. На следующей диаграмме представлены общие
принципы размещения системных областей. Помните, однако, что здесь приведеb
ны лишь приблизительные диапазоны адресов, так как большинство областей могут
находиться в любом месте адресного пространства.
На диаграмме на странице 136 представлена общая схема распределения сисb
темной памяти Windows NT.
 Область системных кодов
В эту область записываются драйверы этапа загрузки, NTOSKRNL и компоb
ненты уровня аппаратной абстракции (HAL). Остальные драйверы размещаb
ются в невыгружаемой области системных адресов, находящейся в верхней
части памяти. С помощью команд MOD и MAP32 SoftICE можно получить адb
реса и протяженность блока загрузочных драйверов. В этой же области нахоb
дятся такие структуры как TSS, IDT и GDT.
Замечание: LDT создаются в выгружаемой области.
 Область системной видимости
Область системной видимости упоминается в Windows NT версии 3.51 но, поb
видимому, никогда в ней не используется. В последующих версиях Windows NT в
этой области размещаются глобальные таблицы объектов GDI и USER. С помощью
команды OBJTAB можно получить информацию о таблице объектов USER.
 Область системных таблиц
Эта область памяти содержит таблицы страниц процесса и соответствующие
структуры данных. Это одна из немногих областей системной памяти, котоb
рая фактически не является глобальной, так как каждый процесс имеет свои
уникальные таблицы страниц. Когда происходит переключение контекста
процесса, физический адрес каталога таблиц страниц извлекается из блока
переменных окружения процесса ядра (Kernel Process Environment Block b
KPEB) и загружается в регистр CR3. Это приводит к переадресации соответb
ствующих блоков памяти на нужную область. Несмотря на то, что линейные

138

12. Исследование Windows NT
адреса остаются теми же самыми, используемые физические адреса принадb
лежат именно данному процессу. В терминологии SoftICE каталогу таблиц
страниц соответствует контекст адреса. Когда Вы пользуетесь командой
ADDR для установления соответствующего процессу контекста, Вы фактичеb
ски загружаете информацию каталога таблиц страниц данного процесса.
Чтобы выполнять отображение линейной памяти в физическую, Windows NT реb
зервирует в линейной системной области блок размером 4 Мб. Эти 4 Мб испольb
зуются для создания каталога таблиц страниц и полного набора таблиц страниц.
Необходимость выделения именно 4 Мб можно проверить, исходя из того, что
существует только один каталог таблиц страниц, содержащий 1024 дескриптора.
Чтобы отобразить 4 Гб линейного адресного пространства, каждая таблица страb
ниц должна содержать информацию о 4 Мб линейного адресного пространства
(4 Гб/1024). С другой стороны каждая таблица страниц содержит информацию о
множестве физических страниц, которые в Windows NT имеют размер 4 Кб, поb
этому, умножая 1024 на 4096 (размер страницы физической памяти), получаем
запрашиваемые 4 Мб. Следовательно, чтобы операционная система могла исb
пользовать виртуальную память и физические страницы по 4 Кб, необходимо
выделить 4 Мб для отображения всего адресного пространства. Как Windows NT,
так и Windows 95 применяют простой и эффективный метод, выделяя для этой
цели непрерывный блок линейной памяти.
В данной схеме каталог таблиц страниц фактически выполняет две функции.
Помимо того, что он выполняет свою прямую функцию, он еще является и табb
лицей страниц, представляющей область размеров 4 Мб с адресами 0xC0000000
b 0xC03FFFFF, поэтому дескриптор, отображающий эту область должен указыb
вать сам на себя. Если выполнить команду PAGE SoftICE, то в верхней части
листинга вывода будет показан физический адрес, в который дескриптор отоb
бражает блок с адресами 0xC0000000 b 0xC03FFFFF. Если же выполнить команb
ду ADDR, чтобы получить содержимое регистра CR3 (физический адрес каталоb
га таблиц страниц) и передать его в качестве параметра команде PHYS, то будут
показаны все линейные адреса, которые отображаются на физический адрес
каталога таблиц страниц. Одним из этих адресов является адрес 0xC0300000.
Следующие примеры иллюстрируют описанные выше взаимосвязи. Наибоb
лее важные значения выделены жирным шрифтом.
 Применение команды ADDR для получения физического адреса каталога
таблиц страниц (содержимое регистра CR3).
:addr
CR3
LDT Base:Limit
KPEB Addr
PID
Name
00030000
FF116020
0002
System
0115A000
FF0AAA80
0051
RpcSs
0073B000
FF083020
004E
nddeagnt
00653000
E13BB000:0C3F
FF080020
0061
ntvdm
00AEE000
FF07A600
0069
Explorer
01084000
FF06ECA0
0077
FINDFAST
010E9000
FF06CDE0
007B
MSOFFICE
*01F6E000
FF088C60
006A
WINWORD
01E0A000
FF09CCA0
008B
4NT
017D3000
E1541000:018F
FF09C560
006D
ntvdm
00030000
80140BA0
0000
Idle
 Использование физического адреса в качестве параметра команды PHYS
для получения всех линейных адресов, отображаемых в данный физичеb
ский адрес (одна физическая страница может быть использована для отоb
бражения более чем одного линейного адреса, и один линейный адрес моb
жет быть отображен в разные физические страницы).

Внутри ядра Windows NT

139

:phys 1F6E000
C0300000
 Использование линейного адреса (0xC0300000) с командой PAGE, чтобы
проверить соответствие физической страницы данному линейному адресу.
:page C0300000
Linear Physical Attributes
C0300000 01F6E000 P D A S RW
 Использование команды PAGE без параметров, чтобы увидеть отображение
всего блока линейных адресов. Это полезно для получения физического адb
реса каталога таблиц страниц и проверки того факта, что таблица страниц
операционной системы отображается в линейный адрес 0xC0000000 (привоb
дится сокращенный вывод).
:page
Page Directory
Physical=01F6E000
Physical
Attributes
Linear Address Range
01358000
P
A S RW
A0000000 - A03FFFFF
017F0000
P
A S RW
A0400000 - A07FFFFF
01727000
P
A S RW
A0800000 - A0BFFFFF
01F6E000
P
A S RW
C0000000 - C03FFFFF
0066F000
P
A S RW
C0400000 - C07FFFFF
00041000
P
A S RW
C0C00000 - C0FFFFFF
00042000
P
A S RW
C1000000 - C13FFFFF
Дескрипторы системной таблицы страниц (Page Table Entries)
и виртуальные дескрипторы
Сокращение PTE, которое появлялось во многих местах диаграммы распредеb
ления системной памяти, обозначает Page Table Entry — Дескриптор Таблицы
Страниц. PTE является одним из 1024 дескрипторов, содержащихся в таблице
страниц. Каждый такой дескриптор описывает одну страницу памяти, включая
ее физический адрес и атрибуты. Так как Windows NT может выполняться не
только на процессорах фирма Intel, и так как операционной системе может поb
надобиться защищать страницы памяти на таком уровне, который данным проb
цессором не поддерживается, Windows NT создает так называемые виртуальb
ные PTE или виртуальные дескрипторы. По свой структуре они подобны дескb
рипторам фирмы Intel, однако включают в себя и некоторые дополнительные
атрибуты. Перегружая значения атрибутов, операционная система может конb
тролировать состояние "ошибка страницы" и затем проверить дополнительные
атрибуты соответствующего виртуального дескриптора, чтобы определить
причину его возникновения. Манипулирование виртуальными дескрипторами
и трансляция их значений в действительные дескрипторы процессора выполb
няется в NTOSKRNL. Обратите внимание, что операционная система постоянb
но проверяет соответствие значений виртуальных дескрипторов физическим.
Это позволяет не допустить прямое вмешательство в содержимое дескрипторов
таблиц страниц со стороны приложений или драйверов устройств.
 Область выгружаемой памяти (Paged Pool Area)
Выгружаемая системная память представляет собой область, где функция
ntoskrnl!ExAllocatePool (и другие связанные с ней функции) размещает блоки,
которые при необходимости могут быть выгружены на диск. Она представляb
ет собой прямую противоположность невыгружаемой системной памяти.
Блоки, размещенные невыгружаемой области, постоянно находятся в памяти
и предназначены для таких структур, как обработчики прерываний, которые
требуют высокой производительности или гарантии постоянной доступности
для использования.

140

12. Исследование Windows NT
Операционная система активно использует данную область, так как именно
здесь создается большинство системных объектов. Отметьте для себя, что наb
чальный адрес области, ее размер и количество страниц определяется динамичеb
ски во время инициализации. Приведенные ранее значения адресов являются
лишь приблизительными. Для того, что узнать точные значения, загрузите отлаb
дочную информацию для NTOSKRNL и проверьте соответствующие переменb
ные, которые описывают конфигурацию выгружаемой области. (Некоторые из
них можно просмотреть, выдав команду SYM с параметром “MmPaged*”.)
Несмотря на то, что существует только одна область выгружаемой памяти, коb
личество размещенных в ней блоков, определяемое во время инициализации
системы, может быть велико. С одной стороны, такая работа должна выполb
няться чрезвычайно аккуратно, но, с другой стороны, так как, размещение
блоков происходит достаточно часто, наличие единственной структуры данb
ных, владеть которой в момент выделения или возвращения памяти может
только один поток, создает в системе узкое место. Чтобы избежать потери
производительности, в данной области образовано несколько регионов, кажb
дая с собственными данными, с собственной структурой описания и собстb
венным семафором для синхронизации потоков. Это позволяет нескольким
потокам одновременно производить операции с памятью. Если вы решите
реализовать аналогичную технику в своем приложении, то учтите, что наb
кладные расходы в данном случае чрезвычайно малы, и в системе достаточно
наличия 4b5 регионов. Однако, прежде чем реализовывать эту схему, следует
точно определить наличие узкого места, чтобы не заниматься решением неb
существующей проблемы.
 Невыгружаемая системная область (NonPaged Pool Area)
Эта область линейных адресов предназначена для системных компонентов и
структур данных, которые должны находиться в памяти постоянно. Сюда
включаются драйверы, стеки потоков ядра, 2 региона для выделения блоков
памяти и база данных страниц. В противоречие тому, что было сказано ранее
о том, что страницы данной области не могут быть выгружены из памяти, иноb
гда это всеbтаки возможно. В частности, это касается стеков потоков ядра и
пространства адресов процесса, которые часто могут отсутствовать.
Данная область во многом сходна с областью выгружаемой памяти, за исклюb
чением того, что размещенные здесь объекты не могут быть выгружены ни при
каких условиях. Выделяемая здесь память используется для размещения клюb
чевых структур системы, таких как процесс ядра и блоки окружения потоков.
Имеется также еще один регион, используемый для размещения объектов, коb
торые должны быть всегда доступны. Для этого во время инициализации сисb
темы NTOSKRNL резервирует небольшое количество физической памяти.
Размер блока выделяемой здесь памяти должен быть меньше одной страницы
(4 Кб). Если запрос на выделение памяти в этом регионе не может быть выполb
нен, или если запрашивается более 4 Кб, система выводит "синий экран".
 Область контроля процессора (Processor Control Region)
В самой верхней части системных адресов находится область контроля проb
цессора. Здесь Windows NT размещает блоки контроля процессора (Processor
Control Block, PCRB) — структуры данных для каждого процессора в системе,
и глобальную структуру — область контроля процессора (Processor Control
Region), отражающую текущее состояние системы. В последней содержится
такая ключевая информация, как выполняемый в настоящий момент поток
ядра, текущий уровень запроса прерывания, текущий кадр обработки струкb
турных исключений, базовые адреса IDT, TSS и GDT, и указатели стеков цеb
почек ядра системы. Небольшая часть структур PCR и PCRB документироваb
на в файле NTDDK.H.

Подсистема Win32

141

В большинстве случаев авторам драйверов устройств необходимо знать текущее
прерывание в системе, на котором они будут исполняться. Несмотря на то, что
его можно узнать, проанализировав содержимое области контроля процессора
по смещению 24h, значительно проще получить ее с помощью команды IRQL:
? IRQL
00000002h
Наиболее полезной информацией из блока контроля процессора является
указатель текущего потока ядра. Он находится в блоке контроля процессора
по смещению 04h, однако чаще всего на него ссылаются через PCR по смещеb
нию 124h. Это возможно по той причине, что блок процессора вложен в PCR
по смещению 0x120. Код, необходимый для получения указателя текущей цеb
почки, выглядит следующим образом:
mov reg,FS:[124]
Вспомните, что при работе в системном режиме, регистр FS содержит селекb
тор из GDT, чей базовый адрес указывает на начало области контроля процесb
сора. SoftICE позволяет получить эту информацию более простым способом,
используя встроенные функции thread или tid:
? thread
FF088E90h
? tid
71h
Более подробную информацию о текущем потоке можно получить, используя
следующие команды:
:thread tid
TID
Krnl TEB
0071
FF0889E0
:thread thread

StackBtm
FC42A000

StkTop
FC430000

StackPtr
FC42FE5C

User TEB
7FFDE000

Process(Id)
WINWORD(6A)

TID
Krnl TEB
StackBtm StkTop
StackPtr
User TEB
Process(Id)
0071
FF0889E0
FC42A000 FC430000 FC42FE5C
7FFDE000
WINWORD(6A)
Текущий процесс ни в PCR, ни в PCRB не сохраняется. Windows NT получает
указатель текущего процесса через текущий поток. Пример кода для получеb
ния указателя текущего процесса приведен ниже:
mov eax, FS:[124] ; Zbnudt nld Z (KTEB)
mov esi, [eax+40h] ; Zbnudt nmbt Z[q Z (KPEB)

Подсистема Win32
Внутри CSRSS
Процесс CSRSS (Client Server Runtime Subsystem — подсистема "клиентbсервер"
времени исполнения) подсистемы Win32 интегрирует в себе Win32 API. Этот API
выполняет различные функции, включая и те, которые традиционно приписываютb
ся таким компонентам Windows, как KERNEL, USER и GDI. Хотя эти стандартные
модули присутствуют в Windows NT 3.51 (и в меньшей степени в последующих верb


Все описанное ниже относится, главным образом, к Windows NT 3.51. В v.4.0 эта
подсистема претерпела значительные изменения.

142

12. Исследование Windows NT

сиях) в виде 32bбитных DLL, основная часть функций на самом деле реализована в
WINSRV.DLL. Вызовы функций, традиционно ассоциирующиеся с одним из этих
стандартных компонентов Windows, фактически выполнены в них в виде переадb
ресации к другим модулям, например NTDLL.DLL или для выполнения обслуживаb
ния используют межпроцессовые взаимодействия с CSRSS.
Большинство API вызовов USER и GDI проходят через соответствующий 32bбитый
модуль в адресной пространство процесса. Там они переводятся в форму сообщений
местных процедурных вызовов (Local Procedure Call — LPC) и переправляются в
CSRSS для дальнейшего выполнения. Легко представить себе, насколько этот мехаb
низм, хотя и значительно более оптимизированный для данных условий, чем механизм
удаленных процедурных вызовов (Remote Procedure Call — RPC), может снизить проb
изводительность системы по сравнению с простым вывозом функций. Каждый раз,
когда Вы вызываете функцию IsWindows из USER.DLL, этот вызов должен упаковыb
ваться в LPC и пересылаться как системное сообщение в CSRSS. Для того, чтобы
CSRSS смог обработать это сообщение, должно произойти переключение контекста,
должен быть определен необходимый сервис, проверена допустимость параметров, и
лишь затем может быть выполнено требуемое действие. После его завершения на стоb
роне CSRSS необходимо составить LPCbответ клиенту (Вашему приложению), что
включает в себя новое переключение контекста и распаковку LPCbответа. Уфbф! И
все это необходимо проделать лишь для того, чтобы определить, описывает ли переb
данный дескриптор (handle) реально существующее окно или нет.
При проектировании последующих версий Windows NT разработчики фирмы
Microsoft постаралась, на сколько это оказалось возможным, избежать подобных наb
кладных расходов. Воbпервых, они перенесли большую часть исполняемых кодов из
WINSRV.DLL в модули USER32 и GDI32, которые работают непосредственно в адресb
ном пространстве Вашего приложения. Это позволяет запускать наиболее часто исb
пользуемые процедуры с помощью обычных вызовов, не прибегая к LPC. Воbвторых,
чтобы исключить переключение контекста в CSRSS для вызова процедур в
WINSRV.DLL, новый системный драйвер WIN32K.SYS обеспечивает более быстрое
выполнение процедур из модулей USER и GDI с помощью простого перехода из польb
зовательского режима в системный. Использование WIN32K.SYS в качестве драйвера,
предоставляющего сервис на прикладном уровне, позволяет Windows NT поддержиb
вать высокий уровень инкапсуляции и обеспечивает большую устойчивость, формиb
руя значительно более эффективную псевдоb"клиентbсерверную" архитектуру.
Хотя CSRSS выполняется как отдельный процесс, тем не менее он оказывает
большое воздействие на адресное пространство любого приложения Win32. Если для
Вашего процесса выполнить команду HEAP32, то Вы обнаружите по крайней мере
2 кучи, которые он не создавал, но которые ему принадлежат. Первая создается при
инициализации процесса и является кучей по умолчанию. Вторая создается непоb
средственно CSRSS. Могут существовать и другие не создававшиеся приложением
кучи, но тем не менее находящиеся в его адресном пространстве. Как правило, они
расположены в верхней части пользовательского адресного пространства, и их можb
но обнаружить, выполнив команду QUERY, и, при этом, они не выявляются командой
HEAP32. Причина такого поведения достаточно проста: для каждого пользовательb
ского процесса создается список куч, а команда HEAP32 использует этот список для
их обнаружения параметров. Если куча не создавалась Вашим процессом или его поb
томками, то она и не появится в этом списке. Команда QUERY сканирует адресное
пространство приложения, используя работу для идентификации областей памяти
команды WHAT. Если последняя находит область, чей базовый адрес совпадает с адb
ресом кучи, занесенной в список, то он и обозначается как куча. Если же WHAT не в
состоянии идентифицировать область таким способом, то исследует дескриптор, что
позволяет определить область как кучу или ее сегмент.

Подсистема Win32

143

Кучи, существующие в адресном пространстве процесса, но не перечисленные
в его списке, были отображены в данное адресное пространство другим процессом.
В большинстве случает этим занимается подсистема CSRSS. Во время инициализаb
ции она создает кучу по стандартному базовому адресу. Во время запуска нового
процесса эта куча переотображается в его адресное пространство по тому же саb
мому базовому адресу, что теоретически позволяет обоим процессам использовать
одну кучу. На практике же существуют разные обстоятельства, которые могут
препятствовать такой работе — одним из них является синхронизация. Заметьте
себе, что в последующих версиях Windows NT в адресное пространство процесса
может быть отображено более одной кучи, причем они могут отображаться в разb
личных процессах по разным базовым адресам. Команда QUERY помечает это обb
стоятельство в своем листинге. Кроме того, новые версии операционной системы
используют кучи, созданные в системном адресном пространстве, но, иногда, отоb
бражаемые в адресное пространство пользователя. Windows NT позволяет создаb
вать кучи в системном адресном пространстве, используя API, экспортируемое
NTOSKRNL. Эти вызовы сходны с аналогичным API, экспортируемым NTDLL.DLL.

Объекты USER и GDI
В Windows NT 3.51 процесс CSRSS подсистемы Win32 обеспечивает большую
часть традиционных функций подсистемы USER. API и структуры данных модуля
WINSRV.DLL управляют классами окон и их структурами, а также множеством
других типов данных USER.
В Windows NT 3.51 существуют следующие типы объектов USER (в скобках укаb
заны их идентификаторы).
FREE (0)

Дескриптор объекта не используется (или недейb
ствителен).

HWND (1)

Окна.

MENU (2)

Меню окна.

ICON/CURSOR (3)

Иконка или курсор окна.

DEFERWINDOWPOS (4)

Объект, возвращаемый
BeginDeferWindowPosition API.

HOOK (5)

Переадресатор перехвата сообщений.

THREADINFO (6)

Данные экземпляра потока клиента CSRSS.

QUEUE (7)

Очередь сообщений окна.

CPD (8)

Call Procedure Data thunk.

ACCELERATOR (9)

Таблица акселераторов.

WINDOW STATION (0xA)
DESKTOP (0xB)

Объект "Рабочий стол".

DDEOBJECT (0xC)

Объект DDE, например, строки.

В последующих версиях Windows NT добавлены (или переопределены) слеb
дующие объекты USER.

144

12. Исследование Windows NT
DESKTOP (bbb)

Этот тип объектов удален и теперь принадлежит объекту
ядра, который управляется менеджером объектов ядра
(Kernel Object Manager).

QUEUE (bbb)

Это тип объектов удален.

WINDOW
STATION (0xD)

Изменен идентификатор (ID) типа объекта. Также суb
ществует как объект ядра.

DDEOBJECT (0xA)

Изменен идентификатор (ID) типа объекта.

KEYBOARD
LAYOUT (0xE)

Новый тип объекта. Описывает раскладку клавиатуры.

CLIPBOARD
FORMAT (7)

Новый тип объекта. Зарегистрированные форматы
Clipboard.

Кроме поддержки структур данных объектов USER и GDI для каждого процесса,
CSRSS ведет главную таблицу дескрипторов для всех процессов. Объекты USER и
GDI разделены в две разные таблицы, имеющих одинаковое строение, но различные
функции управления. Все они имеют префикс "HM", к которому для функций GDI
добавляется символ "G". Так, HMAllocObject создает объекты USER, а HMGAlloc —
это программа API, создающая объекты GDI.
Управление дескрипторами USER и GDI спроектировано достаточно просто и
является хорошим примером того, как следует реализовывать базовое управление
абстрактными типами объектов. Например, этот API использует простую, но стаb
бильную технику для создания уникальных дескрипторов и поддержки счетчиков
обращений. При этом система спроектирована так, чтобы исключить возможность
непосредственного манипулирования объектами из любых внешних по отношению
к менеджеру приложений, включая USER32 и CSRSS. Такое исключение любых
внешних воздействий, включая и воздействия со стороны системы, позволяет гаb
рантировать правильность работы менеджера дескрипторов, обеспечивает точb
ность счетчиков и семафоров обращения в объектам.
Главные таблицы объектов, управляемые менеджером дескрипторов, представb
ляют собой массивы с изменяемыми размерами, но с фиксированным размером
элемента. В следующей таблице показаны поля таблицы объектов. (Обратите вниb
мание, что элементами таблицы являются только колонки, обозначенные жирным
шрифтом; колонки, озаглавленные курсивом, включены только для пояснений).
1 

 

  

     
(DWORD)
(DWORD) (BYTE)
(BYTE) (WORD)
0
NULL
NULL
FREE (0)
00
0001
00010000
1
HEAP *
HEAP *
DESKTOP (0C) 00
0001
00010001
2
HEAP *
HEAP *
HWND (04)
01
0003
00030002
Поле "Указатель объекта" указывает на действительные данные объекта.
Обычно оно указывает на одну из куч CSRSS или на выгружаемую область. Поле
"Тип" полностью соответствует своему названию. Счетчик экземпляров используb
ется при создании уникальных дескрипторов, а поле "Флаги" — для определения
специальных условий, например, таких как блокирование объекта потока для исb
ключительного использования.
0

Подсистема Win32

145

Как создаются значения дескрипторов
Изначально все счетчики экземпляров объектов установлены в 1. Когда выдеb
ляется новая позиция в таблице, то счетчик экземпляров комбинируется с индекb
сом выделяемой позиции, чтобы создать уникальное значение дескриптора. Когда
производится ссылка на объект, часть дескриптора, содержащая номер позиции,
извлекается и используется в качестве индекса. Для проверки подлинности дескb
риптора из таблицы получают значение счетчика экземпляров данного объекта и
сравнивают с проверяемым дескриптором. Если значения не совпадают, то дескb
риптор недействителен. Следующий пример иллюстрирует вышесказанное:
Создание дескриптора объекта:
ДескрипторОбъекта = ИндексПозиции + (СчетчикЭкземпляров c == %1)”
Функция HMAllocObject API реализована в составе WINSRV.DLL, а тип создаb
ваемого объекта передается в третьем параметре (Dword ptr esp [0Ch]). В приb
веденной макрокоманде на тип объекта ссылается запись вида “esp->c”, что эквиb
валентно ссылке в форме *(esp+c). Часть условного выражения "%1" представляb
ет собой подстановку аргумента; во время исполнения макрокоманды OBX вместо
него подставляется задаваемый аргумент, например:
:OBX 1 —> bpx winsrv!HMAllocObject if (esp->c == 1)
После установки данного прерывания, оно будет перехватывать все вызовы
HMAllocObject, которые требуют создания объекта типа "Окно".

Подсистема Win32

147

Адресное пространство процесса
Адресное пространство для процесса пользовательского режима отображается
в младшие 2 Гб с линейными адресами 0x00000000 b 0x7FFFFFFF. Верхние 2 Гб заb
резервированы для ядра операционной системы и драйверов устройств.
В общем случае в адресном пространстве приложения Win32 для предопредеb
ленных целей выделяются следующие области линейной памяти.
Линейный адрес

Назначение области

Линейный адрес

Назначение области

0x00000000 b
0x0000FFFF

Защищенная область. Используется для перехвата опеb
раций записи с нулевым (NULL) указателем.

0x00010000

Стандартный адрес загрузки процесса Win32.

0x70000000 b
0x78000000

Стандартная область загрузки DLL подсистемы Win32.

0x7FFB0000 b
0x7FFD3FFF

Кодовые таблицы ANSI и OEM. Таблица(цы) трансляции
Unicode.

0x7FFDE000 b
0x7FFDEFFF

Главный блок переменных окружения потока (thread
environment block) пользовательского режима.

0x7FFDF000 b
0x7FFDFFFF

Блок переменных окружения процесса (process
environment block b UPEB) пользовательского режима.

0x7FFE0000 b
0x7FFE0FFF

Область очереди сообщений.

0x7FFFF000 b
0x7FFFFFFF

Защищенная область (используется аналогично области
0x00000 b 0x0FFFF).

В Windows NT младшие и старшие 64 Кб адресного пространства пользовательb
ского режима зарезервированы и никогда не используются для отображения фиb
зической памяти. Младшие 64 Кб используются для перехвата операций записи с
использованием нулевых указателей (NULL).
По умолчанию адрес загрузки процессов под управлением Windows NT равен
0x10000. Однако, процессы часто изменяют базовый адрес загрузки. Так, наприb
мер, процессы, разработанные для операционной системы Windows 95 имеют заb
грузочный адрес, равный 0x400000. Для установки требуемого загрузочного адреса
.DLL или .EXEbфайлов следует использовать соответствующие параметры компоb
новщика или утилиту REBASE.
Область линейных адресов, начинающаяся от 0x70000000, это область, куда заb
гружаются модули подсистемы Win32; информацию о загруженных сюда модулях
можно получить, используя команды MOD, MAP32 или QUERY.
Блок окружения процесса пользователя всегда отображается на адрес 0x7FFDF000,
в то время как главный блок окружения потока пользователя размещается на одну
страницу ниже по адресу 0x7FFDE000. По мере создания других потоков, они размеb
щаются по границе страницы самого высокого еще неиспользуемого адреса.
Следующие пример использования команды THREAD показывает, каким образом
каждый последующий поток размещается страницей ниже относительно предыдущего:
:thread winword
TID
006B
007C
009C

Krnl TEB
FFA7FDA0
FF0A0AE0
FF04E4E0

StackBtm
FEAD7000
FEC2A000
FC8F9000

StkTop
FEADB000
FEC2D000
FC8FC000

StackPtr
FEADAE64
FEC2CE18
FC8FBE18

User TEB
7FFDE000
7FFDD000
7FFDC000

Process(Id)
WINWORD(83)
WINWORD(83)
WINWORD(83)

148

12. Исследование Windows NT

Для получения дополнительной информации об адресном пространстве процесb
са пользователя используйте команду QUERY. Эта команду сообщает о зарезервиb
рованных и/или переданных в пользование линейных областей. Для идентификаb
ции содержимого области она использует команду WHAT. С ее помощью мы может
посмотреть кучи процесса, модули, отображаемые в память файлы, а также стеки
потоков и их блоки окружения.

Функции управления кучами
Строение кучи
Любое пользовательское приложение прямо или косвенно использует функции
управления кучами, которые экспортируются KERNEL32 и NTDDL. Кучи предназнаb
чены для управления большими областями линейной памяти и для выделения в этих
областях меньших по размеру блоков. Ядро реализации этих функций находится в
NTDLL, однако некоторые функции, как, например, HeapCreate и HeapValidate, эксb
портируются из KERNEL32. Так как в модуле KERNEL32 не содержится кода для неb
которых функций (например, HeapFree), то загрузчик исправляет указатели их выb
зова на код, расположенный в NTDLL.
Замечание: Методика замены экспортирования функций из одного модуля на
функции, экспортируемые другим модулем, называется 'snapping'
(перенаправление).
Хотя с точки зрения приложения управлять кучами относительно несложно,
однако, реализация API и структур данных не столь проста. Управление кучей ушb
ло достаточно далеко от стандартных функций языка "C" malloc() и free(), особенно
в том, что касается выделения больших раздробленных областей линейной памяти,
используемых для дальнейшего распределения меньших блоков, и объединения
смежных блоков свободной памяти. Функции кучи выполняют быстрый выбор опb
тимального по размерам блока для удовлетворения запроса, обеспечивают безоb
пасное взаимодействие потоков при операциях выделения памяти, а также предосb
тавляют большое количество информации, касающееся параметров кучи, и подb
держивают функции отладки.
Главная структура данных кучи достаточно велика, она занимает около 1400 байт
в обычной версии и примерно в 2 раза больше в отладочной. И это не считая дополb
нительных структур данных, участвующих в управлении областями линейных адреb
сов. Большая часть этой структуры занята 128 узлами двунаправленного списка своb
бодных блоков. Для каждого значения меньше 1 Кб создается свой двунаправленный
список, в котором хранятся блоки одного размера. Блоки больше 1 Кб хранятся в одb
ном общем сортированном двунаправленном списке. Это позволяет очень быстро
выполнять запрос на выделение оптимального по размеру блока памяти. Вот Вам наb
глядный пример решения компромисса в пользу большей скорости обработки запроb
са и в ущерб объему структур данных.
Для того, чтобы понять особенности строения и реализации функций управления
кучами, очень важно уяснить, что куча Win32 не обязана быть представлена единым
непрерывным блоком линейной памяти. Для куч с изменяемыми размерами с помоb
щью функции VirtualAlloc может быть выделено множество линейных областей, коb
торые в общем случае не обязательно будут непрерывными. Для отслеживания всех
составляющих кучу областей линейной памяти создаются специальные структуры,
называемые сегментами кучи. Другой важной особенностью организации API куч
является двухстадийность процесса резервирования и выделения виртуальной памяb
ти, который обеспечивается функцией VirlualAlloc и связанными с ней другими
функциями. Отслеживание того, какая память лишь зарезервирована, а какая уже
распределена, осуществляется с помощью структур данных, известных как таблицы
нераспределенных областей (Uncommitted Range Tables — UCR).

Подсистема Win32

149

Когда функция Ntdll!RtlCreateHeap() создает и инициализирует кучу, она выдеb
ляет начальный виртуальный регион памяти для ее размещения, и строит соответb
ствующие структуры данных. В первых 4 Кб (размер одной страницы) создается
главная структура данных, и непосредственно после нее помещается 1й сегмент
кучи. Этот сегмент инициализируется таким образом, чтобы управлять первонаb
чальной областью виртуальной памяти, выделенной куче. Вся область памяти после
него доступна для дальнейшего выделения через функцию HeapAlloc(). Если в
1м сегменте резервируется область любого размера, то создается элемент таблицы
UCR для отслеживания оставшейся нераспределенной памяти.
Замечание: Функция Kernel32!HeapAlloc() перенаправляет свое действие функb
ции Ntdll!RtlAllocateHeap.
Кроме упоминавшихся выше 128 списков свободной памяти главная структура
кучи содержит 8 элементов таблицы UCR, что достаточно для небольших куч, однаb
ко, по мере необходимости может быть создано столько UCR, сколько потребуется.
Здесь же находится таблица из 16 указателей на сегменты кучи, поэтому больше
16 сегментов куча никогда не может иметь. Если куче требуется синхронизация
потоков, то заголовок кучи в конце главной структуры перед 1м сегментом дополb
няется структурой данных критической секции.
Приведенная ниже диаграмма в общих чертах иллюстрирует строение типичb
ной кучи и размещение наиболее важных ее частей относительно друг друга.
На левой части диаграммы показана выделенная куче область виртуальной памяти.
В начале выделенной области размещен заголовок кучи, сопровождаемый Сегментом
№1. Адрес этой структуры содержится в первом указателе таблицы указателей сегb
ментов. Остальная распределенная, но еще не затребованная память находится сразу
после 1го сегмента и помечена как свободная. После нее находится область, которая
зарезервирована для дальнейшего использования. Если поступает запрос на выделеb
ние большей области памяти, чем в настоящий момент распределено данной куче, то
для удовлетворения запроса ей самой выделяется дополнительный блок.
Таблица UCR
Элемент UCR

Заголовок кучи

Элемент UCR
Элемент UCR

Элемент UCR

Сегмент #1
Сегмент #2

Сегмент #1
Выделенная
куче память

Зарезервированная
куче областьпамяти

Линейная память

Линейная память

Элемент UCR

Сегмент #2
Выделенная
куче память

Зарезервированная
куче областьпамяти

150

12. Исследование Windows NT

Сегмент №1 содержит область виртуальной памяти, первоначально выделенной
куче для использования. Начальный адрес в сегменте равен базовому адресу кучи,
а конец области соответствует концу распределенной памяти. Заштрихованная
часть столбца диаграммы представляет зарезервированную область адресов, паb
мять для которой еще не выделена, поэтому заголовок использует свободный элеb
мент UCR для отслеживания этой области. Когда необходимо выделить память для
удовлетворения поступившего запроса, проверяются все элементы UCR данного
сегмента в поисках достаточного по размерам региона для ее размещения. Для
увеличения производительности системы сегменты кучи отслеживают наибольшие
доступные регионы UCR и общее число нераспределенных страниц в пределах
виртуальной памяти каждого сегмента.
В правой части диаграммы показана вторая область выделенной виртуальной
памяти, которая управляется с помощью Сегмента кучи №2. Дополнительные сегb
менты кучи создаются в тех случаях, когда размер запрашиваемой памяти превосb
ходит размер наибольшего нераспределенного региона, имеющегося в пределах
существующего сегмента. Однако, это возможно только в тех случаях, когда разb
мер требуемой памяти меньше предопределенного для кучи порога Vmthreshold,
иначе участок кучи распределяется непосредственно функцией VirtualAlloc, а ноb
вый сегмент не создается.
Как уже упоминалось, количество элементов UCR в заголовке кучи невелико. С
иллюстративной целью на диаграмме показана дополнительная таблица элементов
UCR, созданная специально для увеличения числа доступных UCRbэлементов. В
общем же случае необходимость в создании дополнительной таблицы возникает
достаточно редко, и она является признаком существования большого количества
сегментов или того, что эти сегменты сильно фрагментированы.
Фрагментация виртуальной памяти может произойти, когда функции управления
кучей начинают возвращать распределенную память в процессе слияния свободных
блоков. Термином возврат (decommitting) обозначается процесс перевода распредеb
ленной памяти в состояние зарезервированной или нераспределенной. Когда блок
свободной памяти начинает превышать размер одной физической страницы (4 Кб),
такая страница становится кандидатом на возвращение. Если при этом превышается
пороговое значение, то менеджер кучи начинает процесс возвращения свободных
страниц. В том случает, когда эти страницы не составляют непрерывного блока с суb
ществующим регионом зарезервированной памяти, для управления новым блоком
зарезервированной памяти необходимо использование нового элемента UCR.
В следующем примере показано исследование кучи по умолчанию с помощью
команды HEAP32.
1 Команда HEAP32 с параметром "bS" выдает информацию о сегменте для кучи
по умолчанию:
_\[ g\_
:heap32 -s 140000
Base

Id

Cmmt/Psnt/Rsvd

Segments

00140000 01

001C/0018/00E4

1

01

00140000-00240000

Flags

Process

00000002

Explorer

001C/0018/00E4

adZm_ Z\cd g\_ nud

E4000
\d\bt_e UCR

2 Применение параметра "bX" позволяет получить дополнительную информаb
цию о куче по умолчанию:

Подсистема Win32

151

:heap32 bx 140000
Extended Heap Summary for heap 00140000 in Explorer
Heap Base:

140000

Total Free:

6238

Heap Id:

1

Process:

Explorer

Alignment:

8

Log Mask:

10000

Reserved:

912k

Seg Reserve: 100000

Seg Commit: 2000

Committed:

Present:

112k

96k

Flags: GROWABLE
DeCommit:

1000

Total DeC:

10000

dfa_e [m\[ g\_ nud

VM Alloc: 7F000
Z[g nud

[m\[ `bd abc [Z[ab_dc
3 Параметр "bB" команды HEAP32 выдает адреса блоков памяти в куче по умолb
чанию:
:heap32 -b 140000
Base
Type
Size
Seg#
Flags
00140000
HEAP
580
01
00140580
SEGMENT
38
01
001405B8
ALLOC
30
01
В приведенном выше листинге можно увидеть, что заголовок кучи сопровожb
дается Сегментом кучи №1, а первый выделенный куче блок памяти размещаb
ется сразу после структуры данных Сегмента.
Управление блоками кучи
Как уже упоминалось в предыдущем разделе, функции управления кучами исb
пользуют API виртуальной памяти Win32 для размещения больших областей линейb
ной памяти и пользуются Сегментами кучи для обслуживания выделенных и зареb
зервированных областей. На базе всех этих функций строится механизм, который и
управляет выделением и возвращением блоков памяти в Вашем приложении.

Размер блока
в единицах выделения

Размер блока
в единицах выделения

Размер блока
в единицах выделения

Размер
предыдущего блока
в единицах выделения

Размер
предыдущего блока
в единицах выделения

Размер
предыдущего блока
в единицах выделения

Сегмент #

Сегмент #

Сегмент #

Флаги

Флаги

Флаги

Поле дополнительной
информации 1

Поле дополнительной
информации 1

Поле дополнительной
информации 1

Поле дополнительной
информации 2

Поле дополнительной
информации 2

Поле дополнительной
информации 2

Память
блока
кучи

Память
блока
кучи

Память
блока
кучи

152

12. Исследование Windows NT

Для управления памятью для каждого блока создаются заголовки. На привеb
денной диаграмме показано, каким образом менеджер куч управляет блоками не
прерывной памяти. Кроме того, менеджер кучи отслеживает блоки свободной паb
мяти с помощью двунаправленного списка, однако, указатели на предыдущий и поb
следующий узлы в заголовке блока не сохраняются. Вместо этого с данной целью
используются первые 2 двойных слова в памяти блока.
Как показано на диаграмме, каждый блок хранит в заголовке свой размер, а
также размер предыдущего блока, выраженные количеством единичных областей
выделения. Используя эти два размера, менеджер способен последовательно проb
смотреть все блоки кучи.
Память в куче выделяется участками, называемыми единичными областями выb
деления, и имеющих размер 8 байт. При необходимости величина запрашиваемой
памяти округляется вверх, чтобы быть кратной этому размеру. Это означает, что
размеры всех выделенных блоков кратны 8 байтам, и что размер любого блока моb
жет быть выражен в количестве единичных областей с помощью округления вверх
и деления на 8.
Например, если процесс требует выделения 32 байт, то число единиц выделения
составляет 32 / 8 = 4. Если же был запрос на 34 байта, то размер будет округлен
вверх до числа, кратного 8, а размер выделенной области составит 40 байт или
5 единиц выделения. Однако, процесс, запросивший память, ничего не знает о едиb
ницах выделения и обращается с выделенной ему памятью, как будто она составляb
ет ровно 34 байта.
При использовании в качестве единицы выделения 8 байт размер большинства
типичных запросов на выделение памяти может быть записан в одном слове, что,
однако, ограничивает размер блока кучи максимальным значением короткого безb
знакового целого или 0xFFFF единицами выделения. Другими словами, теоретичеb
ский предел размера блока составляет 0xFFFF * 8 или 524280 байт, что и документиb
ровано в описании функции HeapAlloc. Означает ли это, что программа не может
разместить в куче блок больше 512 Кб? И да, и нет. Блок размером более 512 Кб
размещен быть не может, однако, ничто не запрещает программе выделить область
линейной памяти с помощью функции VirtualAlloc. Именно эту функцию и вызыb
вает менеджер кучи в тех случаях, когда размер запрошенной для выделения обb
ласти памяти превышает величину VMThreshold. Переменная VMThreshold храb
нится в заголовке кучи и по умолчанию равна 520192 байт (0xFE00 единиц выделеb
ния). Когда менеджер кучи размещает большой блок памяти с помощью функции
VirtualAlloc, получающаяся в результате структура называется "Виртуально размеb
щенный блок" (Virtually Allocated Block — VAB).
Менеджер куч переходит по списку непрерывных блоков от одного к другому,
переводя размер блока в единицах выделения в байты и прибавляя его к базовому
адресу блока. Адрес предыдущего блока вычисляется аналогичным образом, вычиb
тая размер предыдущего блока из базового адреса текущего блока. Эти операции
выполняются при слиянии свободных смежных блоков, при выделении блока
меньшего размера из большого свободного блока, а также, когда производится проb
верка кучи или элемента кучи.
Размер блока в единицах выделения важен для управления списком свободных
блоков, сортируемых по размеру, и информация о которых хранится в массиве
128 двунаправленных списков внутри заголовка кучи. Свободные блоки от 1 до
127 единиц выделения хранятся в списках, соответствующих их размеру. То есть все
свободные блоки длиной, например, 32 единицы хранятся в Heapb>FreeLists[32]. Так
как существование блоков с нулевым размером невозможно, то в списке с индексом
"0" хранятся все блоки больше 127 единиц; в списке они отсортированы в порядке
возрастания. Так как основная часть выделяемых блоков памяти имеют размер
меньше 128 единиц (1024 байт или 1 Кб), то такая организация обеспечивает быстрое

Подсистема Win32

153

выделение оптимального по размером блока. Блоки больше 1 Кб выделяются реже,
поэтому линейный поиск в единственном списке свободных блоков не оказывает на
общую производительность системы большого отрицательного влияния.
Поле флагов в заголовке блока кучи содержит специальные атрибуты блока.
Один бит обозначает свободен блок или занят. Другой используется, если это виртуb
ально размещенный блок (VAB). Третий ставится в последнем блоке выделенной куb
че памяти; такой блок используется в качестве маркера и обозначает, что после него
блоков нет. Применение этого флага позволяет проверить достоверность адреса
блока кучи значительно быстрее, чем проходить по всей цепочке сегментов UCR.
Еще один флаг маркирует блок для специальной "хвостовой" проверки. Во время отb
ладки процесса менеджер кучи маркирует блок соответствующим флагом. Когда
блок освобождается или свободный блок выделяется заново, то менеджер кучи моb
жет проверить, не было ли попыток писать информацию за пределами этого блока.
Поля дополнительной информации в заголовке блока используются по разному
в зависимости от того, выделен ли этот блок или свободен. В выделенном блоке
первое поле хранит количество дополнительных байтов, которые выделяются для
выравнивания блока по заданной границе или для дополнения до обязательного
размера выделения. Второе поле представляет собой псевдоbтаг. Однако, таги заb
головка и псевдоbтаги выходят за пределы данного обсуждения.
В свободном блоке дополнительные поля содержат байтовые и битовые маски,
которые обеспечивают доступ к битовому массиву списков свободных блоков в заb
головке кучи. Этот битовый массив обеспечивает быстрый поиск свободного блока
во время выделения памяти небольшого размера. Каждый бит в поле представляет
собой один из 127 списков свободных блоков, и, если он установлен, то в данном
списке имеется по крайней мере один элемент. Нулевое значение бита означает,
что свободных элементов такого размера нет, и для удовлетворения запроса необb
ходимо выделение большего блока. В первом дополнительном поле содержится
байтовый индекс этого битового массива. Второе дополнительное информационb
ное поле содержит инвертированную маску позиции бита в битовом массиве. Неb
обходимо, однако, отметить, что все вышеописанное относится только к версии
Windows 3.51. В последующих версиях битовый массив списков свободных блоков
все еще присутствует, однако, ни байтовый индекс, ни битовая маска не хранятся.
Структура самого блока памяти также зависит от его статуса. У выделенного
блока вся память используется запросившим его приложением. В свободном блоке
первые два двойных слова (1 единичная область выделения) хранит указатели двуb
направленного списка на предыдущий и следующий свободные блоки. Если проb
цесс, требующий выделения блока памяти, находится в состоянии отладки, то выb
деленный блок содержит маркер "концевой проверки". Свободные блоки маркиb
руются специальным тагом, который позволяет определить ситуацию, когда
делается попытка писать в блок с помощью недействительного указателя, или когда
процесс продолжает использовать блок после его освобождения.
На следующей диаграмме представлено общая структура выделенного блока кучи.
Заголовок
блока кучи

Память
блока

Хвостовой
маркер

Байты
дополнения

На данной диаграмме часть блока, обозначенная "байты дополнения" представb
ляет собой память, необходимую для дополнения размера до величины, кратной
единице выделения. Эта память не должна использоваться запросившим ее проb
цессом, однако, менеджер кучи не обеспечивает никакой непосредственной защиb
ты от записи в эту область. Хвостовая метка размещается непосредственно после
основной части блока. Если приложение производит запись за пределы блока, то

154

12. Исследование Windows NT

этот маркер оказывается разрушенным, а менеджер кучи сигнализирует об этом
отладчику с помощью отладочного сообщения и прерывания INT 3. При этом возb
можна запись в область байтов дополнения без разрушения хвостового маркера.
Такая ситуация не обрабатывается. Функции управления кучами предоставляют
возможность инициализировать выделяемую память нулями. Если во время отладb
ки такая возможность не используется, то менеджер кучи заполняет выделяемый
блок памяти специальной сигнатурой, что может быть использовано для проверки,
был ли инициализирован блок памяти Вашей программой.
На следующей диаграмме представлено общая структура свободного блока.
Заголовок
блока кучи

Указатели списка
свободных блоков

Заполненная байтами
сигнатуры память блока

При освобождении блока в режиме отладки менеджер кучи записывает в паb
мять блока специальную сигнатуру. При последующем выделении проверяет, не
была ли она изменена. Если это произошло, то менеджер выдает отладочное сообb
щение и генерирует прерывание INT 3, которое однако, в большинстве случаев отb
ладчиками игнорируется, так как было не ими установлено. В качестве дополниb
тельного замечания можно отметить, что размещение указателей списка узлов своb
бодных блоков в начале блока достаточно спорно, так как, если программа
продолжает использовать освобожденный блок памяти, она с большей вероятноb
стью перепишет данные в начале блока, чем в конце. Эти указатели чрезвычайно
важны для перемещения по куче, поэтому недействительный указатель вызывает
ситуацию исключения, однако, когда это происходит, то бывает достаточно сложно
восстановить исходный список свободных блоков.
Следующие примеры демонстрируют использование команды HEAP32 с целью
наблюдения и отладки элементов кучи.
В первом примере команда HEAP32 использована для прохождения по всем
элементам кучи с базовым адресом 0x140000. Параметр "bB" выдает базовый адрес
и размеры в таком виде, в котором их получает менеджер кучи. В противном слуb
чае эта информация показывается так, как ее получает приложение, запросившее
выделение памяти. Листинг сокращен для наглядности, а информация о 2 блоках,
выделенных жирным шрифтом, используется в дальнейших примерах.
:HEAP32 -b 140000
Base
Type
Size
Seg#
Flags
00140000
HEAP
580
01
00140580
SEGMENT
38
01
TAGGED | BUSYTAIL
001405B8
ALLOC
40
01
.

.

.

00143FE0
ALLOC
28
01
TAGGED | BUSYTAIL
00144008
FREE
FF8
01
FREECHECK | SENTINEL
Для исследования содержимого выделенного и свободного блоков памяти в слеb
дующих примерах приведены снимки памяти этих блоков.
Поля заголовка блока по адресу 0x143FE0 идентифицируются следующим обраb
зом. Этот блок имеет размер 5 единиц выделения (40 байт), и из них 0x1C байт заb
няты служебной информацией: заголовок блока (1 единица), "хвостовой маркер"
(1 единица), 1 элемент выравнивания (1 двойное слово) и одна дополнительная едиb
ница, оставшаяся от предыдущего выделения.

Подсистема Win32

155

[m\[ Z[aeanlg `b
pbgd
[m\[ `b i ad_dqf _\[ g\_
aZb_dbt_e `e
g
0010:00143FE0
0005
0006
00
07
1C
00
0010:00143FE8
00000000 00000000 60A25F52
0010:00143FF4
ABABABAB ABABABAB
0010:00143FFC
FEEEFEEE 00000000 00000000
fii \[[
_dZbtmn\e `e
Z\ct `b
Непосредственно вслед за выделенным блоком по адресу 0x144008 размещается
свободный блок. Он имеет размер 0x1FF единиц выделения, а размер предыдущего
блока равен 5 единицам. Для свободных блоков размером 1 Кб и более (больше 80h
единиц) байтовый индекс и поле битовой маски не используются и заполнены нуb
лями. Флаг этого блока говорит также, что этот блок последний в куче (бит 4, или
0x10). Сразу после заголовка находится область, в которой помещены указатели
двунаправленного списка для отслеживания свободных блоков. Оба указателя в
данном блоке имеют значение 0x1400B8. Всю остальную часть памяти после указаb
телей менеджер кучи заполнил специальной сигнатурой, которая проверяется во
время последующего выделения блока, выполнения операций слияния свободных
блоков или проверки целостности кучи.
[m\[ Z[aeanlg `b
pbgd
[m\[ `b i ad_dqf
_\[ g\_
0010:00144008

01FF

0010:00144010
0010:00144018
0010:00144028
0010:00144038
0010:00144048

001400B8
FEEEFEEE
FEEEFEEE
FEEEFEEE
FEEEFEEE

0005

00

14

`ie d_a
Zb `di \d
00
00

001400B8
; указатели двунаправленного списка
FEEEFEEE FEEEFEEE FEEEFEEE
FEEEFEEE FEEEFEEE FEEEFEEE
FEEEFEEE FEEEFEEE FEEEFEEE
FEEEFEEE FEEEFEEE FEEEFEEE
Jdg_n[e Z[i[d i`a_ `bd

Все человеческое знание проистекает из опыта.
Джон Локк

No man’s knowledge here can go beyond his experience.
John Locke

Приложение А.
Сообщения об ошибках
All break registers used, use in RAM only
(Все отладочные регистры задействованы,
можно установить прерывание только в RAM)
Вы пытаетесь установить контрольную точку с помощью команды BPX в постоb
янной памяти (ROM), а все отладочные регистры уже задействованы. В оперативb
ной памяти команда BPX еще может быть использована, так как в этом случае исb
пользуется отладочное прерывание INT 3. Для решения проблемы необходимо удаb
лить одну из контрольных точек типа BPM.
Attach to serial device has FAILED
(Неудачное подключение к последовательному устройству)
Неудачная попытка установления связи. Причинами могут быть неправильное
указание последовательного порта, повреждение последовательного кабеля, или на
удаленной машине не была запущена программа SERIAL.EXE.
BPM breakpoint limit exceeded
(Превышен предел количества BPM прерываний)
Изbза архитектурных ограничений процессоров x86 можно установить только
4 контрольных точки типа BPM. Чтобы установить новую контрольную точку такоb
го типа, необходимо удалить одну из старых.
BPMD address must be on DWord boundary
(Адрес в команде BPMD должен указывать на границу двойного слова)
Адрес, заданный в команде BPMD, не указывает на границу двойного слова. Адb
рес на границе двойного слова должен иметь "0" в двух последних наименее значаb
щих битах.
BPMW address must be on Word boundary
(Адрес в команде BPMW должен указывать на границу слова)
Адрес, заданный в команде BPMW, не указывает на границу слова. Адрес на
границе слова должен иметь "0" в последнем наименее значащем бите.

Приложение А. Сообщения об ошибках

157

Breakpoints not allowed within SoftICE
(Прерывания внутри SoftICE не разрешены)
Вы не можете установить контрольную точку внутри кода SoftICE.
Cannot interrupt to a less privileged level
Невозможно выполнить прерывание на менее привилегированном уровне
Вы не можете использовать команду GENINT для перехода с более привилегироb
ванного уровня на менее привилегированный. Это ограничение архитектуры проb
цессоров x86.
Debug register is already being used
(Отладочный регистр уже используется)
Отладочный регистр, указанный в команде BPM, уже используется другой конb
трольной точкой.
Duplicate breakpoint
(Дублирование контрольной точки)
Контрольная точка такого типа по указанному адресу уже существует.
Expecting value, not address
(Должно быть задано значение, а не адрес)
Вычислитель выражений разделяет операнды на значения и их адреса. Адреса
выражаются через селектор/сегмент и смещение, даже если используется непреb
рывная (flat) модель памяти. Некоторые операторы (например, * или /) могут испольb
зовать в качестве операндов только значения, и попытка использования в них адреb
сов приводит к выдаче данного сообщения. В некоторых случаях использование
операторов переадресации приводит к появлению адресов. Подробности смотрите в
разделе "Операторы" на странице 100.)
Expression?? What expression?
(Выражение?? Что вычислять?)
Вычислитель не находит в заданной команде объекта для вычислений. Обратиb
те внимание, что в более старых версиях SoftICE команда "?" могла быть использоb
вана для вызова подсказки. В текущей версии это уже не так — для вызова подb
сказки используйте команду H (F1).
Int 0D fault in SoftICE at address XXXXX offset XXXXX Fault Code=XXXX
(Ошибка прерывания Int 0D в коде SoftICE по адресу XXXXX
смещение XXXXX Код ошибки=XXXX)
(или)

158

Приложение А. Сообщения об ошибках
Int 0E Fault in SoftICE at address XXXXX offset XXXXX Fault Code=XXXX
(Ошибка прерывания Int 0E в коде SoftICE по адресу XXXXX
смещение XXXXX Код ошибки=XXXX)

Эти 2 сообщения сигнализируют о внутренних ошибках SoftICE. Программа
SoftICE вызвала либо общую ошибку защиты (0Dh) или отказ страницы (0Eh).
Смещение — это смещение кода, исполнение которого вызвало эту ошибку. Поb
жалуйста запишите выданное Вам сообщение и перешлите его нам. В сообщении
также показывается содержимое регистров, не забудьте записать их значения.
Invalid Debug register
(Неверный отладочный регистр)
Номер отладочного регистра, задаваемого в команде BPM, больше 3.
быть использованы только регистры DR0, DR1, DR2, DR3.

Могут

No code at this line number
(В строке с задаваемым номером исполняемый код отсутствует)
Строка с задаваемым в команде номером не имеет исполняемого кода.
No current source file
(Файл с исходным текстом отсутствует)
Вы ввели команду SS, однако файл с исходным текстом программы на экране
отсутствует.
No embedded INT 1 or INT 3
(Нет вложенных прерываний INT 1 или INT 3)
Команда ZAP не может найти вложенных прерываний INT 1 или INT 3. Данная
команда находит только команды INT 1 или INT 3, расположенные перед текущим
исполняемым адресом CS:EIP.
No files found
(Файл не найден)
Для текущей таблицы отладочной информации не загружены исходные файлы.
No LDT
(LDT отсутствует)
Это сообщение выдается, когда Вы используете команды 16bбитной подсистемы
Windows (HEAP, LHEAP, LDT или TASK), а текущий контекст не соответствует проb
цессу NTVDM (виртуальная DOS машина NT).
No Local Heap
(Локальная куча отсутствует)
В команде LHEAP задан селектор, не соответствующий локальной куче.

Приложение А. Сообщения об ошибках

159

No more Watch variables allowed
(Больше переменных командой Watch добавлять нельзя)
Максимальное число устанавливаемых командой Watch переменных равно 8.
No search in progress
(Поиск не проводится)
Вы задаете команду S без параметров без предварительного поиска. Вы должны
сначала выполнить команду S с адресом и списком данных в качестве параметров. Поb
следующий поиск этих же данных может быть выполнен командой S без параметров.
NO_SIZE
(Нет размера операнда)
Во время выполнения команда A ассемблер не может определить, что Вы исb
пользуете — байт, слово или двойное слово.
No symbol table
(Таблица с отладочной информацией отсутствует)
Вы выдаете команду SYM, SS или FILE, а символьная информация отсутствует.
No TSS
(TSS отсутствует)
Вы выдаете команду TSS в тот момент, когда в системе нет действительного
сегмента состояния задачи.
Only valid in source mode
(Можно использовать только в режиме исходных кодов)
Вы не можете использовать команду SS в смешанном режиме или режиме кодов.
Page not present
(Страница отсутствует)
Задаваемый в команде адрес помечен в таблице страниц как отсутствующий.
SoftICE, пытаясь получить информацию, обратился к памяти, которая расположена
на странице, отсутствующей в физической памяти.
Parameter is wrong size
(Параметр имеет неправильный размер)
Один из введенных Вами параметров команды имеет неправильный размер.
Например, Вы используете команду EB или BPMB с параметром размером в слово
вместо байтового значения.
Pattern not found
(Образец не найден)
Команда S не нашла соответствия задаваемому для поиска образцу.

160

Приложение А. Сообщения об ошибках
Press ‘C’ to continue, and ‘R’ to return to SoftICE
(Нажмите 'C' для продолжения или 'R' для возврата в SoftICE)

Экран SoftICE был активизирован в результате ошибки исполнения (06h, 0Ch,
0Dh, 0Eh). Нажмите клавишу 'R' для передачи управления в отладчик или клавишу
'C' для передачи управления в обработчик исключений Windows.
SoftICE is not active
(SoftICE не активен)
Это сообщение появляется в окне подсказки на монохромном или удаленном
дисплее, когда SoftICE больше не работает.
Specified name not found
(Указанное имя не найдено)
Вы выдали команду TABLE с недействительным именем таблицы. Задайте коb
манду TABLE без параметров для получения списка допустимых имен таблиц.
Symbol not defined (mysymbol)
(Символ "mysymbol" не определен)
Вы ссылаетесь на несуществующий символ. Используйте команду SYM для поb
лучения символьных имен для текущей таблицы отладочной информации.

Удивительно, что среди миллионов лиц не встретишь двух одинаковых.
Сэр Томас Браун

It is the common wonder of all men, how among so many millions of faces,
there should be none alike.
Sir Thomas Browne

Приложение B.
Поддерживаемые
видеоадаптеры
В приведенной ниже таблице перечислены поддерживаемые SoftICE видеоадаптеb
ры. включая и самые современные. Однако, NuMega регулярно добавляет поддержку
новых видеоадаптеров для расширения возможностей SoftICE. Вы всегда можете скаb
чать файлы для поддержки новых устройств с FTP фирмы NuMega или с различных
BBS. Для получения дополнительной информации о загрузке файлов поддержки обраb
титесь к разделу "Разрешение проблем с видеоадаптерами" на странице 23.
Standard Display Adapter
(VGA)

Actix GraphicsEngine 32I VL Actix GraphicsEngine 32VL
Plus

Actix GraphicsEngine 64

Actix GraphicsEngine Ultra Actix GraphicsEngine Ultra
64
Plus

Actix GraphicsEngine Ultra Actix ProSTAR
VL Plus

Actix ProSTAR 64

ATI 8514bUltra

ATI Graphics Pro Turbo

ATI Graphics Pro Turbo PCI

ATI Graphics Ultra

ATI Graphics Ultra Pro

ATI Graphics Ultra Pro EISA

ATI Graphics Ultra Pro PCI

ATI Graphics Vantage

ATI Graphics Wonder

ATI Graphics Xpression

ATI 3d Xpression PCI

ATI VGA Wonder

ATI Video Xpression PCI

ATI WinTurbo

Boca SuperVGA

Boca SuperX

Boca Voyager

Cardinal VIDEOcolor

Cardinal VIDEOspectrum

Chips & Technologies 64310 Chips & Technologies 65545
PCI
PCI

Chips & Technologies 65548 Chips & Technologies
PCI
Accelerator

Chips & Technologies Super
VGA

Cirrus Logic

Cirrus Logic 5420

Cirrus Logic 5430 PCI

Cirrus Logic New

Cirrus Logic PCI

Cirrus Logic RevC

Cirrus Logic 7542 PCI

Cirrus Logic 7543 PCI

Compaq Qvision 2000

DEC PC76HbEA

DEC PC76HbEB

DEC PC76HbEC

DEC PCXAGbAJ

DEC PCXAGbAK

DEC PCXAGbAN

DFI WGb1000

DFI WGb1000VL Plus

DFI WGb1000VL/4 Plus

162

Приложение B. Поддерживаемые видеоадаптеры

DFI WGb3000P

DFI WGb5000

DFI WGb6000VL

Diamond Edge 3D 2200XL

Diamond Edge 3D 3200XL

Diamond Edge 3D 3400XL

Diamond SpeedStar

Diamond SpeedStar 24

Diamond SpeedStar 24X

Diamond SpeedStar 64

Diamond SpeedStar Pro

Diamond SpeedStar Pro SE

Diamond Stealth 3D 2000

Diamond Stealth 24

Diamond Stealth 32

Diamond Stealth 64 2001

Diamond Stealth 64 (S3 964) Diamond Stealth 64 (S3 968)

Diamond Stealth 64 Video

Diamond Stealth Pro

Diamond Stealth SE

Diamond Viper OAK

Diamond Viper PCI

Diamond Viper VLB

Diamond Stealth VRAM
ELSA

WINNER 1000AVI ELSA

WINNER 1000PRO

ELSA WINNER 1000Trio
ELSA

WINNER 1000 VL ELSA

WINNER 1280

ELSA WINNER 2000PRO
ELSA

WINNER 2000 VL ELSA

WINNER/2b1280

Genoa Digital Video Wizard Genoa Phantom 32I
1000

Genoa Phantom 64

Genoa WindowsVGA 24
Turbo

Genoa WindowsVGA 64
Turbo

Hercules Dynamite

Hercules Dynamite Pro

Hercules Graphite 64

Hercules Graphite
Terminator 64

Hercules Graphite
Terminator Pro

IBM 8514

IBM ThinkPad 755CX

IBM Think Pad 365XD

Matrox MGA Impression
Lite

Matrox MGA Impression
Plus

Matrox MGA Impression
Plus 220

Matrox MGA Ultima Plus

Matrox MGA Ultima Plus
200

Matrox MGA Millennium

Number Nine GXE

Number Nine GXE64

Number Nine GXE64 Pro

Number Nine 9FX Vision
330

Number Nine 9FX Motion
531

Number Nine 9FX Motion
771

Number Nine FlashPoint 32 Number Nine FlashPoint 64

Number Nine Imagine 128

Number Nine Reality 332

Oak Technology 087

Oak Technology Super VGA Orchid Fahrenheit 1280 Plus

Orchid Fahrenheit Pro 64

Orchid Fahrenheit VA

Orchid Kelvin 64

Orchid Kelvin EZ

Orchid ProDesigner II

Paradise Accelerator Ports
O'Call

Nvidia NVI Media
Controller

Paradise Accelerator VL Plus Paradise Bahamas

Paradise Barbados 64

Paradise Super VGA

S3 805

S3 911/924

S3 928 PCI

S3 Trio32/64 PCI

S3 ViRGE PCI

S3 Vision864/964 PCI

S3 Vision868/968 PCI

Spider 32 VLB

Spider 32Plus VLB

Spider 64

Spider Tarantula 64

STB Ergo MCX

STB Horizon

STB Horizon Plus

Приложение B. Поддерживаемые видеоадаптеры

163

STB LightSpeed

STB MVPb2X

STB MVPb4X

STB Nitro

STB Pegasus

STB PowerGraph Pro

STB PowerGraph VLb24

Trident 9420 PCI

Trident Cyber 93XX

Trident Super VGA

Tseng Labs

Tseng Labs ET4000

Tseng Labs ET4000/W32

Tseng Labs ET6000

Video Logic 928Movie

Video Seven VRAM/VRAM Western Digital
II/1024i
Weitek Power 9000

Weitek Power 9100

Western Digital (512K)

Чем бы ни было творчество, оно — часть решения проблемы.
Брайан Олдис

Whatever creativity is, it is in part a solution to a problem.
Brian Aldiss

Приложение C.
Устранение проблем
SoftICE
Если у Вас возникла одна из перечисленных ниже проблем, попробуйте примеb
нить предлагаемое решение. Если это не поможет, обратитесь в Центр техничеb
ской поддержки фирмы NuMega.
Проблема

Решение

Экран SoftICE черный
или нечитаемый.

Возможно, при инициализации SoftICE Вы установили
неверный тип видеоадаптера, или SoftICE не поддерb
живает Ваш видеоадаптер. Обратитесь к приложению
B: "Поддерживаемые видеоадаптеры".

Компьютер зависает,
когда Вы запускаете
SoftICE, и при этом в
нем не используется
процессор Pentium или
PentiumbPro.

SoftICE ошибочно считает, что в Вашем компьютер
используется процессор типа Pentium. Измените наb
чальные установки SoftICE, чтобы отключить подb
держку процессоров Pentium. Смотрите раздел
"Установка параметров для устранения неисправно
стей" на странице 127.

Процессор зависает,
SoftICE не поддерживает режим "RESTART THE
когда вы запускаете
COMPUTER IN MSbDOS MODE?" ("Перезагрузить в
SoftICE для Windows 95. режиме MSbDOS"?). Если после выбора этого режима
вызвать SoftICE, то компьютер зависает.
Измените параметр BootGUI=1 на BootGUI=0 в
скрытом файле Windows 95 MSDOS.SYS, затем выбиb
райте пункт "SHUT DOWN THE COMPUTER"
("Выключить компьютер") для выхода в SoftICE.
Вы испытываете трудb Модем возвращает код, который SoftICE не может обb
ности с установлением работать. SoftICE ожидает получить коды OK,
модемной связи.
COMNECT и RING. Замените команду ATX0 строке
инициализации модема.
Мышь беспорядочно
скачет по экрану
SoftICE.

Нажмите CtrlbM.

Приложение C. Устранение проблем SoftICE
Проблема

165
Решение

Только для Windows
Перемещение указателя мыши во время появления
NT: указатель мыши
экрана SoftICE может нарушить синхронизацию
беспорядочно дергается Windows NT и аппаратуры мыши. Переключитесь в
по экрану SoftICE.
полноэкранный режим DOS.
Клавиатура блокируетb
ся или ведет себя неb
предсказуемо во время
загрузки SoftICE.

Отключите программирование клавиш "NumLock" и
"CapsLock". Если это не помогло, но Вы используете
Windows NT, то отключите модификацию драйвера
клавиатуры. Смотрите раздел "Установка параметров
для устранения неисправностей" на странице 127.

Windows 95 зависает,
когда пытается сканиb
ровать последовательb
ные порты.

Если Вы поместите команду SERIAL в строку инициаb
лизации, то SoftICE пытается установить связь до
окончания полного запуска Windows 95. В время заb
пуска Windows 95 соединение может нарушиться. Отb
ключите выбранный Вами последовательный порт в
Control Panel b> System Properties b> Device Manager
(Панель управления b> Система b> Устройства).

Словарь
Interrupt Descriptor Table (IDT)
(Таблица дескрипторов прерывания)
Таблица, содержащая дескрипторы прерывания/исключения и указываемая
регистром IDTR. Для просмотра этой таблицы используется команда IDT.
MAP file (MAPoфайл)
Генерируемый компилятором файл, содержащий отладочную информацию, вклюb
чающую глобальные символы и, обычно, номера строк исходного текста программы.
MMX (MultiMedia eXtension)
Мультимедийное расширение набора команд процессоров Intel Pentium и
Pentium Pro.
Object (Объект)
Представляет собой любой аппаратный или программный ресурс, который моb
жет быть разделяемым. Секции иногда также могут выступать в качестве объекb
тов. Смотрите пункт "Section" (Секция).
Oneoshot breakpoint (Одноразовая точка прерывания)
Контрольная точка, прерывание в которой происходит только один раз. Затем
оно отключается и повторно может произойти лишь по другой причине.
Ordinal form (Порядковая форма представления)
Когда символьная таблица не размещена в памяти, то говорят, что она находитb
ся в порядковом виде; в этом состоянии все селекторы представляют собой шестнаb
дцатеричные номера секций или сегментов.
Pointoandoshoot breakpoint
(Точка прерывания "укажи и поставь")
Точка прерывания, устанавливаемая с помощью указания курсором места в коb
де и выполнением команды BPX или HERE.
Relocate (Размещение)
Приведение адресов в программном коде в соответствие с фактическим адреb
сом загрузки программы.

Словарь

167

Section (Секция)
В файле PEbформата блок кода или данных, имеющий определенные атрибуты.
Каждая секция имеет свое имя и порядковый номер.
Sticky breakpoint (Постоянная точка прерывания)
Точка прерывания, которая существует до тех пор, пока Вы ее не удалите явным
образом. Она сохраняется даже при выгрузке отлаживаемого приложения и его
последующей загрузке.
SYM file (.SYMoфайл)
Файл, содержащий отладочную информацию, включая глобальные символы и
информацию о номерах строк. .SYMbфайл обычно транслируется из .MAPbфайла.
Symbol table (Таблица символов)
Внутреннее представление в SoftICE отладочной информации, ассоциированb
ной с соответствующим модулем, например, имена функций и номера строк.
Virtual breakpoint (Виртуальное прерывание)
Прерывание, которое может быть установлено на функцию (или переменную)
или на номер строки, которые еще не загружены в память.

Перевод выполнен на сайте
http://dore.on.ru
Перевод: …, Lucifer, Sergey R.
Снимки экрана SoftICE: Григорий Тренин.
Редактирование и верстка: Sergey R.
Июнь 1999 г.