Farabi left out an important part of that code - the handler, itself :P
.CODE
;------------------------------------------------------------------------------
;INSTALL PER-THREAD EH
;------------------------------------------------------------------------------
ASSUME FS:NOTHING;MASM assumes the use of this register to be ERROR by default
PUSH OFFSET PTExceptionHandler
PUSH FS:[0]
MOV FS:[0], ESP
;------------------------------------------------------------------------------
;THE CODE BETWEEN INSTALLATION & DE-INSTALLATION IS GUARDED BY THE PER-THREAD EH
;------------------------------------------------------------------------------
;MORE GUARDED CODE HERE
;Generate an exception inside the guarded area
INT 3;EXCEPTION BREAKPOINT
SafeOffset:
;MORE GUARDED CODE HERE
;------------------------------------------------------------------------------
;UNINSTALL PER-THREAD EH
;------------------------------------------------------------------------------
POP FS:[0]
ADD ESP,4
;------------------------------------------------------------------------------
;THE CODE HERE IS NOT GUARDED BY THE PER-THREAD EH
;------------------------------------------------------------------------------
;MORE UNGUARDED CODE HERE
INVOKE ExitProcess, NULL
;------------------------------------------------------------------------------
PTExceptionHandler PROC C pExcept:DWORD, pFrame:DWORD, pContext:DWORD, pDispatch:DWORD
MOV EAX, pContext
MOV [EAX].CONTEXT.regEip, OFFSET SafeOffset
MOV EAX,ExceptionContinueExecution
RET
PTExceptionHandler ENDP
;------------------------------------------------------------------------------