|
|
/*++ 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 );
NTSYSAPI VOID NTAPI RtlUnwindEx ( IN FRAME_POINTERS TargetFrame OPTIONAL, IN PVOID TargetIp OPTIONAL, IN PEXCEPTION_RECORD ExceptionRecord OPTIONAL, IN PVOID ReturnValue, IN PCONTEXT ContextRecord, IN PUNWIND_HISTORY_TABLE HistoryTable OPTIONAL );
#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_
|