{{위키데이터 속성 추적}}
[[마이크로소프트 윈도우]] [[운영 체제]]는 운영 체제 특성에 기반한 예외 처리 메커니즘을 사용한다.

== {{앵커|SEH}}구조화된 예외 처리 (SEH : Structured Exception Handling) ==
마이크로소프트 구조화된 예외 처리 (Microsoft Structured Exception Handling)는 윈도우를 위한 네이티브 예외 처리 메커니즘이며 VEH의 전신이다.<ref name="devx">{{웹 인용
 |url          = http://www.devx.com/microsoftISV/Article/15992
 |title        = Vectored Exception Handling in Windows Server 2003 (Through Internet Archive)
 |archiveurl   = https://web.archive.org/web/20080118162324/http://www.devx.com/microsoftISV/Article/15992
 |archivedate  = 2008-01-18
 |확인날짜 = 2006-10-07
 |url-status = dead
}}</ref> 이것은 표준 C++ 예외에는 존재하지 않는 <code>finally</code> 메커니즘을 특징으로 갖는다(그러나 대부분의 [[명령형 프로그래밍]] 언어들에서는 이후 소개되었다). SEH는 실행의 각 [[스레드]]를 위해 독립적으로 설치되고 처리된다.

SEH의 마이크로소프트 구현은 [[볼랜드]], {{미국 특허|5,628,016}} 라이선스의 특허권에 기반한다. 오픈소스 운영 체제 시스템들은 이 특허권 때문에 SEH 기반 메커니즘을 채택하는 것을 꺼린다.<ref>{{웹 인용
 |url = http://uninformed.org/index.cgi?v=5&a=2&p=4
 |author = Matt Miller [aka skape]
 |publisher = Uninformed Journal
 |title = Preventing the Exploitation of SEH Overwrites
 |date = September 2006
 |확인날짜 = 2016-01-02
 |보존url = https://web.archive.org/web/20160304030422/http://uninformed.org/index.cgi?v=5&a=2&p=4
 |보존날짜 = 2016-03-04
 |url-status = dead
 }}</ref>

=== 사용 ===
마이크로소프트는 SEH를 단지 컴파일러 수준에서의 프로그래밍 기법으로 지원한다. MS 비주얼 C++ 컴파일러는 이 목적을 위해 세개의 표준화되지 않은 키워드: <code>__try</code>, <code>__except</code> 그리고 <code>__finally</code> 라는 특징을 갖는다. 다른 예외 처리 측면들은 수많은 윈도우 API 함수들의 지원을 받는다.<ref>{{웹 인용
 |url = http://msdn.microsoft.com/en-us/library/ms680659%28VS.85%29.aspx
 |title = Structured Exception Handling Functions
 |date = 2009-11-12
 |work = MSDN Library
 |author = Microsoft Corp.
 |accessdate = 2009-11-17
}}</ref> 예를 들면 SEH 예외를 직접 일으키기 위한 <code>RaiseException</code>가 있다.

=== 구현 ===
윈도우에서 실행의 각 스레드는 자신의 [[스레드 정보 블록]]의 시작에서 문서화되지 않은 _EXCEPTION_REGISTRATION_RECORD 리스트와의 연결을 갖는다. <code>__try</code> 선언은 근본적으로 컴파일러에서 정의된 <code>EH_prolog</code> 함수를 호출한다. 이 함수는 스택에서 _EXCEPTION_REGISTRATION_RECORD를 할당하며, 이것은 <code>msvcrt.dll</code>에서 <code>__except_handler3</code> 함수를 가리키고,{{Efn|이름은 VC 런타임의 버전들에 따라 다르다.}}{{Efn|VC 런타임과 정적으로 링크된 다른 프로그램들 뿐만 아니라 <code>ntdll.dll</code>와 <code>kernel32.dll</code>는 컴파일된 이 함수를 갖는다.}} 리스트의 헤드에 레코드를 추가한다. <code>__try</code> 블록의 끝에서 컴파일러에서 정의된 역 연산을 수행하는 <code>EH_epilog</code> 함수가 호출된다. 이 컴파일러에서 정의된 루틴들은 인라인화될 수 있다. 모든 프로그래머가 정의한 <code>__except</code> 와 <code>__finally</code> 블록들은 <code>__except_handler3</code> 내부에서 호출된다. 만약 이러한 블록들이 존재한다면 생성된 _EXCEPTION_REGISTRATION_RECORD는 소수의 추가적인 필드들로 확장되며, 이것은 <code>__except_handler3</code>에 의해 사용된다.<ref>{{웹 인용
 |url = http://stoned-vienna.com/html/index.php?page=windows-exception-handling
 |author = Peter Kleissner
 |title = Windows Exception Handling
 |date = February 2009
 |accessdate = 2009-11-21
}}</ref>

사용자 모드 코드에서의 예외의 경우, 운영 체제는 {{Efn|더 구체적으로, <code>ntdll!RtlDispatchException</code> 시스템 루틴은 이후 <code>nt!KiDispatchException</code> 커널 함수에서 호출되는 <code>ntdll!KiUserExceptionDispatcher</code>로부터 호출된다.({{웹 인용
 |url=http://www.nynaeve.net/?p=201
 |title=A catalog of NTDLL kernel mode to user mode callbacks, part 2: KiUserExceptionDispatcher
 |author=Ken Johnson
 |date=November 16, 2007 <!-- , 7:00 am --> }} for details)}} 핸들러 신호가 예외를 처리하거나 리스트가 끝날 때까지 스레드의 _EXCEPTION_REGISTRATION_RECORD 리스트를 분석하고 순서에 따라 각 예외 처리기를 호출한다. 리스트의 마지막은 항상 [[일반 보호 장애]]를 표시하는 <code>kernel32!</code><code>UnhandledExceptionFilter</code>이다.{{Efn|이 메시지는 프로세스의 [http://msdn.microsoft.com/en-us/library/ms680548%28VS.85%29.aspx error mode]를 변경함으로써 조용해진다; 기본 마지막 처리기는 [http://msdn.microsoft.com/en-us/library/ms680634(VS.85).aspx SetUnhandledExceptionFilter]로 대체될 수 있다.}} 그 후 리스트는 처리기에게 사용된 자원들을 청소할 기회를 주며 한번 더 순회된다. 마지막으로 실행은 커널 모드로 반환되는데{{Efn|<code>ntdll!KiUserExceptionDispatcher</code>은 <code>nt!ZwContinue</code> 또는 <code>nt!ZwRaiseException</code>를 호출한다.}} 여기는 프로세스가 재개되거나 종료되는 곳이다.

== {{앵커|VEH}}벡터화된 예외 처리 (VEH :Vectored Exception Handling) ==
벡터화된 예외 처리(Vectored Exception Handling)는 [[윈도우 XP]]에서 도입되었다.<ref name="VEH">{{웹 인용
 |url = http://msdn.microsoft.com/en-us/magazine/cc301714.aspx
 |title = New Vectored Exception Handling in Windows XP
}}</ref> VEH는 C++과 비주얼 베이직 같은 언어를 사용하는 윈도우 프로그래머에게 사용 가능하게 만들어졌다. VEH는 SEH를 대체하는 것이 아니라 VEH가 SEH보다 더 높은 우선 순위를 가짐으로써 공존한다.<ref name="devx">{{웹 인용
 |url          = http://www.devx.com/microsoftISV/Article/15992
 |title        = Vectored Exception Handling in Windows Server 2003 (Through Internet Archive)
 |archiveurl   = https://web.archive.org/web/20080118162324/http://www.devx.com/microsoftISV/Article/15992
 |archivedate  = 2008-01-18
 |확인날짜 = 2006-10-07
 |url-status = dead
}}</ref><ref name="VEH">{{웹 인용
 |url = http://msdn.microsoft.com/en-us/magazine/cc301714.aspx
 |title = New Vectored Exception Handling in Windows XP
}}</ref> SEH와 비교해서, VEH는 더 전통적인 [[알림 콜백 스킴]]과 닮았다.<ref>{{웹 인용
 |url = http://msdn.microsoft.com/en-us/magazine/cc300448.aspx
 |title = Windows Server 2003 Discover Improved System Info, New Kernel, Debugging, Security, and UI APIs
}}</ref>

== 노트 ==
{{Notelist|30em}}

== 각주 ==
{{각주|30em}}

== 외부 링크 ==
* {{웹 인용
 |url = http://msdn.microsoft.com/en-us/library/ms680657%28VS.85%29.aspx
 |title = Structured Exception Handling
 |date = 2009-11-12
 |work = MSDN Library
 |author = Microsoft Corp.
 |accessdate = 2009-11-17}}
* {{저널 인용
 |author       = [[Matt Pietrek]]
 |date         = Jan 1997
 |title        = A Crash Course on the Depths of Win32 Structured Exception Handling
 |journal      = MSJ
 |volume       = 12
 |issue        = 1
 |pages        = 
 |url          = http://www.microsoft.com/msj/0197/Exception/Exception.aspx
 |doi          = 
 |pmid         = 
 |pmc          = 
 |확인날짜 = 2016-01-02
 |보존url    = https://web.archive.org/web/20150929000043/http://www.microsoft.com/msj/0197/exception/exception.aspx#
 |보존날짜 = 2015-09-29
 |url-status = dead
}} 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 <code>/link /safeseh:no</code>.
* {{웹 인용
 |url = https://www.tortall.net/projects/yasm/manual/html/objfmt-win32-safeseh.html
 |title = win32: Safe Structured Exception Handling
 |publisher = [[Yasm]] manual}}
* {{미국 특허|7,480,919|US patent 7,480,919 - Safe exceptions}}
* {{웹 인용
 |url = http://jpassing.com/2008/05/20/fun-with-low-level-seh/
 |title = Fun with low level SEH
 |author = Johannes Passing
 |date = May 20, 2008}} Covers the obscure details needed to get low-level SEH (and particularly SafeSEH) code to work on more modern Windows.
* {{웹 인용
 |url = http://www.openrce.org/articles/full_view/21
 |title = Reversing Microsoft Visual C++ Part I: Exception Handling
 |author = Igor Skochinsky
 |date = Monday, March 6, 2006 12:02.38 CST
 |work = 
 |publisher = OpenRCE
 |accessdate = 2009-11-17}}
* {{웹 인용
 |url = http://blogs.technet.com/b/srd/archive/2009/02/02/preventing-the-exploitation-of-seh-overwrites-with-sehop.aspx
 |title = Preventing the Exploitation of Structured Exception Handler (SEH) Overwrites with SEHOP
 |author = Matt Miller
 |publisher = Technet
 |date = 2 Feb 2009
 |확인날짜 = 2016-01-02
 |보존url = https://web.archive.org/web/20140701184837/http://blogs.technet.com/b/srd/archive/2009/02/02/preventing-the-exploitation-of-seh-overwrites-with-sehop.aspx
 |보존날짜 = 2014-07-01
 |url-status = dead
 }}
* {{웹 인용
 |title        = Bypassing SEHOP
 |url          = http://www.sysdream.com/sites/default/files/sehop_en.pdf
 |author       = Stéfan Le Berre, Damien Cauquil
 |publisher    = Sysdream
 |date         = 22 Dec 2009
 |확인날짜 = 2014년 7월 8일
 |보존url    = https://web.archive.org/web/20120907022250/http://www.sysdream.com/sites/default/files/sehop_en.pdf
 |보존날짜 = 2012년 9월 7일
 |url-status = dead
}}
* {{웹 인용
 |url = http://blog.accuvant.com/jdrakeaccuvant/old-meets-new-microsoft-windows-safeseh-incompatibility/
 |title = Old Meets New: Microsoft Windows SafeSEH Incompatibility
 |author = Joshua J. Drake
 |date = 10 Jan 2012
 |확인날짜 = 2016-01-02
 |보존url = https://web.archive.org/web/20140714174744/http://blog.accuvant.com/jdrakeaccuvant/old-meets-new-microsoft-windows-safeseh-incompatibility/
 |보존날짜 = 2014-07-14
 |url-status = dead
 }} An article explaining why Windows 7 SP1 ignores SafeSEH for some older binaries, while Windows XP SP3 honors it.
[[분류:제어 흐름]]
[[분류:마이크로소프트 API]]