Подскажите с SEH ?

Тема в разделе "WASM.WIN32", создана пользователем 7mm, 17 май 2010.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Great
    Не обязательно. Код вне модулей может спокойно использовать сех(по дефолту в XP). Пусть попробует выполнить NtSetInformationProcess(ProcessExecuteFlags = 0x22, MEM_EXECUTE_OPTION_EXECUTE_DISPATCH_ENABLE = 0x10).
    7mm
    SEH это надстройка, расширения диспетчера исключений. Родной ему механизм это VEH. Вы вполне можите реализовать собственный механизм.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    7mm
    да легко, просплайси и сделай любой свой механизм. или VEH как предлагают
     
  3. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Смотрю VEH. Всё хорошо, но жаль что теряется встроенный механизм __try //__except // __finally....
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Ну так поищи, если отключается защита на выполнение сехандлеров вне модулей то шикарно будет.
    если нет, то реализуй свой сех на базе VEH или сплайсинга KiUserExceptionDispatcher. Если правильно реализуешь, _try/_except/_finally будут работать.
    Как пример - можно посмотреть как я реализовал это в своей операционке (http://gr8os.googlecode.com/)
    У меня там работают _try/_except/_finally
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    А как-же пример из #28? где удалось локализировать описанную тобой проблему в exe файл без всего лишнего. Там глюк и в XP SP3 тоже.
     
  6. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    У вас в #28 кривой обработчик. Попробуйте сделать полноценный хэндлер и отловите исключение деления на ноль. У меня всё OK, в этом случае.
     
  7. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    7mm
    Во первых он не кривой а предельно упрощённый с целью тестирования (в masm версии точно такой-же и работает), но самое интересное, что этот обработчик в MSVC версии даже и не пытается выполниться - Оля показывает его как корректно установленный, но бряк на его первую команду не срабатывает. Что меня собственно и удивляет. Если бы дело было в том что обработчик кривой, то глюк бы проявлялся после того как он получил управление.
     
  8. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Попробуйте бряк на KiUserExceptionDispatcher. Если исключение есть, то сюда точно должны попасть.
     
  9. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Итак...

    Как выяснилось ранее, проблема с обработкой SEH была связана с DEP. Так как загрузка DLL осуществлялась без использования LoadLibrary и не осуществлялась её регистрация в системе, то функция RtlDispatchException, проверяя валидность SEH-обработчика, определяла, что данный обработчик не находится в пределах какого-либо из загруженных модулей и поэтому возвращала FALSE, тем самым вынуждая KiUserExceptionDispatcher выполнить NtContinue и продолжить выполнение потока с точки генерации исключения.

    Данная особенность наблюдалась на Windows 7, тогда как в Windows XP SP3 всё отрабатывалось нормально. Для решения данной проблемы, достаточно реализовать свой VEH-обработчик. В соответствии с логикой работы RtlDispatchException, сначала обрабатываются VEH обработчики, а лишь затем, в случае необходимости раскручивается цепочка SEH. Таким образом, установив свой VEH-обработчик реализующий раскрутку цепочки SEH, была реализована возможность обработки SEH для описанной ситуации.

    Благодарю всех откликнувшихся.

    P.S. В качестве бонуса, прилагаю библиотеку veseh, реализующую минимально необходимый функционал (отсутствует _ValidateEH3RN) для использования конструкций __try // __except и __try // __finally без MSVCRT. Код содран с MSVCR71.DLL из W7, как выяснилось в нём отсутствует ошибка, описанная в http://wasm.ru/forum/viewtopic.php?id=33061. С этой библиотекой результат теста: (a + b) = (0x01 + 0x23) = 0x24.
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    7mm
    Для решения достаточно выполнить сказанное в #41.
     
  11. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Неверно. Если RtlDispatchException вернёт false, то будет поднято исключение [NtRaiseException(ExceptionRecord, Context, SearchFrames = false)]. Если RtlDispatchException вернёт true, выполнение будет продолжено [NtContinue(Context, TestAlert = false)].

    Кстати говоря, RtlIsValidHandler вернёт true не только для случаев качественных комбинаций типа памяти и флажков ExecuteDispatchEnable и ImageDispatchEnable, но и тогда, когда будет найдена подходящая хендлеру запись в LdrpInvertedFunctionTable (и хендлер будет присутствовать в соответствующей записи таблицы). Про инвертированную таблицу и её динамическое изменение можно почитать здесь (последние два вхождения; в данном случае можно не обращать внимания на битность).
     
  12. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Да, конечно. Вы правы.

    Спасибо, посмотрю.
     
  13. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    ; ###################################################################################
    ;
    ; ОПИСАНИЕ:
    ; Реализация поддержки расширенной обработки исключений для компилятора
    ; MSVC с использованием SEH. Данная библиотека позволяет использовать
    ; блоки __try // __finally и __try // __except в программах, написанных
    ; на C и C++ без использования run-time библиотеки MSVCRT.
    ;
    ; КОМПИЛЯЦИЯ:
    ; ml.exe /c /coff /nologo /Cp /Gz veseh.asm
    ; link.exe /nologo /noentry /dll /def:%DEFS% /opt:ref /libpath:<libs>
    ;
    ; ВЕРСИЯ:
    ; v1.05 (c) 7mm, 2010
    ;
    ; ###################################################################################

    В аттаче - реализация SEH через VEH.