Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows


           

После возврата из GetThreadContext Вы






















Тип процессора



Определение CONTEXT_FULL



x86



CONTEXT_CONTROL | CONTEXT INTEGER | CONTEXT_SEGMENTS



Alpha



CONTEXT_CONTROL | CONTEXT_FLOATING_POINT | CONTEXT_INTEGER



После возврата из GetThreadContext Вы легко проверите значения любых регист ров для потока, но помните, что такой код зависит от типа процессора В следующей таблице перечислены элементы структуры CONTEXT, соответствующие указателям команд и стека для разных типов процессоров



























Тип процессора



Указатель команд



Указатель стека



х86



CONTEXT.Eip



CONTEXT.Esp



Alpha



CONTEXT.Fir



CONTEXT.IntSp



Даже удивительно, какой мощный инструмент дает Windows в руки разработчи ка! Но есть вещь, от которой Вы придете в полный восторг- значения элементов CONTEXT можно изменять и передавать объекту ядра "поток" с помощью функции SetThreadContext.

BOOL SetThreadContext( HANDLE hThread, CONST CONTEXT *pContext);

Перед этой операцией поток тожe нужно приостановить, иначе результаты могут быть непредсказуемыми.

Прежде чем обращаться к SetThreadContext, инициализируйте элемент ContextFlags, как показано ниже.

CONTEXT Context;

// приостанавливаем поток
SuspendThread(hThread);

// получаем регистры для контекста потока
Context.ContextFlags = CONTEXT_CONTROL;
GetThreadContext(hThread, &Context);

// устанавливаем указатель команд по своему выбору;
// в нашем примере присваиваем значение 0x00010000
#if defined(_ALPHA_)
Context.Fir = 0x00010000;
#elif defined(_X86_)
Context.Eip = 0x00010000;
#else
#error Module contains CPU-specific code, modify and recompile.
#endif

// вносим изменения в регистры потока, ContextFlags
// можно и не инициализировать, так как это уже сделано
Context.ConlrolFlags = CONTEXT_CONTROL; SetThreadContext(hThread, &Context);

// возобновляем выполнение потока; оно начнется с адреса 0x00010000

ResumeThread(hThread);

Этот код, вероятно, приведет к ошибке защиты (нарушению доступа) в удаленном потоке; система сообщит о необработанном исключении, и удаленный процесс бу дет закрыт. Все верно — нс Ваш, а удаленный. Вы благополучно обрушили другой процесс, оставив свой в целости и сохранности!

Функции GetTbreadContexf и SetThreadContext наделяют Вас огромной властью над потоками, но пользоваться ею нужно с осторожностью. Вызывают их лишь считан ные приложения. Эти функции предназначены для отладчиков и других инструмен тальных средств, хотя обращаться к ним можно из любых программ

Подробнее о структуре CONTEXT мы поговорим в главе 24.


Содержание  Назад  Вперед





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий