Я пытаюсь узнать, как использовать структурированную обработку исключений (SEH) в 64-разрядном исполняемом файле Windows, скомпилированном с MASM64.
Пока что давайте рассмотрим этот простой пример.Моя цель теста - подавить исключение недопустимой операции в этой функции:
.data
holdPrevRSP QWORD ?
.code
ExceptionFrm PROC
; Exception handler?
mov rsp, [holdPrevRSP]
; int 3 ; tried to invoke debugger manually
add rsp, 100h
pop r15
pop r14
pop r13
pop r12
pop rsi
pop rsi
pop rbp
pop rbx
ret
ExceptionFrm ENDP
TestFunc PROC FRAME:ExceptionFrm
; Define prolog:
; Need to save:
; RBX, RBP, RDI, RSI, RSP, R12, R13, R14, and R15
push rbx
.pushreg rbx
push rbp
.pushreg rbp
push rdi
.pushreg rdi
push rsi
.pushreg rsi
push r12
.pushreg r12
push r13
.pushreg r13
push r14
.pushreg r14
push r15
.pushreg r15
.ENDPROLOG
; really primitive way to restore RSP
; i know it's not multi-threaded safe!
; It's just for this test...
mov [holdPrevRSP], rsp
; define home stack for this function
sub rsp, 100h
db 62h, 0, 0, 0, 0, 0 ; should raise invalid opcode exception
; Epilog
add rsp, 100h
pop r15
pop r14
pop r13
pop r12
pop rsi
pop rsi
pop rbp
pop rbx
ret
TestFunc ENDP
END
Думаю, моя проблема в том, что я не до конца понимаю, что делает ключевое слово FRAME:
.
Яс помощью Visual Studio 2017 для запуска этого теста.Когда я выполняю этот код с помощью отладчика, когда я перехожу через invalid opcode
, процесс вызывает исключение отладчика в каком-то другом месте, не связанном с процессом.
Затем я пытался поместить точку останова в мою ExceptionFrm
но его никогда не вызывают.
Так что же я здесь не так делаю?