The
Microsoft Windows family of
operating system
An operating system (OS) is system software that manages computer hardware, software resources, and provides common daemon (computing), services for computer programs.
Time-sharing operating systems scheduler (computing), schedule tasks for ef ...
s employ some specific
exception handling
In computing and computer programming, exception handling is the process of responding to the occurrence of ''exceptions'' – anomalous or exceptional conditions requiring special processing – during the execution of a program. In general, a ...
mechanisms.
Structured Exception Handling
Microsoft Structured Exception Handling is the native exception handling mechanism for Windows and a forerunner technology to
Vectored Exception Handling The Microsoft Windows family of operating systems employ some specific exception handling mechanisms.
Structured Exception Handling
Microsoft Structured Exception Handling is the native exception handling mechanism for Windows and a forerunner ...
(VEH).
It features the
finally
mechanism not present in standard C++ exceptions (but present in most
imperative languages introduced later). SEH is set up and handled separately for each
thread of execution
In computer science, a thread of execution is the smallest sequence of programmed instructions that can be managed independently by a scheduler, which is typically a part of the operating system. The implementation of threads and processes dif ...
.
Usage
Microsoft supports SEH as a programming technique at the compiler level only. MS Visual C++ compiler features three non-standard keywords:
__try
,
__except
and
__finally
— for this purpose. Other exception handling aspects are backed by a number of
Win32 API functions, for example,
RaiseException
to raise SEH exceptions manually.
Implementation
IA-32
Each
thread of execution
In computer science, a thread of execution is the smallest sequence of programmed instructions that can be managed independently by a scheduler, which is typically a part of the operating system. The implementation of threads and processes dif ...
in Windows
IA-32 edition or the
WoW64
In computing on Microsoft platforms, WoW64 (Windows 32-bit on Windows 64-bit) is a subsystem of the Windows operating system capable of running 32-bit applications on 64-bit Windows. It is included in all 64-bit versions of Windows—including ...
emulation layer for the
x86-64
x86-64 (also known as x64, x86_64, AMD64, and Intel 64) is a 64-bit version of the x86 instruction set, first released in 1999. It introduced two new modes of operation, 64-bit mode and compatibility mode, along with a new 4-level paging ...
version has a link to an undocumented
list
A ''list'' is any set of items in a row. List or lists may also refer to:
People
* List (surname)
Organizations
* List College, an undergraduate division of the Jewish Theological Seminary of America
* SC Germania List, German rugby uni ...
at the start of its
Thread Information Block
In computing, the Win32 Thread Information Block (TIB) is a data structure in Win32 on x86 that stores information about the currently running thread. It is also known as the Thread Environment Block (TEB) for Win32. It descended from, and is bac ...
. The
__try
statement essentially calls a compiler-defined
EH_prolog
function. That function allocates an
on the stack pointing to the
__except_handler3
function in
msvcrt.dll
, then adds the record to the list's head. At the end of the
__try
block a compiler-defined
EH_epilog
function is called that does the reverse operation. Either of these compiler-defined routines can be
inline. All the programmer-defined
__except
and
__finally
blocks are called from within
__except_handler3
. If the programmer-defined blocks are present, the created by
EH_prolog
is extended with a few additional fields used by
__except_handler3
.
In the case of an exception in
user mode code, the operating system parses the thread's list and calls each exception handler in sequence until a handler signals it has handled the exception (by
return value
In computer programming, a return statement causes execution to leave the current subroutine and resume at the point in the code immediately after the instruction which called the subroutine, known as its return address. The return address is s ...
) or the list is exhausted. The last one in the list is always the
kernel32!UnhandledExceptionFilter
which displays the
General protection fault error message. Then the list is traversed once more giving handlers a chance to clean up any resources used. Finally, the execution returns to
kernel mode where the process is either resumed or terminated.
The patent on this mode of SEH, US5628016, expired in 2014.
x86-64
SEH on 64-bit Windows does not involve a runtime exception handler list; instead, it uses a
stack unwinding table (
UNWIND_INFO
) interpreted by the system when an exception occurs.
This means that the compiler does not have to generate extra code to manually perform stack unwinding and to call exception handlers appropriately. It merely has to emit information in the form of unwinding tables about the stack frame layout and specified exception handlers.
Support
GCC 4.8+ from
Mingw-w64 supports using 64-bit SEH for C++ exceptions.
LLVM
LLVM is a set of compiler and toolchain technologies that can be used to develop a front end for any programming language and a back end for any instruction set architecture. LLVM is designed around a language-independent intermediate repre ...
clang supports
__try
on both x86 and x64.
Vectored Exception Handling
Vectored Exception Handling was introduced in
Windows XP
Windows XP is a major release of Microsoft's Windows NT operating system. It was release to manufacturing, released to manufacturing on August 24, 2001, and later to retail on October 25, 2001. It is a direct upgrade to its predecessors, Wind ...
.
Vectored Exception Handling is made available to Windows programmers using languages such as
C++ and
Visual Basic. VEH does not replace Structured Exception Handling (SEH); rather, VEH and SEH coexist, with VEH handlers having priority over SEH handlers.
Compared with SEH, VEH works more like kernel-delivered
Unix signals.
Notes
References
External links
*
* Note that the examples given there do not work as-is on modern Windows systems (post XP SP2) due to the changes Microsoft made to address the security issues present in the early SEH design. The examples still work on later versions of Windows if compiled with
/link /safeseh:no
.
*
*
* Covers the obscure details needed to get low-level SEH (and particularly SafeSEH) code to work on more modern Windows.
*
*
*
* {{cite web, url=https://www.optiv.com/blog/old-meets-new-microsoft-windows-safeseh-incompatibility/, title=Old Meets New: Microsoft Windows SafeSEH Incompatibility, author=Joshua J. Drake, date=10 Jan 2012 An article explaining why Windows 7 SP1 ignores SafeSEH for some older binaries, while Windows XP SP3 honors it.
Control flow
Microsoft application programming interfaces