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