· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Вопрос по SEH.

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Янв 27, 2004 00:19:24

Объясните пожалуйста, почему Ицзелион после выхода из SEHHandler
не делает коррекцию стека и почему SEHHandler объявляется как:SEHHandler proc C ??
http://www.wasm.ru/article.php?article=1002006


Дата: Янв 27, 2004 01:02:15 · Поправил: volodya

Туплю :)
Программу пробовал запускать?


Дата: Янв 27, 2004 01:23:51

Какую, Ицзелионову? Просто я смотрю как поставлен SEH у Four-F, потом смотрю у Ицзелиона и уже ни во что не врубаюсь, короче сомневаюсь я, хотя на основе Ицзелионова варианта я написал процедуру, которая вроде работает, но... не знаю...


Дата: Янв 27, 2004 01:27:21

Вот собственно она:
GetAddressOfVAForCurrentApiInIAT  PROTO :DWORD, :DWORD, :DWORD

SEH struct
   PrevLink       dd  ?   ; the address of the previous seh structure
   CurrentHandler dd  ?   ; the address of the new exception handler
   SafeOffset     dd  ?   ; the offset where it's safe to continue execution
   PrevEsp        dd  ?   ; the old value in esp
   PrevEbp        dd  ?   ; the old value in ebp
SEH ends

.CODE

GetAddressOfVAForCurrentApiInIAT proc uses edi BaseOfImage:DWORD, lpszNameOfDll:DWORD, lpszNameOfApi:DWORD
LOCAL ValidPE:BOOL
LOCAL seh:SEH
LOCAL VAOfApi:DWORD
   and ValidPE, FALSE   ; обнуляем локальную переменную ValidPE
   assume fs:nothing
   push fs:[0]
   pop seh.PrevLink
   mov seh.CurrentHandler, OFFSET SEHHandler
   mov seh.SafeOffset, OFFSET @FinalExit
   lea eax, seh
   mov fs:[0], eax
   assume fs:error
   mov seh.PrevEsp, esp
   mov seh.PrevEbp, ebp
   mov edi, BaseOfImage
   assume edi:ptr IMAGE_DOS_HEADER
   .IF [edi].e_magic == IMAGE_DOS_SIGNATURE
       add edi, [edi].e_lfanew
       assume edi:ptr IMAGE_NT_HEADERS
       .IF [edi].Signature == IMAGE_NT_SIGNATURE
           inc ValidPE            ; mov ValidPE, TRUE
       .ENDIF
   .ENDIF
@FinalExit:
   push seh.PrevLink
   assume fs:nothing
   pop fs:[0]
   assume fs:error
   cmp ValidPE, FALSE
   je @not_found
   assume edi:ptr IMAGE_NT_HEADERS
   mov edi, [edi].OptionalHeader.DataDirectory[sizeof IMAGE_DATA_DIRECTORY].VirtualAddress
   add edi, BaseOfImage
   assume edi:ptr IMAGE_IMPORT_DESCRIPTOR
@loop1:
   mov eax, [edi].Name1
   test eax, eax
   jz @not_found
   add eax, BaseOfImage
   invoke lstrcmpi, lpszNameOfDll, eax
   test eax, eax
   jz @F
   add edi, sizeof IMAGE_IMPORT_DESCRIPTOR
   jmp @loop1
@@:
   invoke GetModuleHandle, lpszNameOfDll
   invoke GetProcAddress, eax, lpszNameOfApi
   mov VAOfApi, eax
   mov edi, [edi].FirstThunk
   assume edi:nothing
   add edi, BaseOfImage
@loop2:
   mov eax, DWORD PTR [edi]
   test eax, eax
   jz @not_found
   cmp VAOfApi, eax
   je @found
   add edi, 004h
   jmp @loop2
@found:
   mov eax, edi
   ret
@not_found:
   xor eax, eax
   ret
GetAddressOfVAForCurrentApiInIAT endp

SEHHandler proc C uses edx pExcept:DWORD, pFrame:DWORD, pContext:DWORD, pDispatch:DWORD
   mov edx, pFrame
   assume edx:ptr SEH
   mov eax, pContext
   assume eax:ptr CONTEXT
   push [edx].SafeOffset
   pop [eax].regEip
   push [edx].PrevEsp
   pop [eax].regEsp
   push [edx].PrevEbp
   pop [eax].regEbp
   mov eax, ExceptionContinueExecution
   ret
SEHHandler endp


Дата: Янв 27, 2004 02:18:58

Кажется когда объявляется процедура как SEHHandler proc C внутри неё нет коррекции стека как в stdcall, тогда, по идее эта корекция должна делаться после выхода.. но... её нету, может и не нужно тогда?


Дата: Янв 27, 2004 02:28:48 · Поправил: Quantum

Asterix
Хмм... Вот SEH из кода, который я использую для "безопасного" доступа к LPT:
ALIGN DWORD
SEH_Filter PROC pExPtrs:DWORD
	mov edx,pExPtrs
	mov edx,(EXCEPTION_POINTERS PTR [edx]).pExceptionRecord
	xor eax,eax			; EXCEPTION_CONTINUE_SEARCH
	cmp (EXCEPTION_RECORD PTR [edx]).ExceptionCode,EXCEPTION_PRIV_INSTRUCTION
	jne @F
	mov edx,pExPtrs
	mov edx,(EXCEPTION_POINTERS PTR [edx]).ContextRecord
	inc (CONTEXT PTR [edx]).regEip	; skip error
	inc bPrivException		; set error flag
	dec eax				; EXCEPTION_CONTINUE_EXECUTION
@@:
	ret
SEH_Filter ENDP
Такое у меня работает и стек при этом не страдает... Может Iczelion просто допустил опечатку :-)


Дата: Янв 27, 2004 03:13:22

Вряд ли у него опечатка сразу в нескольких туторах, просто я не могу точно себе объяснить что и почему, хотя и догадываюсь ;-)


Дата: Янв 27, 2004 03:19:39

Asterix
А ты заметил, что в самом туториале этой "C" нет? ;-)


Дата: Янв 27, 2004 03:28:04

Гы... Aquila потерял при переводе :-)))
В исходнике она есть!


Дата: Янв 27, 2004 12:22:15

> Кажется когда объявляется процедура как SEHHandler proc
> C внутри неё нет коррекции стека как в stdcall, тогда,
> по идее эта корекция должна делаться после выхода..
> но... её нету, может и не нужно тогда

Коррекция есть, в ntdll :)


Дата: Янв 27, 2004 13:18:24

Dr.Golova

А в 9х? ;-)


Дата: Янв 27, 2004 13:42:20

Asterix
Гы... Aquila потерял при переводе :-)))
Исходники при переводе я не трогал ;).


Дата: Янв 28, 2004 14:42:18

А в 9х? ;-)
Там будет синий экран


Дата: Янв 28, 2004 15:11:47
Правка

А я тоже не заметил соглашения у SEHProc, писал по умолчанию (stdcall) - «и ничего»… Пока работает.
Или мне сильно повезло?


Дата: Янв 29, 2004 10:52:39 · Поправил: je_

значить для программы это НЕ-stdcall.
усё

тебе повезло, так как win сразу восстанавливает esp из ebp

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.102