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 "exp.h"
00027
00028
00029
00030
00031
00032
VOID
00033
ExpRaiseException (
00034 IN PEXCEPTION_RECORD ExceptionRecord
00035 );
00036
00037
VOID
00038
ExpRaiseStatus (
00039 IN NTSTATUS ExceptionCode
00040 );
00041
00042
VOID
00043 ExRaiseException (
00044 IN PEXCEPTION_RECORD ExceptionRecord
00045 )
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 {
00070
00071
ExpRaiseException(ExceptionRecord);
00072
return;
00073 }
00074
00075
VOID
00076
ExpRaiseException (
00077 IN PEXCEPTION_RECORD ExceptionRecord
00078 )
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097 {
00098
00099 ULONG ControlPc;
00100 CONTEXT ContextRecord;
00101 ULONG EstablisherFrame;
00102 PRUNTIME_FUNCTION FunctionEntry;
00103 BOOLEAN InFunction;
00104 ULONG NextPc;
00105
NTSTATUS Status;
00106
00107
00108
00109
00110
00111
00112
00113 RtlCaptureContext(&ContextRecord);
00114 ControlPc = (ULONG)(ContextRecord.XIntRa - 4);
00115 FunctionEntry =
RtlLookupFunctionEntry(ControlPc);
00116 NextPc =
RtlVirtualUnwind(ControlPc | 1,
00117 FunctionEntry,
00118 &ContextRecord,
00119 &InFunction,
00120 &EstablisherFrame,
00121 NULL);
00122
00123 ContextRecord.Fir = NextPc + 4;
00124 ExceptionRecord->ExceptionAddress = (PVOID)ContextRecord.Fir;
00125
00126
00127
00128
00129
00130
00131
if (
RtlDispatchException(ExceptionRecord, &ContextRecord)) {
00132
Status = ZwContinue(&ContextRecord, FALSE);
00133
00134 }
else {
00135
Status = ZwRaiseException(ExceptionRecord, &ContextRecord, FALSE);
00136 }
00137
00138
00139
00140
00141
00142
00143
00144
ExRaiseStatus(Status);
00145 }
00146
00147
VOID
00148 ExRaiseStatus (
00149 IN NTSTATUS ExceptionCode
00150 )
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177 {
00178
00179
ExpRaiseStatus(ExceptionCode);
00180
return;
00181 }
00182
00183
VOID
00184
ExpRaiseStatus (
00185 IN NTSTATUS ExceptionCode
00186 )
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208 {
00209
00210 ULONG ControlPc;
00211 CONTEXT ContextRecord;
00212 ULONG EstablisherFrame;
00213 EXCEPTION_RECORD ExceptionRecord;
00214 PRUNTIME_FUNCTION FunctionEntry;
00215 BOOLEAN InFunction;
00216 ULONG NextPc;
00217
NTSTATUS Status;
00218
00219
00220
00221
00222
00223 ExceptionRecord.ExceptionCode = ExceptionCode;
00224 ExceptionRecord.ExceptionRecord = (PEXCEPTION_RECORD)
NULL;
00225 ExceptionRecord.NumberParameters = 0;
00226 ExceptionRecord.ExceptionFlags =
EXCEPTION_NONCONTINUABLE;
00227
00228
00229
00230
00231
00232
00233
00234 RtlCaptureContext(&ContextRecord);
00235 ControlPc = (ULONG)(ContextRecord.XIntRa - 4);
00236 FunctionEntry =
RtlLookupFunctionEntry(ControlPc);
00237 NextPc =
RtlVirtualUnwind(ControlPc | 1,
00238 FunctionEntry,
00239 &ContextRecord,
00240 &InFunction,
00241 &EstablisherFrame,
00242 NULL);
00243
00244 ContextRecord.Fir = NextPc + 4;
00245 ExceptionRecord.ExceptionAddress = (PVOID)ContextRecord.Fir;
00246
RtlDispatchException(&ExceptionRecord, &ContextRecord);
00247
00248
00249
00250
00251
00252
00253
Status = ZwRaiseException(&ExceptionRecord, &ContextRecord, FALSE);
00254
00255
00256
00257
00258
00259
00260
ExRaiseStatus(Status);
00261 }