![]() |
eXeL@B —› Программирование —› SEH в Delphi |
Посл.ответ | Сообщение |
|
Создано: 15 июня 2007 16:05 · Личное сообщение · #1 Здраствуйте. У меня такая проблема на функцию MySeh переходит по ошибки но назад функция ничего не передает то есть по возврашению EAX как был нулем так и остался. Может я че не так делаю. Кто связывался с этим на делфях подскажите, может есть какие нибудь заголовочные (заготовочные) файлы как в С++ (EXCPT.H) или статьи по делфи и seh. var ss:dword; ... Function MySEH( ExceptionRecord:_EXCEPTION_RECORD; EstablisherFrame: DWord; var ContextRecord:_CONTEXT; var DispatcherContext:DWord):DWord; stdcall; Begin ContextRecord.Eax:= DWord(@SS); //Передаеться адрес SS в ContextRecord.Eax showmessage('SEH'); result:=0; End; procedure TForm1.FormCreate(Sender: TObject); var handler:DWord; begin Handler:=DWord(@MYSeh); asm push Handler push FS:[0] mov FS:[0],ESP xor eax,eax mov [eax],1 // по возврашению как был нулем так и остаеться. mov eax,[ESP] mov FS:[0], EAX add esp, 8 end; end; ![]() |
|
Создано: 15 июня 2007 16:20 · Личное сообщение · #2 |
|
Создано: 15 июня 2007 16:41 · Личное сообщение · #3 program SEH; uses Windows; type _SEH = record SafeEip:DWORD; // The offset where it's safe to continue execution PrevEsp:DWORD; // The previous value of esp PrevEbp:DWORD; // The previous value of ebp end; // // Exception disposition return values. // EXCEPTION_DISPOSITION = DWORD; const ExceptionContinueExecution = 0; ExceptionContinueSearch = 1; ExceptionNestedException = 2; ExceptionCollidedUnwind = 3; szCaption : PChar = 'SEH Test' + #0; szNotOccured : PChar = 'Exception NOT occured !' + #0; szOccured : PChar = 'Exception occured !' + #0; var __seh : _SEH; lpText : PAnsiChar; label _SafePlace; {$O+} function _except_handler( ExceptionRecord:PExceptionRecord; EstablisherFrame:Pointer; ContextRecord:PContext; DispatcherContext:Pointer): EXCEPTION_DISPOSITION; cdecl; begin ContextRecord.Eip := __seh.SafeEip; ContextRecord.Esp := __seh.PrevEsp; ContextRecord.Ebp := __seh.PrevEbp; // Tell the OS to restart the faulting instruction Result := ExceptionContinueExecution; end; {$O-} begin lpText := szOccured; asm push OFFSET _except_handler push DWORD PTR fs:[0] // address of next ERR structure mov fs:[0], esp // give FS:[0] the ERR address just made mov __seh.SafeEip, OFFSET _SafePlace mov __seh.PrevEsp, esp mov __seh.PrevEbp, ebp end; asm db 0CCh end; lpText := szNotOccured; _SafePlace: asm pop DWORD PTR fs:[0] // restore next ERR structure to FS:[0] add esp, 4 // throw away rest of ERR structure end; MessageBox(0, lpText, szCaption, MB_OK or MB_ICONINFORMATION); end. ![]() |
|
Создано: 15 июня 2007 20:41 · Личное сообщение · #4 |
|
Создано: 15 июня 2007 21:01 · Личное сообщение · #5 |
|
Создано: 18 июня 2007 11:38 · Поправил: YouROK · Личное сообщение · #6 |
|
Создано: 19 июня 2007 10:43 · Личное сообщение · #7 |
|
Создано: 19 июня 2007 11:35 · Личное сообщение · #8 |
![]() |
eXeL@B —› Программирование —› SEH в Delphi |