Замена except_handler3 на свой обработчик.

Тема в разделе "WASM.BEGINNERS", создана пользователем Charlief, 15 сен 2010.

  1. Charlief

    Charlief New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2010
    Сообщения:
    129
    В DriverEntry я создаю в стеке структуру EXCEPTION_REGISTRATION с полем handler указывающем на мою функцию, заношу указатель на структуру в fs:[0]...
    Вызываю функцию в кторой есть ошибка, генерируется исключение, система вызовет мой handler в котором я с помощью DbgPrint выведу содержимое параметров переданных в мой handler.

    Вопрос - перед завершением обработчика: return EXCEPTION_CONTINUE_EXECUTION ; чтобы возобновить выполнение DriverEntry с того места которое мне нужно для этого необходимо записать в поля Eip и Esp переданной структуры CONTEXT нужные мне значения ? Если так то этого достаточно ?
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Charlief
    Не имеет значения CPL. Механизм SEH аналогичен в обоих модах, за исключением некоторых нюансов, которых вы не касаетесь(пикод, изоляция SFC etc.). Вобщем переношу тему в бегинерс, автору изучать матчасть касательно сех.
     
  3. Charlief

    Charlief New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2010
    Сообщения:
    129
    Так да или нет ?
    Система, при возобновлении моего драйвера, указатель IP и остальные регистры берёт из структуры CONTEXT переданной в handler ?

    Я Win32™ SEH изнутри прочитал, мне просто точно нужно удостовериться, а там прямо не написано. Там только написано что это контекст той точки в моей программе где произошло исключение.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Charlief
    Вы имеете контекст потока на момент возникновения исключения и инфу об нём(ну есчо трап-фрейм). Что вы будите делать далее только ваша проблема. После отработки сех контекст будет загружен обратно в процессор.
     
  5. Charlief

    Charlief New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2010
    Сообщения:
    129
    Тоесть место моего влияния на этот контекст который будет загружен обратно в процессор - это структура CONTEXT переданная в мой обработчик ?
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Charlief
    Сех вызывается как калбэк. Перед этом формируется трап фрейм(при межкольцевом переключении аналогично). Далее он конвертируется в контекст и выполняется развёртка цепочки сех. После этого выполняется возврат из хэндлера в вызывающую его ISR, а далее загрузка задачи в процессор. Что будет загружено определяет ваш хэндлер(тоесть он должен обработать контекст), в противном случае будет сгененирован багчек и система будет остановлена.
     
  7. Charlief

    Charlief New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2010
    Сообщения:
    129
    Clerk
    Можно я ещё раз перефразирую вопрос ? Вы конечно извините.

    Я, из своего хендлера, чтобы повлиять на контекст который будет загружен обратно в процессор перед возобновлением моего драйвера, должен изменить поля структуры CONTEXT (я в ней должен поменять значения регистров - IP и других ? тоесть задать точку из которой возобновится мой дравер) ?
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Charlief
    Да.
     
  9. Charlief

    Charlief New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2010
    Сообщения:
    129
    Спасибо !