Кто - нибудь делал seh0 на masm32 (try и except) ?

Тема в разделе "WASM.WIN32", создана пользователем vxd2000, 8 авг 2005.

  1. vxd2000

    vxd2000 New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2005
    Сообщения:
    3
    Кто - нибудь делал seh0 (режим ядра) на masm32 (try и except) , в прмиере есть только try и finally.

    Надо except.
     
  2. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    А ты смотрел этот макрос ? Это тебе не Делфи :)

    _try MACRO SafePlace, xHandler:=<DefaultExceptionHandler>



    DefaultExceptionHandler - это и есть обработка seh0 (except)
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    «Драйверы режима ядра: Часть 8: Базовая техника: Работа с памятью.»



    ExceptionHandler — это и есть except (почти)
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Давно хотел предупредить ( а может я уже предупреждал ;) ).



    -------------------------------------------------------------------

    В KmdKit в некоторых примерах есть файлик seh0.inc. Там два макроса

    _try и _finally. Но они только для нативного SEH. Такое будет

    перехвытываться:



    _try

    xor eax, eax

    mov eax, [eax]

    _finally



    а такое нет:



    _try

    invoke ProbeForRead,...

    _finally



    При обломе ProbeForRead и другие требующие обёртки в SEH, явно

    вызывают одну системную функцию, которой надо, чтоб SEH-кадр был

    поставлен по определенным правилам: к нативному SEH добавляются

    кое-какие структуры. Я несколько раз пытался их прикрутить, но не

    получилось из-за ограниченности макросредств MASM.

    -------------------------------------------------------------------



    Нет времени это фиксить, так что имейте ввиду...
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Four-F



    Handler кстати должен cdecl быть, мы ведь это раньше выяснили, странно что ты не исправил макросы. А так

    макросы вполне можно юзать и не в драйверах.
     
  6. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Исправил конечно... в KmdKit1.8 должно быть cdecl. Для не драйверов у меня есть seh3.inc
     
  7. vxd2000

    vxd2000 New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2005
    Сообщения:
    3
    SteelRat, как тогда ставить:



    _try

    код



    DefaultExceptionHandler

    код

    или как ?

    Four-F, с функциями Rtl... будет же все работать ?
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Ох ты господи.. Смотри пример в статье.
     
  9. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    В 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):
    1. push offset SomeStructure
    2. call __SEH_prolog
    3. опасный код
    4. 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"



    Если вдруг кто прикрутит, дайте знать ;)



    [​IMG] 749890621__seh.part1.rar
     
  10. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
  11. vxd2000

    vxd2000 New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2005
    Сообщения:
    3
    Пока буду читать, скажите:

    есть код



    __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



    так что ли ?
     
  12. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Нет.



    _finally выполнится в любом случае, вне зависимости от того, произошло исключение или нет. __except выполняется только при исключении, но __except в моих макросах не реализован. В данном случае можно сделать так:


    Код (Text):
    1. mov pcur, NULL
    2.  
    3. _try
    4.  
    5. код
    6. mov pcur, что–то
    7.  
    8. _finally
    9.  
    10. mov eax, pcur
    11. ret




    Если "mov pcur, что–то" - последняя строка кода внутри блока _try, то в отсутствии исключения в pcur запишется что–то и оно же и вернётся из процедуры. Если произойдет исключение, то pcur останется равна NULL и NULL же и вернется из процедуры.