Документация мелкософта по сэх блокам какаято кривая. Указатели SEH фреймов еще ок сходятся, но указатель на блок регистров которые были в момент ошибки не тот ! Он откатывается выше данного указателя. ХЕЛП!
третий параметр в callback ф-ию это _CONTEXT, глядел я дебагером этот указатель, фактический CONTEXT начинается с CONTEXT+6C проверьте плз у себя
_CONTEXT описаный в статье, аналогичен тому, что описан в winnt.h и совершенно правильный. В процедуру обработки исключения передаётся один параметр (указатель на EXCEPTION_POINTERS), а не три.
какой 1 ???? тут даже 4 __cdecl _except_handler( struct _EXCEPTION_RECORD *ExceptionRecord, void * EstablisherFrame, struct _CONTEXT *ContextRecord, void * DispatcherContext ); и походу чувствуется шо эти SEH системы в 9х и NT разные
это хэндлер ставится VС++ для __try __except блока (try{} catch(...){}) это обертка компилятора над системным обработчиком
Параметр у функции один - указатель на структуру. А сама структура, на которую указывает этот указатель, состоит из нескольких частей. Да и выглядит она не так, как ты привёл, а так: Код (Text): typedef struct _EXCEPTION_POINTERS { PEXCEPTION_RECORD ExceptionRecord; PCONTEXT ContextRecord; } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS; посмотри пример в аттаче _1104955706__div_by_zero.zip
Второе поле структуры EXCEPTION_POINTERS - указатель на структуру CONTEXT, которая выглядит так: Код (Text): CONTEXT STRUCT ContextFlags DWORD ? ;offset 0h iDr0 DWORD ? ;offset 4h iDr1 DWORD ? ;offset 8h iDr2 DWORD ? ;offset 0Ch iDr3 DWORD ? ;offset 10h iDr6 DWORD ? ;offset 14h iDr7 DWORD ? ;offset 18h FloatSave FLOATING_SAVE_AREA <> ;offset 1Ch ;(sizeof FLOATING_SAVE_AREA = 70h) regGs DWORD ? ;offset 8Ch (1Ch + 70h) regFs DWORD ? ;offset 90h regEs DWORD ? ;offset 94h regDs DWORD ? ;offset 98h regEdi DWORD ? ;offset 9Ch regEsi DWORD ? ;offset 0A0h regEbx DWORD ? ;offset 0A4h regEdx DWORD ? ;offset 0A8h regEcx DWORD ? ;offset 0ACh regEax DWORD ? ;offset 0B0h regEbp DWORD ? ;offset 0B4h regEip DWORD ? ;offset 0B8h regCs DWORD ? ;offset 0BCh regFlag DWORD ? ;offset 0D0h regEsp DWORD ? ;offset 0D4h regSs DWORD ? ;offset 0D8h ExtendedRegisters db MAXIMUM_SUPPORTED_EXTENSION dup(?) CONTEXT ENDS В примере который в аттаче, использованы именно эти смещения. Они могут быть несколько другими. И зависит это от размера структуры FLOATING_SAVE_AREA, размер которой может варьироваться. И зависит он не от ОС, а от типа процессора (процессорозависимая).
cresta У меня сложилось впечатление, что Colombo имел ввиду не финальный обработчик, а внутрипоточный, которому действительно передается четыре параметра...
Colombo Вот, набросал на скорую руку демку. В ней генерируется исключение, которое затем устраняется во внутрипоточном обработчике. Внутрипоточный обработчик модифицирует структуру CONTEXT. З.Ы.: Проверил ее под Windows 2000 Pro (sp-3) русская версия. _1891974504__SEH.asm
Oleg_SK Внутрипоточным не пользуюсь, поэтому подумал, что финальный обработчик. Хотя какая разница, структура CONTEXT ведь одинакова в обоих случаях?
Colombo Прежде чем мутить воду проверь свой код и не спеши списывать собственные ошибки\описки на происки мелкософта Поточные обработчики работают одинаково в 9х и NT. А ты скорее всего путаешь УКАЗАТЕЛЬ на CONTEXT с самой структурой. Вот типичный примерчик, который работает всегда и везде: Код (Text): mov eax,[esp+0Сh] ;<- в eax указатель lpCONTEXT add dword [eax+0B8h],xbytes ;<- прибавляем к CONTEXT.regEIP xbytes для обхода ошибки cresta > "эти смещения. Они могут быть несколько другими" Могут, но только в принципе и на процессорах, существенно отличных от 32-бит x86. Иначе вся программная совместимость пойдет прахом