언어별 처리기
업데이트: 2007년 11월
UNW_FLAG_EHANDLER 또는 UNW_FLAG_UHANDLER 플래그를 설정할 때마다 언어별 처리기의 상대 주소가 UNWIND_INFO에 표시됩니다. 이전 단원에서 설명한 것처럼 언어별 처리기는 예외 처리기에 대한 검색 또는 해제의 일부로서 호출됩니다. 사용되는 프로토타입은 다음과 같습니다.
typedef EXCEPTION_DISPOSITION (*PEXCEPTION_ROUTINE) (
IN PEXCEPTION_RECORD ExceptionRecord,
IN ULONG64 EstablisherFrame,
IN OUT PCONTEXT ContextRecord,
IN OUT PDISPATCHER_CONTEXT DispatcherContext
);
ExceptionRecord는 표준 Win64 정의가 있는 예외 레코드에 대한 포인터를 제공합니다.
EstablisherFrame은 이 함수의 고정된 스택 할당에 대한 기본 주소입니다.
ContextRecord는 예외가 발생한 경우 예외 컨텍스트를 가리키거나(예외 처리기) 현재 "해제" 컨텍스트를 가리킵니다(종료 처리기).
DispatcherContext는 이 함수의 디스패처 컨텍스트를 가리킵니다. 여기에는 다음과 같은 정의가 있습니다.
typedef struct _DISPATCHER_CONTEXT {
ULONG64 ControlPc;
ULONG64 ImageBase;
PRUNTIME_FUNCTION FunctionEntry;
ULONG64 EstablisherFrame;
ULONG64 TargetIp;
PCONTEXT ContextRecord;
PEXCEPTION_ROUTINE LanguageHandler;
PVOID HandlerData;
} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
ControlPc는 이 함수 내의 RIP 값입니다. 이는 예외 주소이거나 컨트롤에서 설정 함수가 남겨진 주소입니다. 이 값은 컨트롤이 이 함수 내의 보호되는 구문에 포함되어 있는지 확인하는 데 사용되는 RIP입니다(예: __try/__except 또는 __try/__finally의 __try 블록).
ImageBase는 이 함수가 포함된 모듈의 이미지 기준(로드 주소)입니다. 이 값은 상대 주소를 기록하기 위해 함수 엔트리와 해제 정보에 사용되는 32비트 오프셋에 추가됩니다.
FunctionEntry는 이 함수에 대한 함수 및 해제 정보 이미지 기준 상대 주소가 저장되는 RUNTIME_FUNCTION 함수 엔트리에 대한 포인터를 제공합니다.
EstablisherFrame은 이 함수의 고정된 스택 할당에 대한 기본 주소입니다.
TargetIp는 해제의 연속 주소를 지정하는 선택적 명령 주소를 제공합니다. EstablisherFrame을 지정하지 않으면 이 주소가 무시됩니다.
ContextRecord는 시스템 예외 디스패치/해제 코드에 사용하기 위한 예외 컨텍스트를 가리킵니다.
LanguageHandler는 호출하려는 언어별 처리기 루틴을 가리킵니다.
HandlerData는 이 함수에 대한 언어별 처리기 데이터를 가리킵니다.