草帽姐歌曲大全:Windows下的异常码(Exception Code)

来源:百度文库 编辑:偶看新闻 时间:2024/05/09 07:08:16

上午我查一个异常码(0xc000000d)表示的具体含义,我记得以前的确看到过这样一个表格,可查来查去,就是没找着地方。在网上也找了一些资料,但都不是我想要的,都是很笼统地介绍它与内存相关,没有找到类似0xc0000005对应ACCESS_VIOLATION,0xc0000094对应DIVIDE_BY_ZERO这样精确的信息。

晚上看书的时候,通过函数GetExceptionCode终于找到我曾经看到过的那个表格,下面是MSDN中介绍GetExceptionCode的页面上对Exception Code的描述:


Return valueDescriptionEXCEPTION_ACCESS_VIOLATIONThe thread attempted to read from or write to a virtual address that it does not have appropriate access to.EXCEPTION_BREAKPOINTA breakpoint was encountered.EXCEPTION_DATATYPE_MISALIGNMENTThe thread attempted to read or write data that is misaligned on hardware that does not provide alignment. For example, 16-bit values must be aligned on 2-byte boundaries, 32-bit values on 4-byte boundaries, and so on.EXCEPTION_SINGLE_STEPA trace trap or other single-instruction mechanism signaled that one instruction has been executed.EXCEPTION_ARRAY_BOUNDS_EXCEEDEDThe thread attempted to access an array element that is out of bounds, and the underlying hardware supports bounds checking.EXCEPTION_FLT_DENORMAL_OPERANDAn operand in a floating-point operation is denormal. A denormal value is one that is too small to represent as a standard floating-point value.EXCEPTION_FLT_DIVIDE_BY_ZEROThe thread attempted to divide a floating-point value by a floating-point divisor of zero.EXCEPTION_FLT_INEXACT_RESULTThe result of a floating-point operation cannot be represented exactly as a decimal fraction.EXCEPTION_FLT_INVALID_OPERATIONThis exception represents a floating-point exception not included in this list.EXCEPTION_FLT_OVERFLOWThe exponent of a floating-point operation is greater than the magnitude allowed by the corresponding type.EXCEPTION_FLT_STACK_CHECKThe stack overflowed or underflowed as a result of a floating-point operation.EXCEPTION_FLT_UNDERFLOWThe exponent of a floating-point operation is less than the magnitude allowed by the corresponding type.EXCEPTION_INT_DIVIDE_BY_ZEROThe thread attempted to divide an integer value by an integer divisor of zero.EXCEPTION_INT_OVERFLOWThe result of an integer operation caused a carry out of the most significant bit of the result.EXCEPTION_PRIV_INSTRUCTIONThe thread attempted to execute an instruction whose operation is not allowed in the current machine mode.EXCEPTION_NONCONTINUABLE_EXCEPTION

The thread attempted to continue execution after a noncontinuable exception occurred.


 

通过这些宏,又找到它们所在的位置:Microsoft Visual Studio 8\VC\PlatformSDK\Include\WinBase.h

 


#define WAIT_IO_COMPLETION                  STATUS_USER_APC

#define STILL_ACTIVE                        STATUS_PENDING

#define EXCEPTION_ACCESS_VIOLATION          STATUS_ACCESS_VIOLATION

#define EXCEPTION_DATATYPE_MISALIGNMENT     STATUS_DATATYPE_MISALIGNMENT

#define EXCEPTION_BREAKPOINT                STATUS_BREAKPOINT

#define EXCEPTION_SINGLE_STEP               STATUS_SINGLE_STEP

#define EXCEPTION_ARRAY_BOUNDS_EXCEEDED     STATUS_ARRAY_BOUNDS_EXCEEDED

#define EXCEPTION_FLT_DENORMAL_OPERAND      STATUS_FLOAT_DENORMAL_OPERAND

#define EXCEPTION_FLT_DIVIDE_BY_ZERO        STATUS_FLOAT_DIVIDE_BY_ZERO

#define EXCEPTION_FLT_INEXACT_RESULT        STATUS_FLOAT_INEXACT_RESULT

#define EXCEPTION_FLT_INVALID_OPERATION     STATUS_FLOAT_INVALID_OPERATION

#define EXCEPTION_FLT_OVERFLOW              STATUS_FLOAT_OVERFLOW

#define EXCEPTION_FLT_STACK_CHECK           STATUS_FLOAT_STACK_CHECK

#define EXCEPTION_FLT_UNDERFLOW             STATUS_FLOAT_UNDERFLOW

#define EXCEPTION_INT_DIVIDE_BY_ZERO        STATUS_INTEGER_DIVIDE_BY_ZERO

#define EXCEPTION_INT_OVERFLOW              STATUS_INTEGER_OVERFLOW

#define EXCEPTION_PRIV_INSTRUCTION          STATUS_PRIVILEGED_INSTRUCTION

#define EXCEPTION_IN_PAGE_ERROR             STATUS_IN_PAGE_ERROR

#define EXCEPTION_ILLEGAL_INSTRUCTION       STATUS_ILLEGAL_INSTRUCTION

#define EXCEPTION_NONCONTINUABLE_EXCEPTION  STATUS_NONCONTINUABLE_EXCEPTION

#define EXCEPTION_STACK_OVERFLOW            STATUS_STACK_OVERFLOW

#define EXCEPTION_INVALID_DISPOSITION       STATUS_INVALID_DISPOSITION

#define EXCEPTION_GUARD_PAGE                STATUS_GUARD_PAGE_VIOLATION

#define EXCEPTION_INVALID_HANDLE            STATUS_INVALID_HANDLE

#define EXCEPTION_POSSIBLE_DEADLOCK         STATUS_POSSIBLE_DEADLOCK

#define CONTROL_C_EXIT                      STATUS_CONTROL_C_EXIT


 

宏STATUS_的位置:Microsoft Visual Studio 8\VC\PlatformSDK\Include\WinNT.h

 


#define STATUS_WAIT_0                    ((DWORD   )0x00000000L)   

#define STATUS_ABANDONED_WAIT_0          ((DWORD   )0x00000080L)   

#define STATUS_USER_APC                  ((DWORD   )0x000000C0L)   

#define STATUS_TIMEOUT                   ((DWORD   )0x00000102L)   

#define STATUS_PENDING                   ((DWORD   )0x00000103L)   

#define DBG_EXCEPTION_HANDLED            ((DWORD   )0x00010001L)   

#define DBG_CONTINUE                     ((DWORD   )0x00010002L)   

#define STATUS_SEGMENT_NOTIFICATION      ((DWORD   )0x40000005L)   

#define DBG_TERMINATE_THREAD             ((DWORD   )0x40010003L)   

#define DBG_TERMINATE_PROCESS            ((DWORD   )0x40010004L)   

#define DBG_CONTROL_C                    ((DWORD   )0x40010005L)   

#define DBG_CONTROL_BREAK                ((DWORD   )0x40010008L)   

#define DBG_COMMAND_EXCEPTION            ((DWORD   )0x40010009L)   

#define STATUS_GUARD_PAGE_VIOLATION      ((DWORD   )0x80000001L)   

#define STATUS_DATATYPE_MISALIGNMENT     ((DWORD   )0x80000002L)   

#define STATUS_BREAKPOINT                ((DWORD   )0x80000003L)   

#define STATUS_SINGLE_STEP               ((DWORD   )0x80000004L)   

#define DBG_EXCEPTION_NOT_HANDLED        ((DWORD   )0x80010001L)   

#define STATUS_ACCESS_VIOLATION          ((DWORD   )0xC0000005L)   

#define STATUS_IN_PAGE_ERROR             ((DWORD   )0xC0000006L)   

#define STATUS_INVALID_HANDLE            ((DWORD   )0xC0000008L)   

#define STATUS_NO_MEMORY                 ((DWORD   )0xC0000017L)   

#define STATUS_ILLEGAL_INSTRUCTION       ((DWORD   )0xC000001DL)   

#define STATUS_NONCONTINUABLE_EXCEPTION  ((DWORD   )0xC0000025L)   

#define STATUS_INVALID_DISPOSITION       ((DWORD   )0xC0000026L)   

#define STATUS_ARRAY_BOUNDS_EXCEEDED     ((DWORD   )0xC000008CL)   

#define STATUS_FLOAT_DENORMAL_OPERAND    ((DWORD   )0xC000008DL)   

#define STATUS_FLOAT_DIVIDE_BY_ZERO      ((DWORD   )0xC000008EL)   

#define STATUS_FLOAT_INEXACT_RESULT      ((DWORD   )0xC000008FL)   

#define STATUS_FLOAT_INVALID_OPERATION   ((DWORD   )0xC0000090L)   

#define STATUS_FLOAT_OVERFLOW            ((DWORD   )0xC0000091L)   

#define STATUS_FLOAT_STACK_CHECK         ((DWORD   )0xC0000092L)   

#define STATUS_FLOAT_UNDERFLOW           ((DWORD   )0xC0000093L)   

#define STATUS_INTEGER_DIVIDE_BY_ZERO    ((DWORD   )0xC0000094L)   

#define STATUS_INTEGER_OVERFLOW          ((DWORD   )0xC0000095L)   

#define STATUS_PRIVILEGED_INSTRUCTION    ((DWORD   )0xC0000096L)   

#define STATUS_STACK_OVERFLOW            ((DWORD   )0xC00000FDL)   

#define STATUS_CONTROL_C_EXIT            ((DWORD   )0xC000013AL)   

#define STATUS_FLOAT_MULTIPLE_FAULTS     ((DWORD   )0xC00002B4L)   

#define STATUS_FLOAT_MULTIPLE_TRAPS      ((DWORD   )0xC00002B5L)   

#define STATUS_REG_NAT_CONSUMPTION       ((DWORD   )0xC00002C9L)   

#if defined(STATUS_SUCCESS) || (_WIN32_WINNT > 0x0500) || (_WIN32_FUSION >= 0x0100)

#define STATUS_SXS_EARLY_DEACTIVATION    ((DWORD   )0xC015000FL)   

#define STATUS_SXS_INVALID_DEACTIVATION  ((DWORD   )0xC0150010L)   


 

遗憾的是,始终没有发现0xc000000d的踪迹。

我就不信了……

 

终于让我找到了!

 

在翻看Windbg的帮助文件,查0xc0000005相关的信息时,有一节“Bug Check 0x1E: KMODE_EXCEPTION_NOT_HANDLED”中提到了一个NTStatus.h的文件,通过计算机搜索,竟然与WinNT.h相同的路径,即,Microsoft Visual Studio 8\VC\PlatformSDK\Include\NTStatus.h,里面规定了0xc000000d的意义:


// MessageId: STATUS_INVALID_PARAMETER
// MessageText:
//  An invalid parameter was passed to a service or function.
#define STATUS_INVALID_PARAMETER         ((NTSTATUS)0xC000000DL)


此外,这个文件中还规定了其它错误码的具体含义,而且从0x00000000L~0xC01A002EL,大部分都是连续的定义,非常全,感觉这个地方才是“源头”。

 

真没想到,我苦苦追求的答案竟然与已经找到的结果“近在咫尺”,真有点“众里寻他千百度,蓦然回首,那人却在灯火阑珊处”的味道。

 

为什么同样的错误码要在两个不同的文件(WinNT.h和NTStatus.h)中定义?而且,这些错误码都是在#ifndef WIN32_NO_STATUS条件宏中定义的。这两个文件到底有什么不同?二者又有什么联系?