Quote:во-вторых, я не понимаю о какой рекурсии может идти речь.
Процедура Х (...)
команда 1
низкоуровневый перехватчик №1
команда 2...
Низкоуровневый перехватчик №1(...)
вызвать процедуру Х(...); рекурсия !!!
другие команды...
Многие АПИ и часть алгоритмов требует рекурсии. Нельзя, чтобы перехватчик по одному адресу сохранял контекст в одной и той же области памяти. В такой перехватчик невозможно зайти дважды, не затерев предыдущий контекст. В Эре контекст сохраняется через PUSHAD и таких проблем нет.
Quote:не совсем понял зачем это нужно. можно абстрактный пример?...
Положим, есть скриптовый язык, для примера будет ЕРМ, но только для примера. Ему предоставляется АПИ для установки перехватчика SetHook(Addr, ERM_FUNC_ID).
Реально вызывается WriteHiHook на одну общую функцию: CallErmFunc. Но так как это именно функция без привязки к данным, она не может определить, какой ERM_FUNC_ID вызывать в свою очередь ей. Для этого в ЯП используют делегаты - связку: адрес объекта + адрес метода объекта.
Иначе говоря, одна функция обслуживает десятки перехватов. Чтобы определить, кому дальше передавать управление, ей нужно проанализировать какое-то поле данных, но ничего передать не получается. А с другой стороны, всегда передаётся-таки объект Hi/LoHook. Однако он бесполезен, в нём нельзя сохранить пользовательский указатель (h->UserData = ...).