Приветствую В общем сабж...Как писать обработчик хука с повторной входимостью Допустим хук установлен как: FUNC: JMP STUB_ ;сохранили FUNC+хх: ;из обработчика исполняем отсюда те. снимать хук его не надо. Есть две идеи: 1. Глобальный флаг Занят\Свободен 2. EnterCriticalSection\LeaveCriticalSection Как написать обработчик, если два потока илил более потока одновременно вызывают одну и ту же функцию...
чтобы не свалить их, замораживаешь и смотришь указывают ли ихний EIP кудато внутрь области, куда пишем джамп. Если да - придется временно разморозить нужные потоки, чтобы ни один из них в конце концов не выполнял код в этой области. после этого смело пишем джамп на буфер, в котором сохранено начало функции и джамп на продолжение и размораживаем потоки
Rustem от этого не исчезнет необходимость чекать EIP всех потоков на предмет попадания в область кода, куда будет записан джамп
Rustem Не понял. Вам нужно сделать хук и Вы боитесь, что в это время на этом месте будет исполняться поток? Обычно проблемы с несколькими потоками возникают если они могут использовать один и тот же ресурс одновременно. В Вашей постановке вопроса этого не наблюдается.
Mental_Mirror ну например обработчик: pop ret_addr; сохранили в глоб. перем адр. возврата pushad pushfd ;что то делаем с параметрами или типа того popfd popad call function ;вызвали функцию pushad pushfd ;если надо опять делаем, например с возвр. значением popfd popad push ret_addr ret; возвращаемся в вызываемое приложение Если одновременно обратятся, то ret_addr будет содержать значение последней функции..прога упадет
Rustem Если брать именно этот пример, то тут сохранение адреса возврата в глобальной переменной явно синтетично, т.к. можно адрес возврата и так сохраняется в стеке и RET'ом оттуда достается. По теме - проблема классическая и нужно использовать стандартные Win32 механизмы синхронизации, о некоторых из них было упомянуто выше.