00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
#include <ntos.h>
00024
#include <vdmntos.h>
00025
#include "vdmp.h"
00026
00027
#ifdef ALLOC_PRAGMA
00028
#pragma alloc_text(PAGE, VdmDispatchIRQ13)
00029
#pragma alloc_text(PAGE, VdmSkipNpxInstruction)
00030
#endif
00031
00032 static UCHAR
MOD16[] = { 0, 1, 2, 0 };
00033 static UCHAR
MOD32[] = { 0, 1, 4, 0 };
00034 UCHAR
VdmUserCr0MapIn[] = {
00035 0,
00036 CR0_PE,
00037 CR0_EM,
00038 CR0_EM | CR0_MP
00039 };
00040
00041 UCHAR
VdmUserCr0MapOut[] = {
00042 0,
00043 CR0_MP,
00044 CR0_MP,
00045 CR0_MP,
00046 CR0_EM,
00047 CR0_EM | CR0_MP,
00048 CR0_EM | CR0_MP,
00049 CR0_EM | CR0_MP
00050 };
00051
00052
00053 BOOLEAN
00054 VdmDispatchIRQ13(
00055 PKTRAP_FRAME TrapFrame
00056 )
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075 {
00076 EXCEPTION_RECORD ExceptionRecord;
00077
PVDM_TIB VdmTib;
00078 BOOLEAN Success;
00079
NTSTATUS Status;
00080
00081
PAGED_CODE();
00082
00083 Success =
TRUE;
00084
00085
Status =
VdmpGetVdmTib(&VdmTib,
VDMTIB_KPROBE);
00086
if (!
NT_SUCCESS(
Status)) {
00087
return(
FALSE);
00088 }
00089
00090
try {
00091 VdmTib->
EventInfo.
Event =
VdmIrq13;
00092 VdmTib->
EventInfo.
InstructionSize = 0
L;
00093 } except(
EXCEPTION_EXECUTE_HANDLER) {
00094 ExceptionRecord.ExceptionCode = GetExceptionCode();
00095 ExceptionRecord.ExceptionFlags = 0;
00096 ExceptionRecord.NumberParameters = 0;
00097
ExRaiseException(&ExceptionRecord);
00098 Success =
FALSE;
00099 }
00100
00101
if (Success) {
00102
VdmEndExecution(TrapFrame,VdmTib);
00103 }
00104
00105
00106
return TRUE;
00107 }
00108
00109 BOOLEAN
00110 VdmSkipNpxInstruction(
00111 PKTRAP_FRAME TrapFrame,
00112 ULONG Address32Bits,
00113 PUCHAR istream,
00114 ULONG InstructionSize
00115 )
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 {
00138 UCHAR ibyte, Mod, rm;
00139
00140
ASSERT (!
KeI386NpxPresent);
00141
00142
00143
00144
00145
00146
try {
00147
00148
00149
00150
00151 istream += 1;
00152 ibyte = *istream;
00153 InstructionSize += 1;
00154
00155
if (ibyte > 0xbf) {
00156
00157
00158
00159
00160
goto try_exit;
00161 }
00162
00163 Mod = ibyte >> 6;
00164 rm = ibyte & 0x7;
00165
if (Address32Bits) {
00166 InstructionSize +=
MOD32 [Mod];
00167
if (Mod == 0 && rm == 5) {
00168
00169 InstructionSize += 4;
00170 }
00171
00172
00173
00174
00175
00176
if (rm == 4) {
00177 istream += 1;
00178 ibyte = *istream;
00179 InstructionSize += 1;
00180
00181
if (Mod == 0 && (ibyte & 7) == 5) {
00182
00183 InstructionSize += 4;
00184 }
00185 }
00186
00187 }
else {
00188 InstructionSize +=
MOD16 [Mod];
00189
if (Mod == 0 && rm == 6) {
00190
00191 InstructionSize += 2;
00192 }
00193 }
00194
00195 try_exit: ;
00196 } except (
EXCEPTION_EXECUTE_HANDLER) {
00197
00198
00199
00200
00201
00202
#if DBG
00203
DbgPrint (
"P5_FPU_PATCH: V86: Fault occured\n");
00204
#endif
00205
return FALSE;
00206 }
00207
00208
00209
00210
00211
00212 TrapFrame->Eip += InstructionSize;
00213 TrapFrame->Eip &= 0xffff;
00214
00215
return TRUE;
00216 }