/*++ BUILD Version: 0001 // Increment this if a change has global effects Copyright (c) Microsoft Corporation. All rights reserved. Module Name: ntxcapi.h Abstract: This module contains procedure prototypes and data structures that support structured exception handling. Author: Mark Lucovsky (markl) 29-Jun-1989 Revision History: --*/ #ifndef _NTXCAPI_ #define _NTXCAPI_ #if _MSC_VER > 1000 #pragma once #endif #ifdef __cplusplus extern "C" { #endif // begin_ntddk begin_wdm // // Exception flag definitions. // // begin_winnt #define EXCEPTION_NONCONTINUABLE 0x1 // Noncontinuable exception // end_winnt // end_ntddk end_wdm #define EXCEPTION_UNWINDING 0x2 // Unwind is in progress #define EXCEPTION_EXIT_UNWIND 0x4 // Exit unwind is in progress #define EXCEPTION_STACK_INVALID 0x8 // Stack out of limits or unaligned #define EXCEPTION_NESTED_CALL 0x10 // Nested exception handler call #define EXCEPTION_TARGET_UNWIND 0x20 // Target unwind in progress #define EXCEPTION_COLLIDED_UNWIND 0x40 // Collided exception handler call #define EXCEPTION_UNWIND (EXCEPTION_UNWINDING | EXCEPTION_EXIT_UNWIND | \ EXCEPTION_TARGET_UNWIND | EXCEPTION_COLLIDED_UNWIND) #define IS_UNWINDING(Flag) ((Flag & EXCEPTION_UNWIND) != 0) #define IS_DISPATCHING(Flag) ((Flag & EXCEPTION_UNWIND) == 0) #define IS_TARGET_UNWIND(Flag) (Flag & EXCEPTION_TARGET_UNWIND) // begin_ntddk begin_wdm begin_nthal // // Define maximum number of exception parameters. // // begin_winnt #define EXCEPTION_MAXIMUM_PARAMETERS 15 // maximum number of exception parameters // // Exception record definition. // typedef struct _EXCEPTION_RECORD { NTSTATUS ExceptionCode; ULONG ExceptionFlags; struct _EXCEPTION_RECORD *ExceptionRecord; PVOID ExceptionAddress; ULONG NumberParameters; ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; } EXCEPTION_RECORD; typedef EXCEPTION_RECORD *PEXCEPTION_RECORD; typedef struct _EXCEPTION_RECORD32 { NTSTATUS ExceptionCode; ULONG ExceptionFlags; ULONG ExceptionRecord; ULONG ExceptionAddress; ULONG NumberParameters; ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; } EXCEPTION_RECORD32, *PEXCEPTION_RECORD32; typedef struct _EXCEPTION_RECORD64 { NTSTATUS ExceptionCode; ULONG ExceptionFlags; ULONG64 ExceptionRecord; ULONG64 ExceptionAddress; ULONG NumberParameters; ULONG __unusedAlignment; ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS]; } EXCEPTION_RECORD64, *PEXCEPTION_RECORD64; // // Typedef for pointer returned by exception_info() // typedef struct _EXCEPTION_POINTERS { PEXCEPTION_RECORD ExceptionRecord; PCONTEXT ContextRecord; } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS; // end_winnt // end_ntddk end_wdm end_nthal // // Define IEEE exception information. // // Define 32-, 64-, 80-, and 128-bit IEEE floating operand structures. // typedef struct _FP_32 { ULONG W[1]; } FP_32, *PFP_32; typedef struct _FP_64 { ULONG W[2]; } FP_64, *PFP_64; typedef struct _FP_80 { ULONG W[3]; } FP_80, *PFP_80; typedef struct _FP_128 { ULONG W[4]; } FP_128, *PFP_128; // // Define IEEE compare result values. // typedef enum _FP_IEEE_COMPARE_RESULT { FpCompareEqual, FpCompareGreater, FpCompareLess, FpCompareUnordered } FP_IEEE_COMPARE_RESULT; // // Define IEEE format and result precision values. // typedef enum _FP__IEEE_FORMAT { FpFormatFp32, FpFormatFp64, FpFormatFp80, FpFormatFp128, FpFormatI16, FpFormatI32, FpFormatI64, FpFormatU16, FpFormatU32, FpFormatU64, FpFormatCompare, FpFormatString } FP_IEEE_FORMAT; // // Define IEEE operation code values. // typedef enum _FP_IEEE_OPERATION_CODE { FpCodeUnspecified, FpCodeAdd, FpCodeSubtract, FpCodeMultiply, FpCodeDivide, FpCodeSquareRoot, FpCodeRemainder, FpCodeCompare, FpCodeConvert, FpCodeRound, FpCodeTruncate, FpCodeFloor, FpCodeCeil, FpCodeAcos, FpCodeAsin, FpCodeAtan, FpCodeAtan2, FpCodeCabs, FpCodeCos, FpCodeCosh, FpCodeExp, FpCodeFabs, FpCodeFmod, FpCodeFrexp, FpCodeHypot, FpCodeLdexp, FpCodeLog, FpCodeLog10, FpCodeModf, FpCodePow, FpCodeSin, FpCodeSinh, FpCodeTan, FpCodeTanh, FpCodeY0, FpCodeY1, FpCodeYn } FP_OPERATION_CODE; // // Define IEEE rounding modes. // typedef enum _FP__IEEE_ROUNDING_MODE { FpRoundNearest, FpRoundMinusInfinity, FpRoundPlusInfinity, FpRoundChopped } FP_IEEE_ROUNDING_MODE; // // Define IEEE floating exception operand structure. // typedef struct _FP_IEEE_VALUE { union { SHORT I16Value; USHORT U16Value; LONG I32Value; ULONG U32Value; PVOID StringValue; ULONG CompareValue; FP_32 Fp32Value; LARGE_INTEGER I64Value; ULARGE_INTEGER U64Value; FP_64 Fp64Value; FP_80 Fp80Value; FP_128 Fp128Value; } Value; struct { ULONG RoundingMode : 2; ULONG Inexact : 1; ULONG Underflow : 1; ULONG Overflow : 1; ULONG ZeroDivide : 1; ULONG InvalidOperation : 1; ULONG OperandValid : 1; ULONG Format : 4; ULONG Precision : 4; ULONG Operation : 12; ULONG Spare : 3; ULONG HardwareException : 1; } Control; } FP_IEEE_VALUE, *PFP_IEEE_VALUE; // // Define IEEE exception infomation structure. // #include "pshpack4.h" typedef struct _FP_IEEE_RECORD { FP_IEEE_VALUE Operand1; FP_IEEE_VALUE Operand2; FP_IEEE_VALUE Result; } FP_IEEE_RECORD, *PFP_IEEE_RECORD; #include "poppack.h" // // Exception dispatcher routine definition. // NTSYSAPI BOOLEAN NTAPI RtlDispatchException ( IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT ContextRecord ); // // Exception handling procedure prototypes. // NTSYSAPI VOID NTAPI RtlRaiseStatus ( IN NTSTATUS Status ); NTSYSAPI VOID NTAPI RtlRaiseException ( IN PEXCEPTION_RECORD ); NTSYSAPI VOID NTAPI RtlUnwind ( IN PVOID TargetFrame OPTIONAL, IN PVOID TargetIp OPTIONAL, IN PEXCEPTION_RECORD ExceptionRecord OPTIONAL, IN PVOID ReturnValue ); #if defined(_AMD64_) NTSYSAPI VOID NTAPI RtlUnwindEx ( IN PVOID TargetFrame OPTIONAL, IN PVOID TargetIp OPTIONAL, IN PEXCEPTION_RECORD ExceptionRecord OPTIONAL, IN PVOID ReturnValue, IN PCONTEXT ContextRecord, IN PUNWIND_HISTORY_TABLE HistoryTable OPTIONAL ); #elif defined(_IA64_) NTSYSAPI VOID NTAPI RtlUnwind2 ( IN FRAME_POINTERS TargetFrame OPTIONAL, IN PVOID TargetIp OPTIONAL, IN PEXCEPTION_RECORD ExceptionRecord OPTIONAL, IN PVOID ReturnValue, IN PCONTEXT ContextRecord ); #endif // // Continue execution. // NTSYSCALLAPI NTSTATUS NTAPI NtContinue ( IN PCONTEXT ContextRecord, IN BOOLEAN TestAlert ); // // Raise exception. // NTSYSCALLAPI NTSTATUS NTAPI NtRaiseException ( IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT ContextRecord, IN BOOLEAN FirstChance ); #ifdef __cplusplus } #endif #endif //_NTXCAPI_