00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#include "ntrtlp.h"
00022
00023 PLAST_EXCEPTION_LOG
RtlpExceptionLog;
00024 ULONG
RtlpExceptionLogCount;
00025 ULONG
RtlpExceptionLogSize;
00026
00027
00028
VOID
00029 RtlInitializeExceptionLog(
00030 IN ULONG Entries
00031 )
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 {
00053
#if defined(NTOS_KERNEL_RUNTIME)
00054
RtlpExceptionLog = (PLAST_EXCEPTION_LOG)
ExAllocatePoolWithTag(
NonPagedPool,
sizeof(LAST_EXCEPTION_LOG) * Entries, 'gbdE' );
00055
#else
00056
00057
#endif
00058
if (
RtlpExceptionLog) {
00059
RtlpExceptionLogSize = Entries;
00060 }
00061 }
00062
00063
00064 ULONG
00065 RtlpLogExceptionHandler(
00066 IN PEXCEPTION_RECORD ExceptionRecord,
00067 IN PCONTEXT ContextRecord,
00068 IN ULONG_PTR ControlPc,
00069 IN PVOID HandlerData,
00070 IN ULONG Size
00071 )
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101 {
00102
#if !defined(NTOS_KERNEL_RUNTIME)
00103
00104
return 0;
00105
00106
#else
00107
00108 ULONG LogIndex;
00109
00110
if (!
RtlpExceptionLog) {
00111
return 0;
00112 }
00113
00114
ASSERT(
Size <= MAX_EXCEPTION_LOG_DATA_SIZE *
sizeof(ULONG));
00115
00116
do {
00117 LogIndex =
RtlpExceptionLogCount;
00118 }
while (LogIndex != (ULONG)InterlockedCompareExchange(
00119 (PLONG)&
RtlpExceptionLogCount,
00120 ((LogIndex + 1) % MAX_EXCEPTION_LOG),
00121 LogIndex));
00122
00123
00124
00125
00126
00127
00128 RtlCopyMemory(
RtlpExceptionLog[LogIndex].HandlerData,
00129 HandlerData,
00130
Size);
00131
RtlpExceptionLog[LogIndex].ExceptionRecord = *ExceptionRecord;
00132
RtlpExceptionLog[LogIndex].ContextRecord = *ContextRecord;
00133
RtlpExceptionLog[LogIndex].Disposition = -1;
00134
00135
return LogIndex;
00136
#endif // !NTOS_KERNEL_RUNTIME
00137
}
00138
00139
00140
VOID
00141 RtlpLogLastExceptionDisposition(
00142 ULONG LogIndex,
00143 EXCEPTION_DISPOSITION Disposition
00144 )
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163 {
00164
00165
00166
00167
if (
RtlpExceptionLog) {
00168
RtlpExceptionLog[LogIndex].Disposition = Disposition;
00169 }
00170 }
00171