00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
#include "nt.h"
00027
00028
00029
00030
00031
00032
00033
00034 LONG
00035
__C_ExecuteExceptionFilter (
00036 PEXCEPTION_POINTERS ExceptionPointers,
00037 EXCEPTION_FILTER ExceptionFilter,
00038 ULONG EstablisherFrame
00039 );
00040
00041
VOID
00042
__C_ExecuteTerminationHandler (
00043 BOOLEAN AbnormalTermination,
00044 TERMINATION_HANDLER TerminationHandler,
00045 ULONG EstablisherFrame
00046 );
00047
00048 EXCEPTION_DISPOSITION
00049 __C_specific_handler (
00050 IN PEXCEPTION_RECORD ExceptionRecord,
00051 IN PVOID EstablisherFrame,
00052 IN OUT PCONTEXT ContextRecord,
00053 IN OUT PDISPATCHER_CONTEXT DispatcherContext
00054 )
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 {
00084
00085 ULONG ControlPc;
00086 EXCEPTION_FILTER ExceptionFilter;
00087 EXCEPTION_POINTERS ExceptionPointers;
00088 PRUNTIME_FUNCTION FunctionEntry;
00089 ULONG
Index;
00090 PSCOPE_TABLE ScopeTable;
00091 ULONG TargetPc;
00092 TERMINATION_HANDLER TerminationHandler;
00093 LONG Value;
00094
00095
00096
00097
00098
00099
00100
00101 ControlPc = DispatcherContext->ControlPc;
00102 FunctionEntry = DispatcherContext->FunctionEntry;
00103 ScopeTable = (PSCOPE_TABLE)(FunctionEntry->HandlerData);
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
if (IS_DISPATCHING(ExceptionRecord->ExceptionFlags)) {
00114
00115
00116
00117
00118
00119
00120 ExceptionPointers.ExceptionRecord = ExceptionRecord;
00121 ExceptionPointers.ContextRecord = ContextRecord;
00122
for (
Index = 0;
Index < ScopeTable->Count;
Index += 1) {
00123
if ((ControlPc >= ScopeTable->ScopeRecord[
Index].BeginAddress) &&
00124 (ControlPc < ScopeTable->ScopeRecord[
Index].EndAddress) &&
00125 (ScopeTable->ScopeRecord[
Index].JumpTarget != 0)) {
00126
00127
00128
00129
00130
00131 ExceptionFilter =
00132 (EXCEPTION_FILTER)ScopeTable->ScopeRecord[
Index].HandlerAddress;
00133 Value =
__C_ExecuteExceptionFilter(&ExceptionPointers,
00134 ExceptionFilter,
00135 (ULONG)EstablisherFrame);
00136
00137
00138
00139
00140
00141
00142
00143
00144
if (Value < 0) {
00145
return ExceptionContinueExecution;
00146
00147 }
else if (Value > 0) {
00148
RtlUnwind2(EstablisherFrame,
00149 (PVOID)ScopeTable->ScopeRecord[
Index].JumpTarget,
00150 ExceptionRecord,
00151 (PVOID)ExceptionRecord->ExceptionCode,
00152 ContextRecord);
00153 }
00154 }
00155 }
00156
00157 }
else {
00158
00159
00160
00161
00162
00163
00164 TargetPc = ContextRecord->Iar;
00165
for (
Index = 0;
Index < ScopeTable->Count;
Index += 1) {
00166
if ((ControlPc >= ScopeTable->ScopeRecord[
Index].BeginAddress) &&
00167 (ControlPc < ScopeTable->ScopeRecord[
Index].EndAddress)) {
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
if ((TargetPc >= ScopeTable->ScopeRecord[
Index].BeginAddress) &&
00181 (TargetPc <= ScopeTable->ScopeRecord[
Index].EndAddress)) {
00182
break;
00183
00184 }
else {
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
if (ScopeTable->ScopeRecord[
Index].JumpTarget != 0) {
00197
if (TargetPc == ScopeTable->ScopeRecord[
Index].JumpTarget) {
00198
break;
00199 }
00200
00201 }
else {
00202 DispatcherContext->ControlPc =
00203 ScopeTable->ScopeRecord[
Index].EndAddress + 4;
00204 TerminationHandler =
00205 (TERMINATION_HANDLER)ScopeTable->ScopeRecord[
Index].HandlerAddress;
00206
__C_ExecuteTerminationHandler(
TRUE,
00207 TerminationHandler,
00208 (ULONG)EstablisherFrame);
00209 }
00210 }
00211 }
00212 }
00213 }
00214
00215
00216
00217
00218
00219
return ExceptionContinueSearch;
00220 }
00221