Структурированный обработчик исключений и Delphi

Я пытаюсь установить SEH без использования попробуйте except
(Это для меня, чтобы лучше понять, как работает SEH)

Следующий код не работает

type
    TSeh = packed record
    OldSeh:DWORD;
    NewSeh:DWORD;
    end;


procedure test;
begin
WriteLn('Hello from seh');
end;


var
    eu:TSeh;
    old_seh:DWORD;
begin
    asm
    mov eax,fs:[0]
    mov old_seh,eax
    end;
    eu.OldSeh := old_seh;
    eu.NewSeh := DWORD(@test);
    asm
        mov eax,offset eu
        mov fs:[0],eax
        ret //This will cause an exception because jumps on an invalid memory address
    end;
end.

Но это работает

procedure test;
begin
WriteLn('Hello from seh');
end;



begin
    asm
    push offset test
    push fs:[0]
    mov fs:[0],esp
    ret //This will cause an exception because jumps on an invalid memory address
    end;
end.

Что я делаешь неправильно? В чем разница между первым кодом и вторым?

12
задан opc0de 9 August 2011 в 11:40
поделиться