всем привет, пытаюсь написать свой обработчик для seh'a (на msvc++ v6.0), но возникла одна проблема, возможно ли как-нибудь передать в _initseh, адрес safe_place? и попутный вопрос, какие структуры находятся в hIgnore1 и hIgnore2 в обработчике _handler? Код (Text): struct seh_table { HWND hWnd; DWORD reg_esp; DWORD reg_ebp; DWORD reg_eip; }; int _handler(LPEXCEPTION_RECORD lpRecord,DWORD hIgnore1,LPCONTEXT lpContext,DWORD hIgnore2) { lpContext->Eip=seh.reg_eip; lpContext->Esp=seh.reg_esp; lpContext->Ebp=seh.reg_ebp; return 0; } __forceinline void _initseh() { _asm { lea eax,[seh] push _handler push dword PTR fs:[0] mov [seh.reg_esp],esp mov [seh.reg_ebp],esp //mov [seh.reg_eip],offset safe_place mov dword PTR fs:[0],esp } } __forceinline void _killseh() { _asm { pop dword ptr fs:[0] add esp,4 } } int main(void) { _initseh(); _asm int 3; //safe_place: _killseh(); }
Код (Text): int main(int argc, char** argv) { __try { _asm int 3 } __except(EXCEPTION_EXECUTE_HANDLER) { /* safe place */ } return 0; } Фтыкать и учить мат.часть: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndee pc/html/deep060399.asp
про __try, __catch, __except и __finally я давно знаю, поэтому и пишу СВОЙ обработчик, код, который приведен вами для моего случая не годится
hIgnore1 - указатель на структуру ERR: typedef struct _ERR { DWORD Next; DWORD Handler; } ERR, *PERR; Ничто не мешает добавить в эту структуру дополнительные поля (в т.ч. и адрес safe_place).
Ну например вот так. Код (Text): typedef struct _MYERR: ERR { DWORD safe_place; } MYERR, *PMYERR; push safe_place push _handler push dword PTR fs:[0] mov dword PTR fs:[0],esp