Реферат: Перехват методов COM интерфейсов

static ThunkVtbl vtbl;

};

__declspec(selectany) ThunkVtbl

ItfThunk::vtbl(reinterpret_cast<DWORD_PTR>(ItfThunk::thunk));

__declspec(selectany) TlsStorage<ItfThunk::CallInfo> ItfThunk::storage;

Переменная-член ThunkVtbl* vptr имитирует указатель vptr на таблицу виртуальных функций “обычного” C++-класса, структура CallInfo хранит информацию, необходимую для постобработки вызова. Нам осталось рассмотреть лишь реализацию статического метода void thunk(), выполняющего универсальный перехват. Перед вызовом этого перехватчика в стеке находятся параметры для исходного метода, указатель на this, адрес возврата в клиентский код и n – порядковый номер метода (который положил в стек vthunk):

Рисунок 3. Стек вызова

__declspec(naked) void ItfThunk::thunk()

{

__asm

{

push [esp] // кладемвстек n (параметрметода preprocess)

push [esp+0Ch] // кладемвстек this длявызова preprocess

call preprocess // вызываем ItfThunk::preprocess(n)

call store // вызываем ItfThunk::store

mov eax, [esp+8] // заменяем this встекенаисходный

mov eax, [eax+4] // из переменной ItfThunk::m_p

mov [esp+8], eax

lea eax, post_thunk // заменяем адрес возврата на post_thunk

mov [esp+4], eax

mov eax,[esp+8] // получаем vptr из исходного указателя

mov eax, [eax]

pop ecx // убираем из стека лишний параметр n

mov eax, [eax+4*ecx] // полчаем адрес метода из vtbl

jmp eax // переходим в исходный метод

post_thunk:

sub esp, 10h // выделяем в стеке место для CallInfo

push esp

К-во Просмотров: 671
Бесплатно скачать Реферат: Перехват методов COM интерфейсов