Вы не можете использовать test
процедуру в качестве функции обратного вызова исключения, потому что функция обратного вызова исключения имеет другой прототип. Читайте статью Мэтта Пьетрека , IMO лучший источник информации о Win32 SEH.
Обновление
Для дальнейших исследований я бы порекомендовал внести следующие изменения в код, чтобы сделать проблему более понятной:
function test: Integer;
begin
WriteLn('Hello from seh');
Result:= 0;
end;
(поскольку обратный вызов исключения должен возвращать целочисленное значение в EAX)
И для первого фрагмента кода
begin
asm
mov eax,fs:[0]
mov old_seh,eax
end;
eu.OldSeh := old_seh;
eu.NewSeh := Cardinal(@test);
asm
lea eax, eu
mov fs:[0],eax
mov ds:[0],eax //This will cause an AV exception
end;
end.
Теперь вы видите, что исключение правильно обрабатывается как:
---------------------------
Debugger Fault Notification
---------------------------
Project C:\Users\Serg\Documents\RAD Studio\Projects\Project13.exe faulted with
message: 'access violation at 0x004050f5: write of address 0x00000000'. Process
Stopped. Use Step or Run to continue.
---------------------------
но не вашим обработчиком исключений. Вероятно, ОС игнорирует записи регистрации исключений, которые не основаны на стеке (ОС может легко это сделать, поскольку она знает минимальные и максимальные значения стека)