Кто сталкивался с TEB.ExceptionCode == NULL on Vista ?

Тема в разделе "WASM.WIN32", создана пользователем dead_body, 3 ноя 2008.

  1. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Скажите почему в некоторых потоках оно равно 0, а в некоторых нет? Кто исследовал может быть или уже прошёл это.
    А то почему то иногда падает поток, когда 0. И почему то только на Висте.
    Может статью кто то ваял или информация есть.

    Заранее спасибо. :)
     
  2. CrystalIC

    CrystalIC New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2008
    Сообщения:
    500
    Как в висте счас неохота в ядро лезть, скажу как в XPSP2.
    В ядре на поле TEB.ExceptionCode только одна ссылка в KeRaiseUserException(). Эта функция и сохраняет NTSTATUS код в этом поле. На KeRaiseUserException() в ядре три ссылки, причём все они передают фиксированный код ошибки(разумеется отличный от нуля). На стороне юзермода это поле используется в ядерном калбаке KiRaiseUserExceptionDispatcher, он вызывается из KeRaiseUserException().
    Нет кода который может возвратить STATUS_SUCCESS и вызвать этот ядерный калбак для разворачивания исключения.
    Варианта два:
    > Ктото намеренно изменяет это поле.
    > Ты не правильно определяешь событие, при котором данное поле может быть считано. По дефолту там STATUS_SUCCESS(0). При возникновении исключения в юзермоде это поле не меняется, как следствие при подении потока тоже.
    Не понятно зачем тебя это. Если тебе нужен код ошибки, то его следует брать из поля LastStatusValue. При возникновении исключения и дальнейшем разворачивании его, до передачи управления на хэндлер в юзермод(KiUserExceptionDispatcher) никакие поля TEB не меняются, способа узнать причину исключения нет, вся инфа содержится в стеке диспетчера исключений и он не возвращает причину ошибки в TEB.