Кто - нибудь делал seh0 (режим ядра) на masm32 (try и except) , в прмиере есть только try и finally. Надо except.
А ты смотрел этот макрос ? Это тебе не Делфи _try MACRO SafePlace, xHandler:=<DefaultExceptionHandler> DefaultExceptionHandler - это и есть обработка seh0 (except)
«Драйверы режима ядра: Часть 8: Базовая техника: Работа с памятью.» ExceptionHandler — это и есть except (почти)
Давно хотел предупредить ( а может я уже предупреждал ). ------------------------------------------------------------------- В KmdKit в некоторых примерах есть файлик seh0.inc. Там два макроса _try и _finally. Но они только для нативного SEH. Такое будет перехвытываться: _try xor eax, eax mov eax, [eax] _finally а такое нет: _try invoke ProbeForRead,... _finally При обломе ProbeForRead и другие требующие обёртки в SEH, явно вызывают одну системную функцию, которой надо, чтоб SEH-кадр был поставлен по определенным правилам: к нативному SEH добавляются кое-какие структуры. Я несколько раз пытался их прикрутить, но не получилось из-за ограниченности макросредств MASM. ------------------------------------------------------------------- Нет времени это фиксить, так что имейте ввиду...
Four-F Handler кстати должен cdecl быть, мы ведь это раньше выяснили, странно что ты не исправил макросы. А так макросы вполне можно юзать и не в драйверах.
SteelRat, как тогда ставить: _try код DefaultExceptionHandler код или как ? Four-F, с функциями Rtl... будет же все работать ?
В KmdKit\examples\basic\MemoryWorks\seh есть пример использования _try/_finally, а также установки seh руками. Если особая обработка исключения не нужни, то просто используется _try без параметров (тогда при исключении будет вызван дефолтовый обработчик DefaultExceptionHandler), если нужен свой обработчик, то предполагалось использовать _try так: _try SafePlace, YourExceptionHandler но сам я таким способом никогда не пользовался. Ну когда seh0.inc делал, то тестировал естественно, но тонкостей нихрена уже не помню. Короче, если нужен свой обработчик, ставь seh вручную, как в вышеозначенном примере. Но повторяю, это нативный SEH. Для RtlCopyMemory и т.п. работать будет. Для функций, которые явно вбрасывают исключение, используя ExRaiseDatatypeMisalignment, ExRaiseAccessViolation, ExRaiseStatus и т.д. и т.п. будет BSOD. Если в ДДК в описании функции написано что-то типа "Drivers must call XXX inside a try/except block.", то 99% значит эта функция явно вбрасывает исключение и нативный SEH работать не будет! Мне некогда уже с этой ботвой разбираться, хотя сделать это не очень сложно, но нужно желание Я приаттачил архив. Нужно декомпильнуть драйвер в каталоге seh_driver и посмотреть, как используется SEH. Код (Text): push offset SomeStructure call __SEH_prolog опасный код call __SEH_epilog Самое нужное в \IFSKIT\lib\wnet. В объектнике sehprolg.obj собственно код __SEH_prolog и __SEH_epilog. В остальных объектниках всякие __security_cookie и __safe_se_handler_table. Их линкер пихает в драйвер, но IMHO они не нужны. Объектники выдраны из ДДК'ашной wdm.lib. Перед погружение во всю эту ботву настоятельно рекомендуется прочитать статьи по внутренностям SEH, особенно Питрековскую "A Crash Course on theDepths of Win32 Structured Exception Handling" Если вдруг кто прикрутит, дайте знать 749890621__seh.part1.rar
Пока буду читать, скажите: есть код __try { какой – то код потом pcur = чему – то; } __except(EXCEPTION_EXECUTE_HANDLER) { pCur = NULL; } if(Ustr && uStr.Buffer) { ExFreePool(uStr.Buffer); } return pCur; вот как такое же сделать на masm32 ? _try код mov pcur, что – то _finally mov pcur, NULL mov eax, pcur ret так что ли ?
Нет. _finally выполнится в любом случае, вне зависимости от того, произошло исключение или нет. __except выполняется только при исключении, но __except в моих макросах не реализован. В данном случае можно сделать так: Код (Text): mov pcur, NULL _try код mov pcur, что–то _finally mov eax, pcur ret Если "mov pcur, что–то" - последняя строка кода внутри блока _try, то в отсутствии исключения в pcur запишется что–то и оно же и вернётся из процедуры. Если произойдет исключение, то pcur останется равна NULL и NULL же и вернется из процедуры.