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
00029
00030
#include "ki.h"
00031
00032
VOID
00033 KiInitializeUserApc (
00034 IN PKEXCEPTION_FRAME ExceptionFrame,
00035 IN PKTRAP_FRAME TrapFrame,
00036 IN PKNORMAL_ROUTINE NormalRoutine,
00037 IN PVOID NormalContext,
00038 IN PVOID SystemArgument1,
00039 IN PVOID SystemArgument2
00040 )
00041
00042
00043
00044
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 CONTEXT ContextRecord;
00072 EXCEPTION_RECORD ExceptionRecord;
00073 LONG_PTR Length;
00074 ULONG_PTR UserStack;
00075
00076
00077
00078
00079
00080
00081 ContextRecord.ContextFlags =
CONTEXT_FULL;
00082
KeContextFromKframes(TrapFrame, ExceptionFrame, &ContextRecord);
00083
00084
00085
00086
00087
00088
00089
00090
try {
00091
00092
00093
00094
00095
00096 Length = (
sizeof(CONTEXT) + 15) & (~15);
00097 UserStack = ((ULONG_PTR)ContextRecord.IntSp & (~15)) - Length;
00098
00099
00100
00101
00102
00103
00104
ProbeForWrite((PVOID)UserStack, (ULONG)Length,
sizeof(QUAD));
00105 RtlMoveMemory((PVOID)UserStack, &ContextRecord,
sizeof(CONTEXT));
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118 TrapFrame->IntSp = (ULONGLONG)(LONG_PTR)UserStack;
00119 TrapFrame->IntFp = (ULONGLONG)(LONG_PTR)UserStack;
00120 TrapFrame->IntA0 = (ULONGLONG)(LONG_PTR)NormalContext;
00121 TrapFrame->IntA1 = (ULONGLONG)(LONG_PTR)SystemArgument1;
00122 TrapFrame->IntA2 = (ULONGLONG)(LONG_PTR)SystemArgument2;
00123 TrapFrame->IntA3 = (ULONGLONG)(LONG_PTR)NormalRoutine;
00124 TrapFrame->Fir = (ULONGLONG)(LONG_PTR)
KeUserApcDispatcher;
00125
00126
00127
00128
00129
00130
00131 } except (
KiCopyInformation(&ExceptionRecord,
00132 (GetExceptionInformation())->ExceptionRecord)) {
00133
00134
00135
00136
00137
00138
00139 ExceptionRecord.ExceptionAddress = (PVOID)(TrapFrame->Fir);
00140
KiDispatchException(&ExceptionRecord,
00141 ExceptionFrame,
00142 TrapFrame,
00143
UserMode,
00144
TRUE);
00145 }
00146
00147
return;
00148 }