Как использовать SEH в 64-битной сборке с MASM64? - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь узнать, как использовать структурированную обработку исключений (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 но его никогда не вызывают.

Так что же я здесь не так делаю?

...