Great Не обязательно. Код вне модулей может спокойно использовать сех(по дефолту в XP). Пусть попробует выполнить NtSetInformationProcess(ProcessExecuteFlags = 0x22, MEM_EXECUTE_OPTION_EXECUTE_DISPATCH_ENABLE = 0x10). 7mm SEH это надстройка, расширения диспетчера исключений. Родной ему механизм это VEH. Вы вполне можите реализовать собственный механизм.
Ну так поищи, если отключается защита на выполнение сехандлеров вне модулей то шикарно будет. если нет, то реализуй свой сех на базе VEH или сплайсинга KiUserExceptionDispatcher. Если правильно реализуешь, _try/_except/_finally будут работать. Как пример - можно посмотреть как я реализовал это в своей операционке (http://gr8os.googlecode.com/) У меня там работают _try/_except/_finally
А как-же пример из #28? где удалось локализировать описанную тобой проблему в exe файл без всего лишнего. Там глюк и в XP SP3 тоже.
У вас в #28 кривой обработчик. Попробуйте сделать полноценный хэндлер и отловите исключение деления на ноль. У меня всё OK, в этом случае.
7mm Во первых он не кривой а предельно упрощённый с целью тестирования (в masm версии точно такой-же и работает), но самое интересное, что этот обработчик в MSVC версии даже и не пытается выполниться - Оля показывает его как корректно установленный, но бряк на его первую команду не срабатывает. Что меня собственно и удивляет. Если бы дело было в том что обработчик кривой, то глюк бы проявлялся после того как он получил управление.
Итак... Как выяснилось ранее, проблема с обработкой 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.
Неверно. Если RtlDispatchException вернёт false, то будет поднято исключение [NtRaiseException(ExceptionRecord, Context, SearchFrames = false)]. Если RtlDispatchException вернёт true, выполнение будет продолжено [NtContinue(Context, TestAlert = false)]. Кстати говоря, RtlIsValidHandler вернёт true не только для случаев качественных комбинаций типа памяти и флажков ExecuteDispatchEnable и ImageDispatchEnable, но и тогда, когда будет найдена подходящая хендлеру запись в LdrpInvertedFunctionTable (и хендлер будет присутствовать в соответствующей записи таблицы). Про инвертированную таблицу и её динамическое изменение можно почитать здесь (последние два вхождения; в данном случае можно не обращать внимания на битность).
; ################################################################################### ; ; ОПИСАНИЕ: ; Реализация поддержки расширенной обработки исключений для компилятора ; 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.