史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > 作業系統操作技術文件
忘記密碼?
論壇說明 標記討論區已讀

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2005-04-15, 02:18 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 Microsoft Error Code 揭秘

Microsoft Error Code 揭秘
----------------------------------
Author: Smallfrogs
Version: 1.0 [2005/03/26]
======================================================
微軟產品有一個良好的設計就是當出現錯誤的時候,會有各種各樣的錯誤號碼出現。在Windows 2000以前,錯誤號以10進制一般,到了Windows 2000以後,錯誤號更多的趨向於使用16進製表示。

微軟產品的錯誤程式碼都是定義在一些.h文件裡面的,如Win32API的錯誤程式碼就定義在winerror.h文件裡面。

在WIN32API裡面,錯誤號的定義格式是這樣的:
(摘自winerror.h)
程式碼 (雙按程式碼複製到貼上板)// 類型s are 32 bit values layed out as follows:
//
// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
// +---+-+-+-----------------------+-------------------------------+
// |Sev|C|R| Facility | Code |
// +---+-+-+-----------------------+-------------------------------+
//
// where
//
// Sev - is the severity code
//
// 00 - Success
// 01 - Informational
// 10 - Warning
// 11 - Error
//
// C - is the Customer code flag
//
// R - is a reserved bit
//
// Facility - is the facility code
//
// Code - is the facility's status code

如上所顯示,錯誤代號由32bit 組成,也就是說所有的WIN32API裡面的錯誤代號必須遵照上述格式。除了錯誤代號,微軟還定義了大量的巨集用於記憶和閱讀起來方便。巨集的定義是採用 C/C++ 關鍵字define完成的。格式是:

程式碼 (雙按程式碼複製到貼上板)#defiine <字串串檔案類型的錯誤代號> <數值檔案類型的錯誤代號>

此外,微軟對大多數常用的錯誤代號作了簡單的文字描述。用戶可以使用微軟提供的API函數 FormatMessage 將錯誤代號轉換為對應的文字描述。

使用FormatMessage的一個典型工具就是在 Visual C++ 6 裡面提供的Error LookUp。這個工具能夠將用戶輸入的錯誤代號轉化為對應的文字描述(如果有的話)。此外,以前網路上比較流行的錯誤號尋找工具也使用了FormatMessage這個函數。

FormatMessage的一個Sample是這樣的:
程式碼 (雙按程式碼複製到貼上板)void ErrorExit(LPTSTR lpszFunction)
{
TCHAR szBuf[80];
LPVOID lpMsgBuf;
DWORD dw = GetLastError();

FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );

wsprintf(szBuf,
"%s failed with error %d: %s",
lpszFunction, dw, lpMsgBuf);

MessageBox(NULL, szBuf, "Error", MB_OK);

LocalFree(lpMsgBuf);
ExitProcess(dw);
}
當然,到了具體使用中,還有其他更複雜的考慮,如進制轉換等。

但是由於微軟產品眾多,很難在同一個文件裡面將所有錯誤程式碼包含,而且不同產品由於各種原因,造成不同了不同的產品可能有不同的錯誤程式碼的格式,如果說人為的查閱各種.h文件試圖找到一個方法,可想而知的是這樣做的效率如何。在這種情況下,一個全新的工具 出現了。

這就是我今天要推薦的一個錯誤號查詢工具:Err.exe

工具是關於指令行方式操作的,1.62M的程序內裝了絕大多數微軟產品的錯誤程式碼。當然也包括了上面介紹的Win32API的錯誤程式碼。

據我所知,目前版本的Err.EXE飽含了19871種錯誤程式碼訊息,涵蓋了172個文件。我想這個數位對於絕大多數用戶來說已經足夠了。

Err.EXE的使用方式是:
錯誤程式碼作為Err.EXE的參數傳入Err.EXE,要查詢錯誤程式碼的時候,輸入以下指令。假設我查詢一個叫做 0x50 的錯誤代號的含義,則輸入
程式碼 (雙按程式碼複製到貼上板)Err.EXE 0x50
Err.EXE將返回和0x50有關的錯誤代號的含義。
返回的結果分為4個部分:
1、以#開頭的是作者增加的註釋
2、左半部分指錯誤代號對應的巨集定義文字訊息
3、右半部分各種.h文件表示是在什麼文件裡面發現這個錯誤代號的。
4、最下面是搜尋到多少個對應的錯誤程式碼。

又因為發生0x50錯誤的時候是在一個I/O操作的時候,我大概可以判定錯誤可能來源於Win32API函數,於是檢查有winerror.h的那行,發現Err.EXE指出的含義是:

ERROR_FILE_EXISTS

根據這個訊息再進去行後續的工作就方便多了。

提示:Err.EXE支持省略輸入
如果需要輸入的內容是:
程式碼 (雙按程式碼複製到貼上板)Err.EXE 0x00000050
那麼可以省略輸入為
程式碼 (雙按程式碼複製到貼上板)Err.EXE 0x50
Err.EXE也能夠準確的識別出你輸入的內容。

更難能可貴的事,Err.EXE還能夠支持對錯誤字串串搜尋來反查詢錯誤程式碼,而且對於不能搜尋到的錯誤號能夠將錯誤號分段,然後猜測大概的意思,能做到這樣一個是由於微軟產品設計的規範性,另一個原因就是Err.EXE的開發者的獨具匠心的設計。

最後,附上 Err.EXE 下載位址:
http://www.microsoft.com/downloads/d...displaylang=en

Note:不要被微軟網頁迷惑,Err.EXE不僅適用於Exchange,而且適用於絕大多數的微軟產品。

Note:Err.EXE屬於綠色軟體,從微軟網站下載以後是一個自解壓文件,你可以使用WinRAR解壓,解壓以後有一份說明 我的文件,使用前建議先看看它,看完了以後對於快速掌握Err.EXE是很有說明 的。

附件是VC6帶的Error Lookup工具,大家可以試試看看。如果有興趣,可以把上面說的那段程式碼編譯一下看看,你會驚奇的發現 Error Lookup 的設計還是很簡單的。
__________________
http://bbsimg.qianlong.com/upload/01/08/29/68/1082968_1136014649812.gif
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
 


主題工具
顯示模式

發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用


所有時間均為台北時間。現在的時間是 04:04 AM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1