00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#include "vdmp.h"
00023
00024 BOOLEAN
00025
VdmDispatchPageFault(
00026 PKTRAP_FRAME TrapFrame,
00027 ULONG Mode,
00028 ULONG FaultAddr
00029 );
00030
00031
#ifdef ALLOC_PRAGMA
00032
#pragma alloc_text(PAGE, VdmDispatchPageFault)
00033
#endif
00034
00035 BOOLEAN
00036 VdmDispatchPageFault(
00037 PKTRAP_FRAME TrapFrame,
00038 ULONG Mode,
00039 ULONG FaultAddr
00040 )
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 {
00062
PVDM_TIB VdmTib;
00063
NTSTATUS Status = STATUS_SUCCESS;
00064 KIRQL OldIrql;
00065
00066
00067
PAGED_CODE();
00068
00069
00070
00071
00072
KeRaiseIrql(
APC_LEVEL, &OldIrql);
00073
00074
Status =
VdmpGetVdmTib(&VdmTib,
VDMTIB_KPROBE);
00075
if (!
NT_SUCCESS(
Status)) {
00076
KeLowerIrql(OldIrql);
00077
return(
FALSE);
00078 }
00079
00080
00081
00082
00083
try {
00084
00085
00086
00087
00088
00089
00090
if ((TrapFrame->EFlags & EFLAGS_V86_MASK) ||
00091 (TrapFrame->SegCs != (KGDT_R3_CODE | RPL_MASK))) {
00092
00093
00094
00095
00096
if (FaultAddr < 0x100000) {
00097 VdmTib->
EventInfo.
Event =
VdmMemAccess;
00098 VdmTib->
EventInfo.
InstructionSize = 0;
00099 VdmTib->
EventInfo.FaultInfo.FaultAddr = FaultAddr;
00100 VdmTib->
EventInfo.FaultInfo.RWMode = Mode;
00101
VdmEndExecution(TrapFrame, VdmTib);
00102 }
00103
else {
00104
Status = STATUS_ILLEGAL_INSTRUCTION;
00105 }
00106 }
00107
00108 } except(
EXCEPTION_EXECUTE_HANDLER) {
00109
Status = GetExceptionCode();
00110 }
00111
00112
KeLowerIrql(OldIrql);
00113
00114
if (!
NT_SUCCESS(
Status)) {
00115
return FALSE;
00116 }
else {
00117
return TRUE;
00118 }
00119
00120 }