Функция 59 - получить информацию о последних системных вызовах.
Получает данные о всех системных вызовах всех процессов.
Параметры:
- eax = 59 - номер функции
- ebx = 0 - единственная подфункция
- ecx = указатель на буфер
- edx = размер буфера
Возвращаемое значение:
- eax = общее число системных вызовов,
сделанных с момента загрузки системы (по модулю 2^32)
- ebx = 0
Формат информации об одном вызове: (размер = 0x40 = 64 байта)
- +0: dword: PID процесса/потока
- +4: 7*dword: мусор
- +32 = +0x20: dword: значение edi при вызове
- +36 = +0x24: dword: esi
- +40 = +0x28: dword: ebp
- +44 = +0x2C: dword: указатель стэка обработчика ядра
- +48 = +0x30: dword: ebx
- +52 = +0x34: dword: edx
- +56 = +0x38: dword: ecx
- +60 = +0x3C: dword: eax (=номер системной функции)
Замечания:
- Функция используется только в приложении systrace.
Довольно трудно представить ситуацию, в которой это приложение
или эта функция действительно полезны, а вот все системные вызовы
для поддержки этой функции несколько замедляются
(хотя и ненамного)...
- В связи с этим есть предложение поддержку этой функции
из ядра убрать совсем, вместе с приложением systrace.
- Информация о системных вызовах сохраняется в
системном кольцевом буфере на 0x10 входов.
Эта функция просто копирует указанный объём данных
из упомянутого буфера по указанному адресу.
- Какой из входов в буфере соответствует последнему вызову,
можно определить по значению eax, а именно,
вход (eax and 0xF) (по смещению (eax and 0xF)*0x40).
- В текущей реализации возможны редко встречающиеся
проблемы рассинхронизации, когда о некоторых вызовах
информация устаревает.
- Под системный буфер выделена страница, 4Кб.
Размер входа = 64 байта.
Почему используется только 16 входов - непонятно.
- Значение esp в момент системного вызова
этой функцией узнать нельзя.
- Проверки корректности edx в текущей реализации не делается.