Не работает GetThreadContext

Тема в разделе "WASM.BEGINNERS", создана пользователем 2FED, 29 июл 2008.

  1. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    .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
    ...

    Пытаюсь получить контекст спящего потока как в мсдне написано, но получаю ошибку. что не верно?
     
  2. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    LastErrorValue меняется если возникает ошибка. Тут походу всё верно, и это значение не меняется.
     
  3. zhindos

    zhindos New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    142
    2FED

    А сам контекст верный? Просто в структурке CONTEXT нужно заполнить поле ContextFlags... если error реальный, то конечно не из-за этого
     
  4. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    а чем его надо заполнять? сама GetThreadContext возвращает 0 что есть ошибка, и структура CONTEXT не заполняется
     
  5. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    2FED
    Перед вызовом GetThreadContext в con предварительно нужно заполнить ContextFlags (что это такое и какие могут быть там значения - читай MSDN). Если ContextFlags == 0, то ошибки не будет, т.к. винда все правильно "заполнила" как её и попросили :))

    P.S. Кстати сразу пару граблей по поводу GetThreadContext - структура CONTEXT для х32 должна быть выровнена на границу 4-х байт, а для х64 на границу 16-ти. Иначе GetThreadContext будет возвращать ошибку.
     
  6. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    dermatolog вот вот уже сам понял

    align 4
    con CONTEXT <>

    изза отсутствия align была ошибка, про ContextFlags тоже догнал. Всё работает всем спасибо.
     
  7. zhindos

    zhindos New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    142
    Вроде бы на платформе x86 + Win2k проблем с align-ом не возникает...
    Есть спец. флаг - AC, он практически никогда не устанавливается в 1, а если даже и устананавливается, винда умеет ловить такие ошибки...
     
  8. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    У меня XPSP2 возвращало ошибку приведённую выше, так то...
     
  9. zhindos

    zhindos New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    142
    Прикольно, значит код ядра устанавливает этот флаг, а обработчик int 17h возвращает сей error...
    Редко пишу на асме, в основном на C/C++, поэтому насчет этого как-то особо не задумывался...
     
  10. ADim

    ADim New Member

    Публикаций:
    0
    Регистрация:
    6 май 2007
    Сообщения:
    28
    По-моему, в описании GetThreadContext() указано, что функция возвращает нулевое значение в случае ошибки, и тогда можно обращаться к GetLastError() за причинами. Функции не обязаны делать SetLastError(ERROR_SUCCESS). По-моему, CrystalIC об этом же выше написал. Дождь, однако, какой за окном зарядил...
     
  11. zhindos

    zhindos New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    142
    А 2FED чуть ниже написал, что ф-ия возвращает 0...
     
  12. ADim

    ADim New Member

    Публикаций:
    0
    Регистрация:
    6 май 2007
    Сообщения:
    28
    Ой! А я код смотрел (без проверки eax после invoke GetThreadCotext) :dntknw:(
     
  13. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    у меня нету проверки потому что я в отладчике посмотрел что стабильно 0 возвращает и впихнул вызов GetLastError, всё оказалось правильно ошибка "Неверная попытка доступа к адресу памяти. " бала изза неправильно выравненого участка памяти