.data id dd ? con CONTEXT <> .code thread proc @@: invoke Sleep,100 jmp @b ret thread endp start: ;int 3 invoke CreateThread,0,0,thread,0,CREATE_SUSPENDED,addr id push eax invoke GetThreadContext,eax,addr con invoke GetLastError ; 998 "Неверная попытка доступа к адресу памяти. " mov eax,con.regEip call ResumeThread ... Пытаюсь получить контекст спящего потока как в мсдне написано, но получаю ошибку. что не верно?
2FED А сам контекст верный? Просто в структурке CONTEXT нужно заполнить поле ContextFlags... если error реальный, то конечно не из-за этого
а чем его надо заполнять? сама GetThreadContext возвращает 0 что есть ошибка, и структура CONTEXT не заполняется
2FED Перед вызовом GetThreadContext в con предварительно нужно заполнить ContextFlags (что это такое и какие могут быть там значения - читай MSDN). Если ContextFlags == 0, то ошибки не будет, т.к. винда все правильно "заполнила" как её и попросили ) P.S. Кстати сразу пару граблей по поводу GetThreadContext - структура CONTEXT для х32 должна быть выровнена на границу 4-х байт, а для х64 на границу 16-ти. Иначе GetThreadContext будет возвращать ошибку.
dermatolog вот вот уже сам понял align 4 con CONTEXT <> изза отсутствия align была ошибка, про ContextFlags тоже догнал. Всё работает всем спасибо.
Вроде бы на платформе x86 + Win2k проблем с align-ом не возникает... Есть спец. флаг - AC, он практически никогда не устанавливается в 1, а если даже и устананавливается, винда умеет ловить такие ошибки...
Прикольно, значит код ядра устанавливает этот флаг, а обработчик int 17h возвращает сей error... Редко пишу на асме, в основном на C/C++, поэтому насчет этого как-то особо не задумывался...
По-моему, в описании GetThreadContext() указано, что функция возвращает нулевое значение в случае ошибки, и тогда можно обращаться к GetLastError() за причинами. Функции не обязаны делать SetLastError(ERROR_SUCCESS). По-моему, CrystalIC об этом же выше написал. Дождь, однако, какой за окном зарядил...
у меня нету проверки потому что я в отладчике посмотрел что стабильно 0 возвращает и впихнул вызов GetLastError, всё оказалось правильно ошибка "Неверная попытка доступа к адресу памяти. " бала изза неправильно выравненого участка памяти