После возврата из 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
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий