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 #define IADBG   1
00028 
00029 
#include "ki.h"
00030 
#include "ia32def.h"
00031 
00032 BOOLEAN 
KiUnalignedFault (IN PKTRAP_FRAME TrapFrame);
00033 
00034 
00035 
VOID
00036 KiIA32CommonArgs (
00037     IN PKTRAP_FRAME Frame,
00038     IN ULONG ExceptionCode,
00039     IN PVOID ExceptionAddress,
00040     IN ULONG_PTR Argument0,
00041     IN ULONG_PTR Argument1,
00042     IN ULONG_PTR Argument2
00043     )
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 {
00062     PEXCEPTION_RECORD ExceptionRecord;
00063 
00064     ExceptionRecord = (PEXCEPTION_RECORD)&Frame->ExceptionRecord;
00065 
00066     ExceptionRecord->ExceptionRecord = (PEXCEPTION_RECORD)
NULL;
00067 
00068     ExceptionRecord->ExceptionCode = ExceptionCode;
00069     ExceptionRecord->ExceptionFlags = 0;
00070     ExceptionRecord->ExceptionAddress = ExceptionAddress;
00071     ExceptionRecord->NumberParameters = 5;
00072        
00073     ExceptionRecord->ExceptionInformation[0] = Argument0;
00074     ExceptionRecord->ExceptionInformation[1] = Argument1;
00075     ExceptionRecord->ExceptionInformation[2] = Argument2;
00076     ExceptionRecord->ExceptionInformation[3] = (ULONG_PTR)Frame->StIIPA;
00077     ExceptionRecord->ExceptionInformation[4] = (ULONG_PTR)Frame->StISR;
00078 }
00079 
00080 BOOLEAN
00081 KiIA32ExceptionDivide(
00082     IN PKTRAP_FRAME Frame
00083     )
00084 
00085 
00086 
00087 
00088 
00089 
00090 
00091 
00092 
00093 
00094 
00095 
00096 
00097 
00098 
00099 
00100 
00101 
00102 
00103 
00104 
00105 
00106 
00107 {
00108     
00109     
00110     
00111 
00112     
KiIA32CommonArgs(Frame,
00113                      
Ki386CheckDivideByZeroTrap(Frame),
00114                      (PVOID) 
EIP(Frame),
00115                      0, 0, 0);
00116     
return TRUE;
00117 }
00118 
00119 BOOLEAN
00120 KiIA32ExceptionDebug(
00121     IN PKTRAP_FRAME Frame
00122     )
00123 
00124 
00125 
00126 
00127 
00128 
00129 
00130 
00131 
00132 
00133 
00134 
00135 
00136 
00137 
00138 
00139 
00140 
00141 
00142 
00143 
00144 {
00145     ULONGLONG EFlag;
00146 
00147 
#if defined(IADBG)
00148 
    IF_IA32TRAP_DEBUG( DEBUG )
00149        
DbgPrint( 
"IA32 Debug: Eip %x\n", 
EIP(Frame) );
00150 
#endif // IADBG
00151 
    
00152     EFlag = __getReg(CV_IA64_AR24);
00153     EFlag &= ~
EFLAGS_TF_BIT;
00154     __setReg(CV_IA64_AR24, EFlag);
00155 
00156     
KiIA32CommonArgs(Frame,
00157                      STATUS_WX86_SINGLE_STEP,
00158                      (PVOID) 
EIP(Frame),
00159                      0, 0, 0);
00160     
return TRUE;
00161 }
00162 
00163 BOOLEAN
00164 KiIA32ExceptionBreak(
00165     IN PKTRAP_FRAME Frame
00166     )
00167 
00168 
00169 
00170 
00171 
00172 
00173 
00174 
00175 
00176 
00177 
00178 
00179 
00180 {
00181     ULONGLONG EFlag;
00182 
00183 
#if defined(IADBG)
00184 
    IF_IA32TRAP_DEBUG( BREAK )
00185        
DbgPrint( 
"IA32 Break: Eip %x\n", 
EIP(Frame) );
00186 
#endif // IADBG
00187 
    
00188     EFlag = __getReg(CV_IA64_AR24);
00189     EFlag &= ~
EFLAGS_TF_BIT;
00190     __setReg(CV_IA64_AR24, EFlag);
00191 
00192     
KiIA32CommonArgs(Frame,
00193                      STATUS_WX86_BREAKPOINT,
00194                      (PVOID) 
EIP(Frame),
00195                      
BREAKPOINT_BREAK,
00196                      
ECX(Frame),
00197                      
EDX(Frame));
00198     
return TRUE;
00199 }
00200 
00201 BOOLEAN
00202 KiIA32ExceptionOverflow(
00203     IN PKTRAP_FRAME Frame
00204     )
00205 
00206 
00207 
00208 
00209 
00210 
00211 
00212 
00213 
00214 
00215 
00216 
00217 
00218 
00219 
00220 
00221 
00222 
00223 {
00224 
#if defined(IADBG)
00225 
    IF_IA32TRAP_DEBUG( OVERFLOW )
00226        
DbgPrint( 
"IA32 OverFlow: Eip %x\n", 
EIP(Frame) );
00227 
#endif // IADBG
00228 
00229     
00230     
00231     
00232 
00233     
KiIA32CommonArgs(Frame,
00234                      STATUS_INTEGER_OVERFLOW,
00235                      (PVOID) (
EIP(Frame) - 1),
00236                      0, 0, 0);
00237     
return TRUE;
00238 }
00239 
00240 
00241 BOOLEAN
00242 KiIA32ExceptionBound(
00243     IN PKTRAP_FRAME Frame
00244     )
00245 
00246 
00247 
00248 
00249 
00250 
00251 
00252 
00253 
00254 
00255 
00256 
00257 
00258 
00259 
00260 
00261 
00262 
00263 
00264 
00265 {
00266 
#if defined(IADBG)
00267 
    IF_IA32TRAP_DEBUG( BOUND )
00268        
DbgPrint( 
"IA32 Bound: Eip %x\n", 
EIP(Frame) );
00269 
#endif // IADBG
00270 
    
00271     
00272     
00273     
KiIA32CommonArgs(Frame,
00274                      STATUS_ARRAY_BOUNDS_EXCEEDED,
00275                      (PVOID) 
EIP(Frame),
00276                      0, 0, 0);
00277     
return TRUE;
00278 }
00279 
00280 
00281 ULONG
00282 IA32CheckOpcode(
00283     IN PKTRAP_FRAME Frame
00284     )
00285 
00286 
00287 
00288 
00289 
00290 
00291 
00292 
00293 
00294 
00295 
00296 
00297 
00298 
00299 {
00300     ULONG i;
00301     UCHAR OpCodeByte0;
00302     UCHAR OpCodeByte1;
00303     UCHAR OpCodeByte2;
00304         
00305         
00306     OpCodeByte0 = (UCHAR) Frame->StIIM & 0xff;
00307     OpCodeByte1 = (UCHAR) (Frame->StIIM >> 8) & 0xff;
00308     OpCodeByte2 = (UCHAR) (Frame->StIIM >> 16) & 0xff;
00309 
00310     
switch (OpCodeByte0) {
00311        
case MI_HLT:
00312            
return (STATUS_PRIVILEGED_INSTRUCTION);
00313            
break;
00314 
00315        
case MI_TWO_BYTE:
00316            
if (OpCodeByte1 == 
MI_LTR_LLDT || 
00317                OpCodeByte2 == 
MI_LGDT_LIDT_LMSW) {
00318 
00319                OpCodeByte2 &= 
MI_MODRM_MASK;      
00320 
00321                
if (OpCodeByte2==
MI_LLDT_MASK || OpCodeByte2==
MI_LTR_MASK ||
00322                    OpCodeByte2==
MI_LGDT_MASK || OpCodeByte2==
MI_LIDT_MASK || 
00323                    OpCodeByte2==
MI_LMSW_MASK) {
00324                    
return (STATUS_PRIVILEGED_INSTRUCTION);
00325                } 
else  {
00326                    
return (STATUS_ACCESS_VIOLATION);
00327                }
00328 
00329             } 
else {
00330                 
if (OpCodeByte1 & 
MI_SPECIAL_MOV_MASK) {
00331                     
00332                     
00333                     
00334                     
00335                     
return (STATUS_PRIVILEGED_INSTRUCTION);
00336                 } 
else {
00337                     
00338                     
00339                     
00340                     
return (STATUS_ACCESS_VIOLATION);
00341                 }
00342             }
00343             
break;
00344 
00345         
default:
00346             
00347             
00348             
00349             
return (STATUS_ILLEGAL_INSTRUCTION);
00350             
break;
00351         }
00352 }
00353 
00354 BOOLEAN
00355 KiIA32InterceptInstruction(
00356     IN PKTRAP_FRAME Frame
00357     )
00358 
00359 
00360 
00361 
00362 
00363 
00364 
00365 
00366 
00367 
00368 
00369 
00370 
00371 
00372 
00373 
00374 
00375 
00376 
00377 
00378 
00379 
00380 
00381 
00382 {
00383 
#if defined(IADBG)
00384 
    IF_IA32TRAP_DEBUG( INSTRUCTION )
00385        
DbgPrint( 
"IA32 Instruction: Eip %x\n", 
EIP(Frame) );
00386 
#endif // IADBG
00387 
00388     
switch ( 
IA32CheckOpcode(Frame) ) {
00389         
case STATUS_PRIVILEGED_INSTRUCTION:
00390             
KiIA32CommonArgs(Frame,
00391                              STATUS_PRIVILEGED_INSTRUCTION,
00392                              (PVOID) 
EIP(Frame),
00393                              0, 0, 0);
00394             
break;
00395         
case STATUS_ACCESS_VIOLATION:    
00396             
KiIA32CommonArgs(Frame,
00397                              STATUS_ACCESS_VIOLATION,
00398                              (PVOID) 
EIP(Frame),
00399                              0, -1, 0);
00400             
break; 
00401         
case STATUS_ILLEGAL_INSTRUCTION:
00402             
KiIA32CommonArgs(Frame,
00403                              STATUS_ILLEGAL_INSTRUCTION,
00404                              (PVOID) 
EIP(Frame),
00405                              0, -1, 0);
00406             
break;
00407         
default:
00408             
KeBugCheckEx(
TRAP_CAUSE_UNKNOWN, (ULONG_PTR)Frame, 
IA32CheckOpcode(Frame), 0, 1);
00409             
00410             
return FALSE;
00411             
break;
00412     }
00413     
return TRUE;
00414 }
00415 
00416 BOOLEAN
00417 KiIA32ExceptionNoDevice(
00418     IN PKTRAP_FRAME Frame
00419     )
00420 
00421 
00422 
00423 
00424 
00425 
00426 
00427 
00428 
00429 
00430 
00431 
00432 
00433 
00434 
00435 
00436 
00437 
00438 
00439 
00440 
00441 
00442 
00443 {
00444     ULONG ErrorCode;
00445     ULONG FirOffset, FdrOffset;
00446     ULONG FpState;
00447     
00448     ULONG FcrRegister, FsrRegister;
00449         
00450 
#if defined(IADBG)
00451 
    IF_IA32TRAP_DEBUG( NODEVICE )
00452        
DbgPrint( 
"IA32 NoDevice: Eip %x\n", 
EIP(Frame) );
00453 
#endif // IADBG
00454 
00455     FcrRegister = (ULONG) (__getReg(CV_IA64_AR21) & 0xFFFFFFFF);
00456     FsrRegister = (ULONG) (__getReg(CV_IA64_AR28) & 0xFFFFFFFF);
00457     FirOffset = (ULONG) (__getReg(CV_IA64_AR29) & 0xFFFFFFFF);
00458     FdrOffset = (ULONG) (__getReg(CV_IA64_AR30) & 0xFFFFFFFF);
00459 
00460     
00461     
00462     
00463     
00464     
00465     FpState = ~(FcrRegister &
00466                 (
FSW_INVALID_OPERATION | 
FSW_DENORMAL | 
00467                  
FSW_ZERO_DIVIDE | 
FSW_OVERFLOW | 
00468                  
FSW_UNDERFLOW | 
FSW_PRECISION)) & (FsrRegister & 
FSW_ERR_MASK);
00469 
00470 
00471     
00472     
00473     
00474 
00475     
if (FpState & 
FSW_INVALID_OPERATION) {
00476 
00477         
if (FpState & 
FSW_STACK_FAULT) {
00478             
KiIA32CommonArgs(Frame,
00479                              STATUS_FLOAT_STACK_CHECK,
00480                              (PVOID) FirOffset,
00481                              0, FdrOffset, 0);
00482             
return TRUE;
00483         } 
else {
00484             
KiIA32CommonArgs(Frame,
00485                              STATUS_FLOAT_INVALID_OPERATION,
00486                              (PVOID) FirOffset,
00487                              0, 0, 0);
00488             
return TRUE;
00489         }
00490 
00491     } 
else {
00492 
00493         
if (FpState & 
FSW_ZERO_DIVIDE)
00494             ErrorCode = STATUS_FLOAT_DIVIDE_BY_ZERO; 
00495         
else { 
if (FpState & 
FSW_DENORMAL) 
00496                    ErrorCode = STATUS_FLOAT_INVALID_OPERATION; 
00497                
else { 
if (FpState & 
FSW_OVERFLOW)
00498                           ErrorCode = STATUS_FLOAT_OVERFLOW; 
00499                       
else { 
if (FpState & 
FSW_UNDERFLOW)
00500                                  ErrorCode = STATUS_FLOAT_UNDERFLOW; 
00501                              
else { 
if (FpState & 
FSW_PRECISION)
00502                                         ErrorCode = STATUS_FLOAT_INEXACT_RESULT; 
00503                                     
else
00504                                         ErrorCode = 0;
00505                              }
00506                       }
00507                }
00508         }
00509     }
00510                     
00511     
if (ErrorCode) {
00512             
KiIA32CommonArgs(Frame,
00513                              STATUS_FLOAT_INEXACT_RESULT,
00514                              (PVOID) FirOffset,
00515                              0, 0, 0);
00516             
return TRUE;
00517     } 
else {  
00518 
00519         
00520         
00521         
00522         
00523 
00524         
KeBugCheckEx(
TRAP_CAUSE_UNKNOWN, (ULONG_PTR)Frame, 0, 0, 2);
00525     }
00526 
00527     
00528     
return FALSE;
00529 }
00530 
00531 BOOLEAN
00532 KiIA32ExceptionSegmentNotPresent(
00533     IN PKTRAP_FRAME Frame
00534         )
00535 
00536 
00537 
00538 
00539 
00540 
00541 
00542 
00543 
00544 
00545 
00546 
00547 
00548 
00549 
00550 
00551 
00552 
00553 
00554 {
00555     KIRQL OldIrql;
00556     
USHORT ErrorCode;
00557 
00558 
#if defined(IADBG)
00559 
    IF_IA32TRAP_DEBUG( NOTPRESENT )
00560        
DbgPrint( 
"IA32 NotPresent: Eip %x\n", 
EIP(Frame) );
00561 
#endif // IADBG
00562 
00563     
00564     
00565     
00566 
00567     
KiIA32CommonArgs(Frame,
00568                      STATUS_ACCESS_VIOLATION,
00569                      (PVOID) 
EIP(Frame),
00570                      0, 
ISRCode(Frame) | RPL_MASK, 0);
00571     
return TRUE;
00572 }
00573 
00574 BOOLEAN
00575 KiIA32ExceptionStack(
00576     IN PKTRAP_FRAME Frame
00577     )
00578 
00579 
00580 
00581 
00582 
00583 
00584 
00585 
00586 
00587 
00588 
00589 
00590 
00591 
00592 
00593 
00594 
00595 
00596 
00597 
00598 
00599 
00600 
00601 
00602 
00603 
00604 {
00605     
USHORT Code;
00606 
00607 
#if defined(IADBG)
00608 
    IF_IA32TRAP_DEBUG( STACK )
00609        
DbgPrint( 
"IA32 Stack: Eip %x\n", 
EIP(Frame) );
00610 
#endif // IADBG
00611 
00612     
00613     
00614     
00615    
00616     Code = 
ISRCode(Frame);
00617 
00618     
00619     
00620     
00621     
KiIA32CommonArgs(Frame,
00622                      STATUS_ACCESS_VIOLATION,
00623                      (PVOID) 
EIP(Frame),
00624                       Code ? (Code | RPL_MASK) :  
ESP(Frame),
00625                       Code ? 
EXCEPT_UNKNOWN_ACCESS : 
EXCEPT_LIMIT_ACCESS,
00626                       0);
00627     
return TRUE;
00628 }
00629 
00630 BOOLEAN
00631 KiIA32ExceptionInvalidOp(
00632     IN PKTRAP_FRAME Frame
00633     )
00634 
00635 
00636 
00637 
00638 
00639 
00640 
00641 
00642 
00643 
00644 
00645 
00646 
00647 
00648 
00649 
00650 
00651 
00652 
00653 {
00654 
#if defined(IADBG)
00655 
    IF_IA32TRAP_DEBUG( INSTRUCTION )
00656        
DbgPrint( 
"IA32 Invalid Opcode: Eip %x\n", 
EIP(Frame) );
00657 
#endif // IADBG
00658 
00659     
KiIA32CommonArgs(Frame,
00660         STATUS_ILLEGAL_INSTRUCTION,
00661         (PVOID) 
EIP(Frame),
00662         0, 0, 0);
00663     
return TRUE;
00664 }
00665 
00666 BOOLEAN
00667 KiIA32ExceptionGPFault(
00668     IN PKTRAP_FRAME Frame
00669     )
00670 
00671 
00672 
00673 
00674 
00675 
00676 
00677 
00678 
00679 
00680 
00681 
00682 
00683 
00684 
00685 
00686 
00687 
00688 
00689 
00690 
00691 {
00692 
#if defined(IADBG)
00693 
    IF_IA32TRAP_DEBUG( GPFAULT )
00694        
DbgPrint( 
"IA32 GpFault: Eip %x\n", 
EIP(Frame) );
00695 
#endif // IADBG
00696 
00697     
KiIA32CommonArgs(Frame,
00698                      STATUS_ACCESS_VIOLATION,
00699                      (PVOID) 
EIP(Frame),
00700                      0, 0, 0);
00701     
return TRUE;
00702 }
00703 
00704 
00705 
00706 BOOLEAN
00707 KiIA32ExceptionKNI(
00708     IN PKTRAP_FRAME Frame
00709     )
00710 
00711 
00712 
00713 
00714 
00715 
00716 
00717 
00718 {
00719 
#if defined(IADBG)
00720 
    IF_IA32TRAP_DEBUG( FPFAULT )
00721        
DbgPrint( 
"IA32 KNI Fault: Eip %x\n", 
EIP(Frame) );
00722 
#endif // IADBG
00723 
    return(
KiIA32ExceptionNoDevice(Frame));
00724 }
00725 
00726 
00727 BOOLEAN
00728 KiIA32ExceptionFPFault(
00729     IN PKTRAP_FRAME Frame
00730     )
00731 
00732 
00733 
00734 
00735 
00736 
00737 
00738 
00739 
00740 
00741 
00742 
00743 
00744 
00745 {
00746 
#if defined(IADBG)
00747 
    IF_IA32TRAP_DEBUG( FPFAULT )
00748        
DbgPrint( 
"IA32 FpFault: Eip %x\n", 
EIP(Frame) );
00749 
#endif // IADBG
00750 
    return(
KiIA32ExceptionNoDevice(Frame));
00751 }
00752 
00753 
00754 BOOLEAN
00755 KiIA32ExceptionAlignmentFault(
00756     IN PKTRAP_FRAME Frame
00757     )
00758 
00759 
00760 
00761 
00762 
00763 
00764 
00765 
00766 
00767 
00768 
00769 
00770 
00771 
00772 
00773 
00774 {
00775 
#if defined(IADBG)
00776 
    IF_IA32TRAP_DEBUG( ALIGNMENT )
00777        
DbgPrint( 
"IA32 Alignment: Eip %x\n", 
EIP(Frame) );
00778 
#endif // IADBG
00779 
00780     
00781     
00782     
00783     
return KiUnalignedFault(Frame);
00784 }
00785 
00786 
00787 BOOLEAN
00788 KiIA32InterruptVector(
00789     IN PKTRAP_FRAME Frame
00790     )
00791 
00792 
00793 
00794 
00795 
00796 
00797 
00798 
00799 
00800 
00801 {
00802 
#if defined(IADBG)
00803 
    IF_IA32TRAP_DEBUG( INTNN )
00804        
DbgPrint( 
"IA32 Intnn: Eip %x INT 0x%xH\n", 
EIP(Frame), 
ISRVector(Frame));
00805 
#endif // IADBG
00806 
    KiIA32CommonArgs(Frame,
00807         STATUS_PRIVILEGED_INSTRUCTION,
00808         (PVOID) 
EIP(Frame),
00809         0, 0, 0);
00810     
return TRUE;
00811 }
00812 
00813 
00814 BOOLEAN
00815 KiIA32InterceptGate(
00816     IN PKTRAP_FRAME Frame
00817     )
00818 
00819 
00820 
00821 
00822 
00823 
00824 
00825 
00826 
00827 
00828 
00829 
00830 
00831 
00832 
00833 
00834 
00835 
00836 
00837 
00838 
00839 
00840 
00841 
00842 {
00843 
#if defined(IADBG)
00844 
    IF_IA32TRAP_DEBUG( GATE )
00845        
DbgPrint( 
"IA32 Gate: Eip %x GateSelector %x OpcodeId %x\n",
00846                  
EIP(Frame),
00847                  (ULONG) (Frame->IFA & 0xff),
00848                  (ULONG) (
ISRCode(Frame) >> 14));
00849 
#endif // IADBG
00850 
00851     
00852     
00853     
00854     
KiIA32CommonArgs(Frame,
00855         STATUS_ILLEGAL_INSTRUCTION,
00856         (PVOID) 
EIP(Frame),
00857         0, 0, 0);
00858     
return TRUE;
00859 }
00860 
00861 
00862 
00863 
00864 
00865 
00866 
00867 
00868 
00869 
00870 
00871 
00872 
00873 
00874 
00875 
00876 
00877 
00878 
00879 
00880 
00881 BOOLEAN
00882 KiIA32InterceptSystemFlag(
00883     IN PKTRAP_FRAME Frame
00884     )
00885 {
00886 
#if defined(IADBG)
00887 
    IF_IA32TRAP_DEBUG( FLAG )
00888        
DbgPrint( 
"IA32 FLAG: Eip %x Old EFlag: %x OpcodeId %x\n", 
00889                  
EIP(Frame),
00890                  (ULONG) (Frame->IIM & 0xff),
00891                  (ULONG) (
ISRCode(Frame) >> 14));
00892 
#endif // IADBG
00893 
    KiIA32CommonArgs(Frame,
00894         STATUS_ILLEGAL_INSTRUCTION,
00895         (PVOID) 
EIP(Frame),
00896         0, 0, 0);
00897     
return TRUE;
00898 }
00899 
00900 BOOLEAN
00901 KiIA32InterceptLock(
00902     IN PKTRAP_FRAME Frame
00903     )
00904 
00905 
00906 
00907 
00908 
00909 
00910 
00911 
00912 
00913 
00914 
00915 
00916 
00917 
00918 
00919 {
00920 
#if defined(IADBG)
00921 
    IF_IA32TRAP_DEBUG( 
LOCK )
00922        
DbgPrint( 
"IA32 LOCK: Eip %x\n", 
EIP(Frame) );
00923 
#endif // IADBG
00924 
00925     
00926     
00927     
00928     
00929     
00930     
KiIA32CommonArgs(Frame,
00931         STATUS_PRIVILEGED_INSTRUCTION,
00932         (PVOID) 
EIP(Frame),
00933         0, 0, 0);
00934     
return TRUE;
00935 }
00936 
00937 BOOLEAN
00938 KiIA32ExceptionPanic(
00939     IN PKTRAP_FRAME Frame
00940     )
00941 {
00942     
00943     
00944     
00945 
00946     
KeBugCheckEx(
TRAP_CAUSE_UNKNOWN, 
00947                  (ULONG_PTR)Frame, 
00948                  
ISRVector(Frame), 
00949                  0, 0);
00950     
00951     
return FALSE;
00952 }
00953     
00954 
00955 
00956 BOOLEAN (*KiIA32ExceptionDispatchTable[])(PKTRAP_FRAME) = {
00957     
KiIA32ExceptionDivide,
00958     
KiIA32ExceptionDebug,
00959     
KiIA32ExceptionPanic,
00960     
KiIA32ExceptionBreak,
00961     
KiIA32ExceptionOverflow,
00962     
KiIA32ExceptionBound,
00963     
KiIA32ExceptionInvalidOp,
00964     
KiIA32ExceptionNoDevice,
00965     
KiIA32ExceptionPanic,
00966     
KiIA32ExceptionPanic,
00967     
KiIA32ExceptionPanic,
00968     
KiIA32ExceptionSegmentNotPresent,
00969     
KiIA32ExceptionStack,
00970     
KiIA32ExceptionGPFault,
00971     
KiIA32ExceptionPanic,
00972     
KiIA32ExceptionPanic,
00973     
KiIA32ExceptionFPFault,
00974     
KiIA32ExceptionAlignmentFault,
00975     
KiIA32ExceptionPanic,
00976     
KiIA32ExceptionKNI
00977 };
00978 
00979 BOOLEAN (*KiIA32InterceptionDispatchTable[])(PKTRAP_FRAME) = {
00980     
KiIA32InterceptInstruction,
00981     
KiIA32InterceptGate,
00982     
KiIA32InterceptSystemFlag,
00983     
KiIA32InterceptLock
00984 };
00985 
00986 BOOLEAN
00987 KiIA32InterceptionVectorHandler(
00988     IN PKTRAP_FRAME Frame
00989     )
00990 
00991 
00992 
00993 
00994 
00995 
00996 
00997 
00998 
00999 
01000 
01001 
01002 
01003 
01004 
01005 
01006 
01007 
01008 {
01009 
#if defined(IADBG)
01010 
    IF_IA32TRAP_DEBUG( INTERCEPTION )
01011        
DbgPrint(
"IA32 Interception: ISRVector %x Frame %x\n", 
ISRVector(Frame), Frame);
01012 
#endif // IADBG
01013 
01014     
ASSERT(
UserMode == Frame->PreviousMode);
01015 
01016     
01017     
01018     
01019     
if (
ISRVector(Frame) <= 
sizeof(
KiIA32InterceptionDispatchTable)>>2) 
01020         
return (*
KiIA32InterceptionDispatchTable[
ISRVector(Frame)])(Frame);
01021     
else
01022         
return (
KiIA32ExceptionPanic(Frame));
01023 }
01024 
01025 BOOLEAN
01026 KiIA32ExceptionVectorHandler(
01027     IN PKTRAP_FRAME Frame
01028     )
01029 
01030 
01031 
01032 
01033 
01034 
01035 
01036 
01037 
01038 
01039 
01040 
01041 
01042 
01043 
01044 
01045 
01046 
01047 {
01048 
#if defined(IADBG)
01049 
    IF_IA32TRAP_DEBUG( EXCEPTION )
01050        
DbgPrint(
"IA32 Exception: ISRVector %x Frame %x\n", 
ISRVector(Frame), Frame);
01051 
#endif // IADBG
01052 
01053     
ASSERT(
UserMode == Frame->PreviousMode);
01054     
01055     
01056     
01057     
if (
ISRVector(Frame) <= 
sizeof(
KiIA32ExceptionDispatchTable)>>2) 
01058         
return (*
KiIA32ExceptionDispatchTable[
ISRVector(Frame)])(Frame);
01059     
else
01060         
return(
KiIA32ExceptionPanic(Frame));
01061 }
01062 
01063 BOOLEAN
01064 KiIA32InterruptionVectorHandler(
01065     IN PKTRAP_FRAME Frame
01066     )
01067 
01068 
01069 
01070 
01071 
01072 
01073 
01074 
01075 
01076 
01077 
01078 
01079 
01080 
01081 
01082 
01083 
01084 
01085 {
01086 
#if defined(IADBG)
01087 
    IF_IA32TRAP_DEBUG( INTERRUPTION )
01088        
DbgPrint(
"IA32 Interruption: ISRVector %x Frame %x\n", 
ISRVector(Frame), Frame);
01089 
#endif // IADBG
01090 
01091     
ASSERT(
UserMode == Frame->PreviousMode);
01092 
01093     
01094     
01095     
01096     
01097     
01098     
01099     
ASSERT(3 != 
ISRVector(Frame));
01100     
01101     
KiIA32CommonArgs(Frame,
01102                      STATUS_ACCESS_VIOLATION,
01103                      (PVOID) 
EIP(Frame),
01104                      0, 0, 0);
01105     
return TRUE;
01106 }