Реферат: Перехват методов COM интерфейсов
jmp pthunk
Для постобработки нам потребуется хранить адрес возврата в клиентский код. С этой целью мы будем использовать TLS и контейнер std::deque (так как в одном потоке вызовы могут быть вложенными, нам нужен именно стек).
ПРИМЕЧАНИЕ Автор говорит о стеке, но по каким-то причинам использует двунаправленную очередь. С точки зрения функциональности это, в общем, безразлично, но несколько сбивает с толку. – прим. ред. |
Внутри перехватчика указатель на нужный std::deque берется из TLS, но так как поток создается не нами, мы не можем получить уведомление о его завершении. Значит, у нас нет точки в программе, где можно было бы безопасно уничтожить объект std::deque, ассоциированный с конкретным потоком. Во избежание потери ресурсов нужно дополнительно хранить список всех созданных объектов std::deque и уничтожать их перед завершением приложения.
Ниже приведена реализация специального класса-обертки, автоматизирующего выполнение всех этих действий. Список созданных std::deque в этом классе хранится в динамическом массиве (std::vector), добавление элементов в который происходит в конкурентном режиме и требует синхронизации. Для синхронизации доступа к нему используется критическая секция.
template<class T> struct TlsStorage { TlsStorage() { m_slot = TlsAlloc(); } ~TlsStorage() { std::vector<std::deque<T>* >::iterator it = m_stacks.begin(); for( ; it != m_stacks.end(); ++it) delete *it; TlsFree(m_slot); } void push(T t) { std::deque<T>* p = reinterpret_cast<std::deque<T>* >(TlsGetValue(m_slot)); if(!p) { p = new std::deque<T>; m_sec.Lock(); m_stacks.push_back(p); К-во Просмотров: 666
Бесплатно скачать Реферат: Перехват методов COM интерфейсов
|