Windows для профессионалов


Структура CONTEXT - часть 4


CONTEXT_FULL определен в файле WinNT.h, как показано в таблице.

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

Определение 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);

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

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

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




Начало  Назад  Вперед



Книжный магазин