Microsoft-specific exception handling mechanisms

From Wikipedia, the free encyclopedia
(Redirected from Vectored Exception Handler)
Jump to navigation Jump to search

The Microsoft Windows family of operating systems employ some specific exception handling mechanisms.

Script error: No such module "anchor".Structured Exception Handling

Microsoft Structured Exception Handling is the native exception handling mechanism for Windows and a forerunner technology to Vectored Exception Handling (VEH).[1] 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.

Usage

Script error: No such module "Labelled list hatnote". 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,[2] for example, RaiseException to raise SEH exceptions manually.

Implementation

IA-32

Each thread of execution in Windows IA-32 edition or the WoW64 emulation layer for the x86-64 version has a link to an undocumented Template:Mono list at the start of its Thread Information Block. The __try statement essentially calls a compiler-defined EH_prolog function. That function allocates an Template:Mono on the stack pointing to the __except_handler3Template:Efn function in msvcrt.dll,Template:Efn 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 Template:Mono created by EH_prolog is extended with a few additional fields used by __except_handler3.[3]

In the case of an exception in user mode code, the operating systemTemplate:Efn parses the thread's Template:Mono list and calls each exception handler in sequence until a handler signals it has handled the exception (by return value) or the list is exhausted. The last one in the list is always the kernel32!UnhandledExceptionFilter which displays the General protection fault error message.Template:Efn Then the list is traversed once more giving handlers a chance to clean up any resources used. Finally, the execution returns to kernel modeTemplate:Efn 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.[4][5] 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 clang supports __try on both x86 and x64.[6]

Script error: No such module "anchor".Vectored Exception Handling

Vectored Exception Handling was introduced in Windows XP.[7] 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.[1][7] Compared with SEH, VEH works more like kernel-delivered Unix signals.[8]

Notes

Template:Notelist

References

Template:Reflist

External links

  • Script error: No such module "citation/CS1".
  • Script error: No such module "Citation/CS1". 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.
  • Script error: No such module "citation/CS1".
  • US patent 7,480,919 - Safe exceptions
  • Script error: No such module "citation/CS1". Covers the obscure details needed to get low-level SEH (and particularly SafeSEH) code to work on more modern Windows.
  • Script error: No such module "citation/CS1".
  • Script error: No such module "citation/CS1".
  • Script error: No such module "citation/CS1".
  • Script error: No such module "citation/CS1". An article explaining why Windows 7 SP1 ignores SafeSEH for some older binaries, while Windows XP SP3 honors it.
  1. a b Script error: No such module "citation/CS1".
  2. Script error: No such module "citation/CS1".
  3. Script error: No such module "citation/CS1"., Compiler based Structured Exception Handling section
  4. Script error: No such module "citation/CS1".
  5. Script error: No such module "citation/CS1".
  6. Script error: No such module "citation/CS1".
  7. a b Script error: No such module "citation/CS1".
  8. Script error: No such module "citation/CS1".