Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

vdmfault.c

Go to the documentation of this file.
00001 /*++ 00002 00003 Copyright (c) 1991 Microsoft Corporation 00004 00005 Module Name: 00006 00007 vdmfault.c 00008 00009 Abstract: 00010 00011 This module contains the support for dispatching VDM page faults. 00012 00013 Author: 00014 00015 Sudeep Bharati (sudeepb) 30-Aug-1992 00016 00017 Revision History: 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 Routine Description: 00045 00046 This routine dispatches a v86 mode page fault to the VDM monitor. 00047 It verifies that the fault occurred below 1MB. 00048 00049 00050 Arguments: 00051 TrapFrame 00052 Mode - 0 - if read 00053 1 - if write 00054 FaultAddr - faulting address 00055 00056 Return Value: 00057 00058 True if successfull, False otherwise 00059 00060 --*/ 00061 { 00062 PVDM_TIB VdmTib; 00063 NTSTATUS Status = STATUS_SUCCESS; 00064 KIRQL OldIrql; 00065 00066 00067 PAGED_CODE(); 00068 00069 // 00070 // Raise Irql to APC level... 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 // VdmTib is in user mode memory 00082 // 00083 try { 00084 // 00085 // Get a pointer to the VdmTib 00086 // 00087 // VdmTib = 00088 // ((PVDM_PROCESS_OBJECTS)(PsGetCurrentProcess()->VdmObjects))->VdmTib; 00089 00090 if ((TrapFrame->EFlags & EFLAGS_V86_MASK) || 00091 (TrapFrame->SegCs != (KGDT_R3_CODE | RPL_MASK))) { 00092 00093 // 00094 // If the faulting address is above 1MB return failure 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 }

Generated on Sat May 15 19:42:21 2004 for test by doxygen 1.3.7