Difference between revisions of "SysFn69/ru"
Jump to navigation
Jump to search
Maxcodehack (talk | contribs) |
|||
(11 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 - номер функции | |
− | * eax = 69 - номер функции | + | :* ebx = 2 - номер подфункции |
− | * ebx = 2 - номер подфункции | + | :* ecx = идентификатор потока |
− | * ecx = идентификатор потока | + | :* edx = длина структуры контекста, должно быть 0x28=40 байт |
− | * edx = длина структуры контекста, должно быть 0x28=40 байт | + | :* esi = указатель на структуру контекста |
− | * esi = указатель на структуру контекста | ||
''Возвращаемое значение:'' | ''Возвращаемое значение:'' | ||
− | + | :* функция не возвращает значения | |
− | * функция не возвращает значения | ||
Формат структуры контекста указан в описании подфункции 1. | Формат структуры контекста указан в описании подфункции 1. | ||
''Замечания:'' | ''Замечания:'' | ||
+ | :* Если поток выполняет код 0-кольца, устанавливается состояние регистров 3-кольца. | ||
+ | :* Процесс должен быть загружен для отладки (как указано в общем описании). | ||
− | + | '''Константы для регистров:''' | |
− | + | ::eax - SF_DEBUG (69) | |
+ | ::ebx - SSF_SET_REGISTERS (2) | ||
=== Подфункция 3 - отключиться от отлаживаемого процесса. === | === Подфункция 3 - отключиться от отлаживаемого процесса. === | ||
''Параметры:'' | ''Параметры:'' | ||
− | + | :* eax = 69 - номер функции | |
− | * eax = 69 - номер функции | + | :* ebx = 3 - номер подфункции |
− | * ebx = 3 - номер подфункции | + | :* ecx = идентификатор |
− | * 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 слишком большое значение) | |
− | Замечания: | + | |
− | + | ''Замечания:'' | |
− | + | :* Процесс должен быть загружен для отладки (как указано в общем описании). | |