Здравствуйте. Подскажите пожалуйста кто знает, что я не так делаю в SEH. На C реализовывал такую структуру проблем не было, а как это в asm перекинуть не могу понять. Код (Text): include shell32.inc include kernel32.inc .386 .model flat .const szTitle db "Exit Seh",0 szMessage db "Exit Seh",0 .code _start: call delta delta: pop ebp mov eax,ebp mov edx,ebp push offset Exeption push dword ptr fs:0 mov fs:0,esp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov eax,0 mov [eax], eax ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ERT2: mov ecx,eax push 0 push offset szTitle push offset szMessage push 0 call MessageBox ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mov eax,[esp] mov dword ptr fs:0,eax add esp, 8 push ebx call ExitProcess Exeption: pop eax pop ebx pop ecx pop edx push 0 push 0 push 0 push 0 call MessageBox lea eax,szMessage mov [ebx+0B0h],eax xor eax,eax ret end _start Заранее благодарен. С уважением, RED HAWK
Код (Text): struc SEH_CONTEXT ;Structure of the SEH context { .ddContextFlags dd ? .ddDR0 dd ? .ddDR1 dd ? .ddDR2 dd ? .ddDR3 dd ? .ddDR6 dd ? .ddDR7 dd ? .strcFloatingArea db (8*4+8*10) dup (?) .ddGS dd ? .ddFS dd ? .ddES dd ? .ddDS dd ? .ddEDI dd ? .ddESI dd ? .ddEBX dd ? .ddEDX dd ? .ddECX dd ? .ddEAX dd ? .ddEBP dd ? .ddEIP dd ? .ddCS dd ? .ddEFlags dd ? .ddESP dd ? .ddSS dd ? } virtual at 0 strcSEH SEH_CONTEXT @StrcSEHSize = ($ - strcSEH) end virtual _ExceptionHandler: ;Input: ; [esp+4] - strcExceptionRecord ; [esp+8] - ddEstablisherFrame ; [esp+0ch] - strcContextRecord ; [esp+10h] - ddDispatcherContext pushad mov ebp,[esp+0ch+4*8] ;ebp points to the exception structure mov eax,pntrReturnAddress mov [ebp+strcSEH.ddEIP],eax popad xor eax,eax ret 4*4
xssww2 1) Для чего pushad с ebp? Или юзать edx\ecx "безпантово"? 2) ret 4*4 - ва-аще не правильно, т.к. обработчик вызывается как cdecl, а не stdcall -> нужно просто ret