SysFn69/ru
Функция 69 - отладка.
Процесс может загрузить другой процесс как отлаживаемый установкой соответствующего бита при вызове подфункции 7 функции 70. У процесса может быть только один отладчик; один процесс может отлаживать несколько разных. Система уведомляет отладчик о событиях, происходящих с отлаживаемым процессом. Сообщения записываются в буфер, определённый подфункцией 0.
Формат сообщения:
- +0: dword: код сообщения
- +4: dword: PID отлаживаемого процесса
- +8: могут присутствовать дополнительные данные, определяемые кодом сообщения
Коды сообщений:
- 1 = исключение
- дополнительно передаётся dword-номер исключения
- процесс приостановлен
- 2 = процесс завершился
- приходит при любом завершении: как через системную функцию -1, так и при "убийстве" любым другим процессом (в том числе самим отладчиком)
- 3 = отладочное исключение int 1 = #DB
- дополнительно передаётся dword-образ регистра DR6:
- биты 0-3: выполнено условие соответствующей точки останова (установленной подфункцией 9)
- бит 14: исключение произошло из-за режима пошаговой трассировки (установлен флаг TF)
- дополнительно передаётся dword-образ регистра DR6:
** процесс приостановлен
При завершении отладчика прибиваются все отлаживаемые процессы. Если отладчик этого не хочет, он должен предварительно отключиться подфункцией 3.
Все подфункции, кроме 4 и 5, применимы только к процессам/потокам, запущенным из текущего функцией 70 с установленным флагом отладки. Отладка многопоточных программ пока не поддерживается. Полный список подфункций:
- подфункция 0 - определить область данных для отладочных сообщений
- подфункция 1 - получить состояние регистров отлаживаемого потока
- подфункция 2 - установить состояние регистров отлаживаемого потока
- подфункция 3 - отключиться от отлаживаемого процесса
- подфункция 4 - приостановить отлаживаемый поток
- подфункция 5 - возобновить выполнение отлаживаемого потока
- подфункция 6 - прочитать из памяти отлаживаемого процесса
- подфункция 7 - записать в память отлаживаемого процесса
- подфункция 8 - завершить отлаживаемый поток
- подфункция 9 - установить/снять аппаратную точку останова
Подфункция 0 - определить область данных для отладочных сообщений.
Параметры:
* eax = 69 - номер функции * ebx = 0 - номер подфункции * ecx = указатель
Формат области данных:
* +0: dword: N = размер буфера (не считая этого заголовка) * +4: dword: занято в буфере * +8: N*byte: буфер
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Если поле размера отрицательно, буфер считается заблокированным и при поступлении нового сообщения система будет ждать. Для синхронизации обрамляйте всю работу с буфером операциями блокировки/разблокировки neg [bufsize] * Данные в буфере трактуются как массив элементов переменной длины - сообщений. Формат сообщения указан в общем описании.
Подфункция 1 - получить состояние регистров отлаживаемого потока.
Параметры:
* eax = 69 - номер функции * ebx = 1 - номер подфункции * ecx = идентификатор потока * edx = длина структуры контекста, должно быть 0x28=40 байт * esi = указатель на структуру контекста
Возвращаемое значение:
* функция не возвращает значения
Формат структуры контекста: (FPU пока не поддерживается)
* +0: dword: eip * +4: dword: eflags * +8: dword: eax * +12 = +0xC: dword: ecx * +16 = +0x10: dword: edx * +20 = +0x14: dword: ebx * +24 = +0x18: dword: esp * +28 = +0x1C: dword: ebp * +32 = +0x20: dword: esi * +36 = +0x24: dword: edi
Замечания:
* Если поток выполняет код 0-кольца, возвращается состояние регистров 3-кольца. * Процесс должен быть загружен для отладки (как указано в общем описании).
Подфункция 2 - установить состояние регистров отлаживаемого потока.
Параметры:
* eax = 69 - номер функции * ebx = 2 - номер подфункции * ecx = идентификатор потока * edx = длина структуры контекста, должно быть 0x28=40 байт * esi = указатель на структуру контекста
Возвращаемое значение:
* функция не возвращает значения
Формат структуры контекста указан в описании подфункции 1. Замечания:
* Если поток выполняет код 0-кольца, устанавливается состояние регистров 3-кольца. * Процесс должен быть загружен для отладки (как указано в общем описании).
Подфункция 3 - отключиться от отлаживаемого процесса.
Параметры:
* eax = 69 - номер функции * ebx = 3 - номер подфункции * ecx = идентификатор
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Если процесс был приостановлен, он возобновляет выполнение.
Подфункция 4 - приостановить поток.
Параметры:
* eax = 69 - номер процесса * ebx = 4 - номер подфункции * ecx = идентификатор
Возвращаемое значение:
* функция не возвращает значения
Подфункция 5 - возобновить выполнение потока.
Параметры:
* eax = 69 - номер функции * ebx = 5 - номер подфункции * ecx = идентификатор
Возвращаемое значение:
* функция не возвращает значения
Подфункция 6 - прочитать из памяти отлаживаемого процесса.
Параметры:
* eax = 69 - номер функции * ebx = 6 - номер подфункции * ecx = идентификатор * edx = сколько байт читать * esi = адрес памяти отлаживаемого процесса * edi = указатель на буфер для данных
Возвращаемое значение:
* eax = -1 при ошибке (неверный PID или буфер) * иначе eax = число прочитанных байт (возможно, 0, если в esi слишком большое значение)
Замечания:
* Процесс должен быть загружен для отладки (как указано в общем описании).
Подфункция 7 - записать в память отлаживаемого процесса.
Параметры:
* eax = 69 - номер функции * ebx = 7 - номер подфункции * ecx = идентификатор * edx = сколько байт писать * esi = адрес памяти в отлаживаемом процессе * edi = указатель на данные
Возвращаемое значение:
* eax = -1 при ошибке (неверный PID или буфер) * иначе eax = число записанных байт (возможно, 0, если в esi слишком большое значение)
Замечания:
* Процесс должен быть загружен для отладки (как указано в общем описании).
Подфункция 8 - завершить отлаживаемый поток.
Параметры:
* eax = 69 - номер функции * ebx = 8 - номер подфункции * ecx = идентификатор
Возвращаемое значение:
* функция не возвращает значения
Замечания:
* Процесс должен быть загружен для отладки (как указано в общем описании). * Функция аналогична подфункции 2 функции 18 с двумя отличиями: требуется выполнение первого замечания и принимается PID, а не номер слота.
Подфункция 9 - установить/снять аппаратную точку останова.
Параметры:
* eax = 69 - номер функции * ebx = 9 - номер подфункции * ecx = идентификатор потока * dl = индекс точки останова, от 0 до 3 включительно * dh = флаги: * если старший бит сброшен - установить точку останова: * биты 0-1 - условие: * 00 = точка останова на выполнение * 01 = точка останова на запись * 11 = точка останова на чтение/запись * биты 2-3 - длина; для точек останова на исполнение должно быть 00, в противном случае одно из * 00 = байт * 01 = слово * 11 = двойное слово * esi = адрес точки останова; должен быть выровнен соответственно длине (т.е. должен быть чётным для точек останова на слово, кратен 4 для двойного слова) * если старший бит установлен - сбросить точку останова
Возвращаемое значение:
* eax = 0 - успешно * eax = 1 - ошибка во входных данных * eax = 2 - (зарезервировано, никогда не возвращается в текущей реализации) с этим индексом уже установлена глобальная точка останова
Замечания:
* Процесс должен быть загружен для отладки (как указано в общем описании). * Аппаратные точки останова реализуются через DRx-регистры процессора, отсюда все ограничения. * Функция может переустановить ранее установленную ей же точку останова (никак не сообщая об этом). Ведите список установленных точек останова в отладчике. * Срабатывание точки останова заключается в генерировании отладочного исключения #DB, о котором система сообщает отладчику. * Точка останова на запись и чтение/запись срабатывает после выполнения вызвавшей её инструкции.