|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Янв 30, 2004 14:10:01 SEH-обработчик является stdcall. Но работать будет даже если обьявить его как cdecl, т.к. esp по выходе из него в любом случае будет восстановлен из fs:[0] (см. код). Если он будет stdcall, то mov esp, large fs:0 поместит в esp то же самое значение, которое уже там будет лежать. Если же он будет cdecl, то в esp будет неверное значение, но mov esp, large fs:0 его восстановит. Вот такая вот хитрость от кривых ручёнок :-) :77F8F436 ExecuteHandler@20: :77F8F436 push ebp :77F8F437 mov ebp, esp :77F8F439 push [ebp+arg_8] :77F8F43C push edx :77F8F43D push large dword ptr fs:0 :77F8F444 mov large fs:0, esp :77F8F44B push [ebp+arg_10] :77F8F44E push [ebp+arg_C] :77F8F451 push [ebp+arg_8] :77F8F454 push [ebp+arg_4] :77F8F457 mov ecx, [ebp+arg_14] :77F8F45A call ecx :77F8F45C mov esp, large fs:0 :77F8F463 pop large dword ptr fs:0 :77F8F46A mov esp, ebp :77F8F46C pop ebp :77F8F46D retn 14h :77F8F46D _RtlpExecuteHandlerForException@20 endp |
|
|
Дата: Янв 30, 2004 14:13:43 ЗЫ: В моём Iczelion'е везде stdcall. |
|
|
Дата: Янв 30, 2004 18:38:23 я кроме handler-ов вроде ничего не трассирую, и только простой ret встречал; |
|
|
Дата: Фев 2, 2004 16:33:01 [ Four-F: SEH-обработчик является stdcall.] Ты пишешь странные вещи.. Засунул я исключение xor eax, eax mov eax, [eax] в свою прогу и поставил бряк в ntdll.dll на адрес :77F8F44B push [ebp+arg_10], брякнулся, смотрю esp, записываю, шагаю дальше до выхода из call ecx, остановился на :77F8F45C mov esp, large fs:0, смотрю esp и... оно не равно ранее мной записанному, значит никаким stdcall здесь и не пахнет, и дядька Ицзелион прав объявляя обработчик как cdecl. |
|
|
Дата: Фев 4, 2004 13:53:23 Ладно, я не буду утверждать, что обработчик должен быть именно stdcall. Просто код ExecuteHandler построен таким образом, что он может быть и cdecl. Те обработчики, которые генерит msvc тоже cdecl - по выходу из них esp неправильный. Точно я этого незнаю, но скорее всего cdecl просто для экономии двух байт. Вмето ret 10h (3 байта) в cdecl используется простой ret (1 байт). В любом случае, как бы не передвигался esp при выходе из обработчика, он всё равно восстанавливается принудительно. Так что сказать кто прав вообще невозможно. Все правы. |
|
|
Дата: Фев 4, 2004 18:30:51 Прав, наверно, MS ;-) |
|
|
Дата: Фев 9, 2004 06:15:22 · Поправил: Asterix И всё-таки обработчик должен быть cdecl Если он будет stdcall, то приложение будет падать под 9x. Вот код из win98. _FREQASM:BFF76825 loc_BFF76825: ; CODE XREF: sub_BFF76819+5j _FREQASM:BFF76825 push ebp _FREQASM:BFF76826 mov ebp, esp _FREQASM:BFF76828 push [ebp+arg_8] _FREQASM:BFF7682B push edx _FREQASM:BFF7682C push large dword ptr fs:0 _FREQASM:BFF76833 mov large fs:0, esp _FREQASM:BFF7683A push [ebp+arg_10] _FREQASM:BFF7683D push [ebp+arg_C] _FREQASM:BFF76840 push [ebp+arg_8] _FREQASM:BFF76843 push [ebp+arg_4] _FREQASM:BFF76846 call [ebp+arg_14] _FREQASM:BFF76849 add esp, 10h _FREQASM:BFF7684C pop large dword ptr fs:0 _FREQASM:BFF76853 leave _FREQASM:BFF76854 retn |
|
|
Дата: Фев 9, 2004 10:37:24 Мда... Действительно cdecl. Спасибо за инфу. Сам бы я до маздая не добрался. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.097 |