Сейчас на форуме: hgdagon, asfa (+3 невидимых)

 eXeL@B —› Программирование —› SEH в Delphi
Посл.ответ Сообщение

Ранг: 21.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 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;




Ранг: 240.5 (наставник)
Активность: 0.190
Статус: Участник
Author of ACKiller

Создано: 15 июня 2007 16:20
· Личное сообщение · #2

Попробуй в отладчике посмотреть! Попробуй запихнуть в ЕАХ 0х1234, посмотри туда ли обработчик кладет адрес переменной.



Ранг: 115.1 (ветеран), 3thx
Активность: 0.070
Статус: Участник

Создано: 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.



Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 15 июня 2007 20:41
· Личное сообщение · #4

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;

жесть =]

-----
Shalom ebanats!




Ранг: 115.1 (ветеран), 3thx
Активность: 0.070
Статус: Участник

Создано: 15 июня 2007 21:01
· Личное сообщение · #5

SLV
это было сделано так чтоб зрительно разделить блоки, ошибкой не является

SLV пишет:
// =)))))


именно, здесь мог быть код на паскале ;)



Ранг: 21.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 18 июня 2007 11:38 · Поправил: YouROK
· Личное сообщение · #6

С SEH разобрался, но оказалось что они мне не подходят.
Это тот же самый try except тоесть по всей программе у меня не получилось.
Даже если в начале делать два пуша и затем вносить туда адреса почемуто не сработало.
Вносил в отдельный масив тоже не катит.
Всем спасибо.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 19 июня 2007 10:43
· Личное сообщение · #7

Значит юзай VEH

-----
Yann Tiersen best and do not fuck




Ранг: 309.8 (мудрец), 21thx
Активность: 0.170
Статус: Участник

Создано: 19 июня 2007 11:35
· Личное сообщение · #8

лучше посмотри нет ли ошибок в твоём коде...
например тут:
Function MySEH(
ExceptionRecord:_EXCEPTION_RECORD;
EstablisherFrame: DWord;
var ContextRecord:_CONTEXT;
var DispatcherContext:DWord):DWord; stdcall;

я вижу 5 ошибок =]

-----
Shalom ebanats!



 eXeL@B —› Программирование —› SEH в Delphi
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати