SysFn69/ru: Difference between revisions
Maxcodehack (talk | contribs) |
|||
(13 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
'''Функция 69 - отладка. | '''Функция 69''' - отладка. | ||
Процесс может загрузить другой процесс как отлаживаемый установкой | Процесс может загрузить другой процесс как отлаживаемый установкой | ||
соответствующего бита при вызове подфункции 7 функции 70. | соответствующего бита при вызове подфункции 7 [[SysFn70/ru|функции 70]]. | ||
У процесса может быть только один отладчик; один процесс может | У процесса может быть только один отладчик; один процесс может | ||
отлаживать несколько разных. Система уведомляет отладчик о событиях, | отлаживать несколько разных. Система уведомляет отладчик о событиях, | ||
Line 8: | Line 8: | ||
определённый подфункцией 0. | определённый подфункцией 0. | ||
''Формат сообщения'': | ''Формат сообщения:'' | ||
:* +0: dword: код сообщения | |||
:* +4: dword: PID отлаживаемого процесса | |||
:* +8: могут присутствовать дополнительные данные, определяемые кодом сообщения | |||
''Коды сообщений:'' | |||
:* 1 = исключение | |||
:** дополнительно передаётся dword-номер исключения | |||
:** процесс приостановлен | |||
''Коды сообщений'': | :* 2 = процесс завершился | ||
:** приходит при любом завершении: как через системную функцию -1, так и при "убийстве" любым другим процессом (в том числе самим отладчиком) | |||
* 1 = исключение | :* 3 = отладочное исключение int 1 = #DB | ||
** дополнительно передаётся dword-номер исключения | :** дополнительно передаётся dword-образ регистра DR6: | ||
** процесс приостановлен | :*** биты 0-3: выполнено условие соответствующей точки останова (установленной подфункцией 9) | ||
:*** бит 14: исключение произошло из-за режима пошаговой трассировки (установлен флаг TF) | |||
* 2 = процесс завершился | :** процесс приостановлен | ||
** приходит при любом завершении: как через системную функцию -1, так и при "убийстве" любым другим процессом (в том числе самим отладчиком) | |||
* 3 = отладочное исключение int 1 = #DB | |||
** дополнительно передаётся dword-образ регистра DR6: | |||
*** биты 0-3: выполнено условие соответствующей точки останова (установленной подфункцией 9) | |||
*** бит 14: исключение произошло из-за режима пошаговой трассировки (установлен флаг TF) | |||
** процесс приостановлен | |||
При завершении отладчика прибиваются все отлаживаемые процессы. | При завершении отладчика прибиваются все отлаживаемые процессы. | ||
Line 34: | Line 30: | ||
Все подфункции, кроме 4 и 5, применимы только к процессам/потокам, | Все подфункции, кроме 4 и 5, применимы только к процессам/потокам, | ||
запущенным из текущего функцией 70 с установленным флагом отладки. | запущенным из текущего [[SysFn70/ru|функцией 70]] с установленным флагом отладки. | ||
Отладка многопоточных программ пока не поддерживается. | Отладка многопоточных программ пока не поддерживается. | ||
=== Подфункция 0 - определить область данных для отладочных сообщений. === | === Подфункция 0 - определить область данных для отладочных сообщений. === | ||
''Параметры'': | ''Параметры:'' | ||
:* eax = 69 - номер функции | |||
:* ebx = 0 - номер подфункции | |||
:* ecx = указатель | |||
* | ''Формат области данных:'' | ||
* | :* +0: dword: N = размер буфера (не считая этого заголовка) | ||
* | :* +4: dword: занято в буфере | ||
:* +8: N*byte: буфер | |||
'' | ''Возвращаемое значение:'' | ||
:* функция не возвращает значения | |||
''Замечания:'' | |||
:* Если поле размера отрицательно, буфер считается заблокированным и при поступлении нового сообщения система будет ждать. Для синхронизации обрамляйте всю работу с буфером операциями блокировки/разблокировки | |||
:neg [bufsize] | |||
:* Данные в буфере трактуются как массив элементов переменной длины сообщений. Формат сообщения указан в общем описании. | |||
* | |||
'''Константы для регистров:''' | |||
::eax - SF_DEBUG (69) | |||
::ebx - SSF_SET_MESSAGE_AREA (0) | |||
=== Подфункция 1 - получить состояние регистров отлаживаемого потока. === | === Подфункция 1 - получить состояние регистров отлаживаемого потока. === | ||
''Параметры:'' | ''Параметры:'' | ||
:* eax = 69 - номер функции | |||
* eax = 69 - номер функции | :* ebx = 1 - номер подфункции | ||
* ebx = 1 - номер подфункции | :* ecx = идентификатор потока | ||
* ecx = идентификатор потока | :* edx = длина структуры контекста, должно быть 0x28=40 байт | ||
* edx = длина структуры контекста, должно быть 0x28=40 байт | :* esi = указатель на структуру контекста | ||
* esi = указатель на структуру контекста | |||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
:* функция не возвращает значения | |||
* функция не возвращает значения | |||
''Формат структуры контекста: (FPU пока не поддерживается):'' | ''Формат структуры контекста: (FPU пока не поддерживается):'' | ||
:* +0: dword: eip | |||
* +0: dword: eip | :* +4: dword: eflags | ||
* +4: dword: eflags | :* +8: dword: eax | ||
* +8: dword: eax | :* +12 = +0xC: dword: ecx | ||
* +12 = +0xC: dword: ecx | :* +16 = +0x10: dword: edx | ||
* +16 = +0x10: dword: edx | :* +20 = +0x14: dword: ebx | ||
* +20 = +0x14: dword: ebx | :* +24 = +0x18: dword: esp | ||
* +24 = +0x18: dword: esp | :* +28 = +0x1C: dword: ebp | ||
* +28 = +0x1C: dword: ebp | :* +32 = +0x20: dword: esi | ||
* +32 = +0x20: dword: esi | :* +36 = +0x24: dword: edi | ||
* +36 = +0x24: dword: edi | |||
''Замечания:'' | ''Замечания:'' | ||
:* Если поток выполняет код 0-кольца, возвращается состояние регистров 3-кольца. | |||
:* Процесс должен быть загружен для отладки (как указано в общем описании). | |||
'''Константы для регистров:''' | |||
::eax - SF_DEBUG (69) | |||
::ebx - SSF_GET_REGISTERS (1) | |||
=== Подфункция 2 - установить состояние регистров отлаживаемого потока. === | === Подфункция 2 - установить состояние регистров отлаживаемого потока. === | ||
Параметры: | ''Параметры:'' | ||
:* eax = 69 - номер функции | |||
:* ebx = 2 - номер подфункции | |||
:* ecx = идентификатор потока | |||
:* edx = длина структуры контекста, должно быть 0x28=40 байт | |||
:* esi = указатель на структуру контекста | |||
Возвращаемое значение: | |||
''Возвращаемое значение:'' | |||
:* функция не возвращает значения | |||
Формат структуры контекста указан в описании подфункции 1. | Формат структуры контекста указан в описании подфункции 1. | ||
''Замечания:'' | |||
:* Если поток выполняет код 0-кольца, устанавливается состояние регистров 3-кольца. | |||
:* Процесс должен быть загружен для отладки (как указано в общем описании). | |||
'''Константы для регистров:''' | |||
::eax - SF_DEBUG (69) | |||
::ebx - SSF_SET_REGISTERS (2) | |||
=== Подфункция 3 - отключиться от отлаживаемого процесса. === | === Подфункция 3 - отключиться от отлаживаемого процесса. === | ||
Параметры: | ''Параметры:'' | ||
:* eax = 69 - номер функции | |||
:* ebx = 3 - номер подфункции | |||
:* ecx = идентификатор | |||
''Возвращаемое значение:'' | |||
:* функция не возвращает значения | |||
''Замечания:'' | |||
:* Если процесс был приостановлен, он возобновляет выполнение. | |||
'''Константы для регистров:''' | |||
::eax - SF_DEBUG (69) | |||
::ebx - SSF_DETACH (3) | |||
=== Подфункция 4 - приостановить поток. === | === Подфункция 4 - приостановить поток. === | ||
Параметры: | ''Параметры:'' | ||
:* eax = 69 - номер процесса | |||
:* ebx = 4 - номер подфункции | |||
:* ecx = идентификатор | |||
Возвращаемое значение: | |||
''Возвращаемое значение:'' | |||
:* функция не возвращает значения | |||
''Замечания:'' | |||
:* Приостановить можно только те потоки, которые были запущены как отлаживаемые | |||
'''Константы для регистров:''' | |||
::eax - SF_DEBUG (69) | |||
::ebx - SSF_SUSPEND (4) | |||
=== Подфункция 5 - возобновить выполнение потока. === | === Подфункция 5 - возобновить выполнение потока. === | ||
Параметры: | ''Параметры:'' | ||
:* eax = 69 - номер функции | |||
:* ebx = 5 - номер подфункции | |||
:* ecx = идентификатор | |||
''Возвращаемое значение:'' | |||
:* функция не возвращает значения | |||
'''Константы для регистров:''' | |||
::eax - SF_DEBUG (69) | |||
::ebx - SSF_RESUME (5) | |||
=== Подфункция 6 - прочитать из памяти отлаживаемого процесса. === | === Подфункция 6 - прочитать из памяти отлаживаемого процесса. === | ||
Параметры: | ''Параметры:'' | ||
:* eax = 69 - номер функции | |||
:* ebx = 6 - номер подфункции | |||
:* ecx = идентификатор | |||
:* edx = сколько байт читать | |||
:* esi = адрес памяти отлаживаемого процесса | |||
:* edi = указатель на буфер для данных | |||
Возвращаемое значение: | |||
''Возвращаемое значение:'' | |||
:* eax = -1 при ошибке (неверный PID или буфер) | |||
:* иначе eax = число прочитанных байт (возможно, 0, если в esi слишком большое значение) | |||
Замечания: | |||
''Замечания:'' | |||
:* Процесс должен быть загружен для отладки (как указано в общем описании). | |||
'''Константы для регистров:''' | |||
::eax - SF_DEBUG (69) | |||
::ebx - SSF_READ_MEMORY (6) | |||
=== Подфункция 7 - записать в память отлаживаемого процесса. === | === Подфункция 7 - записать в память отлаживаемого процесса. === | ||
Параметры: | ''Параметры:'' | ||
:* eax = 69 - номер функции | |||
:* ebx = 7 - номер подфункции | |||
:* ecx = идентификатор | |||
:* edx = сколько байт писать | |||
:* esi = адрес памяти в отлаживаемом процессе | |||
:* edi = указатель на данные | |||
''Возвращаемое значение:'' | |||
:* eax = -1 при ошибке (неверный PID или буфер) | |||
:* иначе eax = число записанных байт (возможно, 0, если в esi слишком большое значение) | |||
''Замечания:'' | |||
:* Процесс должен быть загружен для отладки (как указано в общем описании). | |||
'''Константы для регистров:''' | |||
::eax - SF_DEBUG (69) | |||
::ebx - SSF_WRITE_MEMORY (7) | |||
=== Подфункция 8 - завершить отлаживаемый поток. === | === Подфункция 8 - завершить отлаживаемый поток. === | ||
Параметры: | ''Параметры:'' | ||
:* eax = 69 - номер функции | |||
:* ebx = 8 - номер подфункции | |||
:* ecx = идентификатор | |||
''Возвращаемое значение:'' | |||
:* функция не возвращает значения | |||
''Замечания:'' | |||
:* Процесс должен быть загружен для отладки (как указано в общем описании). | |||
:* Функция аналогична подфункции 2 [[SysFn18/ru|функции 18]] с двумя отличиями: требуется выполнение первого замечания и принимается PID, а не номер слота. | |||
'''Константы для регистров:''' | |||
::eax - SF_DEBUG (69) | |||
::ebx - SSF_TERMINATE (8) | |||
=== Подфункция 9 - установить/снять аппаратную точку останова. === | === Подфункция 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, о котором система сообщает отладчику. | |||
:* Точка останова на запись и чтение/запись срабатывает после выполнения вызвавшей её инструкции. | |||
'''Константы для регистров:''' | |||
::eax - SF_DEBUG (69) | |||
::ebx - SSF_DEFINE_BREAKPOINT (9) | |||
{{System_functions}} | |||
[[Category: SysCalls]] | |||
Latest revision as of 17:27, 14 January 2021
Функция 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:
- 1 = исключение
При завершении отладчика прибиваются все отлаживаемые процессы. Если отладчик этого не хочет, он должен предварительно отключиться подфункцией 3.
Все подфункции, кроме 4 и 5, применимы только к процессам/потокам, запущенным из текущего функцией 70 с установленным флагом отладки. Отладка многопоточных программ пока не поддерживается.
Подфункция 0 - определить область данных для отладочных сообщений.
Параметры:
- eax = 69 - номер функции
- ebx = 0 - номер подфункции
- ecx = указатель
Формат области данных:
- +0: dword: N = размер буфера (не считая этого заголовка)
- +4: dword: занято в буфере
- +8: N*byte: буфер
Возвращаемое значение:
- функция не возвращает значения
Замечания:
- Если поле размера отрицательно, буфер считается заблокированным и при поступлении нового сообщения система будет ждать. Для синхронизации обрамляйте всю работу с буфером операциями блокировки/разблокировки
- neg [bufsize]
- Данные в буфере трактуются как массив элементов переменной длины сообщений. Формат сообщения указан в общем описании.
Константы для регистров:
- eax - SF_DEBUG (69)
- ebx - SSF_SET_MESSAGE_AREA (0)
Подфункция 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-кольца.
- Процесс должен быть загружен для отладки (как указано в общем описании).
Константы для регистров:
- eax - SF_DEBUG (69)
- ebx - SSF_GET_REGISTERS (1)
Подфункция 2 - установить состояние регистров отлаживаемого потока.
Параметры:
- eax = 69 - номер функции
- ebx = 2 - номер подфункции
- ecx = идентификатор потока
- edx = длина структуры контекста, должно быть 0x28=40 байт
- esi = указатель на структуру контекста
Возвращаемое значение:
- функция не возвращает значения
Формат структуры контекста указан в описании подфункции 1.
Замечания:
- Если поток выполняет код 0-кольца, устанавливается состояние регистров 3-кольца.
- Процесс должен быть загружен для отладки (как указано в общем описании).
Константы для регистров:
- eax - SF_DEBUG (69)
- ebx - SSF_SET_REGISTERS (2)
Подфункция 3 - отключиться от отлаживаемого процесса.
Параметры:
- eax = 69 - номер функции
- ebx = 3 - номер подфункции
- ecx = идентификатор
Возвращаемое значение:
- функция не возвращает значения
Замечания:
- Если процесс был приостановлен, он возобновляет выполнение.
Константы для регистров:
- eax - SF_DEBUG (69)
- ebx - SSF_DETACH (3)
Подфункция 4 - приостановить поток.
Параметры:
- eax = 69 - номер процесса
- ebx = 4 - номер подфункции
- ecx = идентификатор
Возвращаемое значение:
- функция не возвращает значения
Замечания:
- Приостановить можно только те потоки, которые были запущены как отлаживаемые
Константы для регистров:
- eax - SF_DEBUG (69)
- ebx - SSF_SUSPEND (4)
Подфункция 5 - возобновить выполнение потока.
Параметры:
- eax = 69 - номер функции
- ebx = 5 - номер подфункции
- ecx = идентификатор
Возвращаемое значение:
- функция не возвращает значения
Константы для регистров:
- eax - SF_DEBUG (69)
- ebx - SSF_RESUME (5)
Подфункция 6 - прочитать из памяти отлаживаемого процесса.
Параметры:
- eax = 69 - номер функции
- ebx = 6 - номер подфункции
- ecx = идентификатор
- edx = сколько байт читать
- esi = адрес памяти отлаживаемого процесса
- edi = указатель на буфер для данных
Возвращаемое значение:
- eax = -1 при ошибке (неверный PID или буфер)
- иначе eax = число прочитанных байт (возможно, 0, если в esi слишком большое значение)
Замечания:
- Процесс должен быть загружен для отладки (как указано в общем описании).
Константы для регистров:
- eax - SF_DEBUG (69)
- ebx - SSF_READ_MEMORY (6)
Подфункция 7 - записать в память отлаживаемого процесса.
Параметры:
- eax = 69 - номер функции
- ebx = 7 - номер подфункции
- ecx = идентификатор
- edx = сколько байт писать
- esi = адрес памяти в отлаживаемом процессе
- edi = указатель на данные
Возвращаемое значение:
- eax = -1 при ошибке (неверный PID или буфер)
- иначе eax = число записанных байт (возможно, 0, если в esi слишком большое значение)
Замечания:
- Процесс должен быть загружен для отладки (как указано в общем описании).
Константы для регистров:
- eax - SF_DEBUG (69)
- ebx - SSF_WRITE_MEMORY (7)
Подфункция 8 - завершить отлаживаемый поток.
Параметры:
- eax = 69 - номер функции
- ebx = 8 - номер подфункции
- ecx = идентификатор
Возвращаемое значение:
- функция не возвращает значения
Замечания:
- Процесс должен быть загружен для отладки (как указано в общем описании).
- Функция аналогична подфункции 2 функции 18 с двумя отличиями: требуется выполнение первого замечания и принимается PID, а не номер слота.
Константы для регистров:
- eax - SF_DEBUG (69)
- ebx - SSF_TERMINATE (8)
Подфункция 9 - установить/снять аппаратную точку останова.
Параметры:
- eax = 69 - номер функции
- ebx = 9 - номер подфункции
- ecx = идентификатор потока
- dl = индекс точки останова, от 0 до 3 включительно
- dh = флаги:
- если старший бит сброшен - установить точку останова:
- биты 0-1 - условие:
- 00 = точка останова на выполнение
- 01 = точка останова на запись
- 11 = точка останова на чтение/запись
- биты 2-3 - длина; для точек останова на исполнение должно быть 00, в противном случае одно из
- 00 = байт
- 01 = слово
- 11 = двойное слово
- esi = адрес точки останова; должен быть выровнен соответственно длине (т.е. должен быть чётным для точек останова на слово, кратен 4 для двойного слова)
- биты 0-1 - условие:
- если старший бит установлен - сбросить точку останова
- если старший бит сброшен - установить точку останова:
Возвращаемое значение:
- eax = 0 - успешно
- eax = 1 - ошибка во входных данных
- eax = 2 - (зарезервировано, никогда не возвращается в текущей реализации) с этим индексом уже установлена глобальная точка останова
Замечания:
- Процесс должен быть загружен для отладки (как указано в общем описании).
- Аппаратные точки останова реализуются через DRx-регистры процессора, отсюда все ограничения.
- Функция может переустановить ранее установленную ей же точку останова (никак не сообщая об этом). Ведите список установленных точек останова в отладчике.
- Срабатывание точки останова заключается в генерировании отладочного исключения #DB, о котором система сообщает отладчику.
- Точка останова на запись и чтение/запись срабатывает после выполнения вызвавшей её инструкции.
Константы для регистров:
- eax - SF_DEBUG (69)
- ebx - SSF_DEFINE_BREAKPOINT (9)
|