Quote:Ужаснулся, глянув в код низкоуровневого перехватчика. Регистры не в стеке сохраняются и передаются, а в глобальной памяти. Это значит, что рекурсивный вызов перезатрёт их подчистую!
Code:
MOV [DWORD 4978BC8],EAX
MOV [DWORD 4978BCC],ECX
MOV [DWORD 4978BD0],EDX
MOV [DWORD 4978BD4],EBX
MOV [DWORD 4978BD8],ESP
MOV [DWORD 4978BDC],EBP
MOV [DWORD 4978BE0],ESI
MOV [DWORD 4978BE4],EDI
MOV EAX,74C6FC
MOV [DWORD 4978BE8],EAX
PUSH 4978BC8
я так понял речь о мосте LoHook хука.
во-первых, регистры сохраняются не в глобальной памяти а в памяти выделенной для конкретного объекта LoHook.
точно так же и память под мост выделена для каждого конкретного LoHook объекта и сам мост уникален для каждого экземпляра LoHook.
То есть получается что каждый мост каждого LoHook объекта работает со своей областью памяти для хранения значений регистров.
во-вторых, я не понимаю о какой рекурсии может идти речь.
если будет иметь место рекурсивный вызов самой высокоуровневая функций (которую мы используем для вызова из моста) то, да, каждый вызов будет работать с текущим общим значением регистров контекста для данного хука. Но чем это страшно и зачем может понадобиться такая рекурсия не знаю.
в-третьих, один патч (с собственным одним мостом и объектом HookContext) невозможно применить дважды ни к одному и тому же адресу ни к разным адресам. то есть рекурсивное выполнение кода моста невозможно.
На практике все прекрасно, что подтверждает правильность реализации.
т.е. HookContext передаваемый в высокоуровневую LoHook функцию на самом деле является частью LoHook, но доступен он только из высокоуровневой функции, ибо в другое время доступ к нему не имеет смысла.
Quote:Проверка в коде патчера на 1 не есть хорошо. Нужно сравнивать с нулём. Так работает тип bool: 0 = ложь, остальное - истина.
поправил в версии 2.1
Quote:Ещё не хватает возможности в параметрах записи высокоуровневого перехватчика пользовательский указатель, который будет сохранён в структуре перехватчика и по которому можно было бы определить, с какой целью ставился перехват и кто его клиент. Что=то вроде HiHool->UserData.
не совсем понял зачем это нужно. можно абстрактный пример?...
ни внутри хд, ни в нутри хоты, ни во взаимодействии до сих пор не понадобилось ничего подобного.
позже опубликую версию 2.1