Реферат: Перехват методов 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 интерфейсов