定義自定義錯誤類型
驅動程式可以指定自己的錯誤類型和錯誤訊息。 若要定義自定義錯誤訊息,您必須先定義新的 IO_ERR_XXX 值,以指定為 錯誤記錄專案的 ErrorCode 成員。 事件檢視器 會使用 IO_ERR_XXX 值來查閱驅動程式的錯誤訊息。
若要支援驅動程式中的自訂錯誤訊息,請遵循下列步驟:
建立訊息文字檔,指定自定義IO_ERR_XXX 值和對應的錯誤訊息。 如需詳細資訊,請參閱 建立錯誤訊息文本檔。
將錯誤訊息文字文件編譯至資源,並將資源附加至驅動程式映像。 如需詳細資訊,請參閱 編譯錯誤訊息文本檔。
將驅動程式映像註冊為包含錯誤訊息。 如需詳細資訊,請參閱 註冊為錯誤訊息的來源。
建立錯誤訊息文本檔
驅動程式自定義IO_ERR_XXX 值和相符錯誤訊息範本的定義會附加為驅動程式映像的訊息數據表資源。 您可以在訊息文字檔中描述驅動程式的訊息(擴展名為 .mc)。
訊息文本檔包含兩個區段:標頭區段和訊息區段。 標頭區段允許宣告數值的符號名稱,而訊息區段則指定IO_ERR_XXX 值和相符的錯誤訊息範本。
如需訊息文本檔的範例,請參閱 GitHub 上可用的序列驅動程式範例中的 Serlog.mc 檔案。
標頭區段
標頭區段必須包含這一行:
MessageIdTypedef=NTSTATUS
這可確保訊息編譯程式所產生的IO_ERR_XXX 值類型宣告為NTSTATUS。
出現在標頭區段中的其他指示詞會定義用來取代訊息區段中數值的符號值。
SeverityNames 和 FacilityNames 指示詞會定義 NTSTATUS 值的嚴重性和設施字段的符號值。 指示詞的格式為 keyword= (values ),其中值是由表單名稱=值的一或多個語句所組成:header_name,並以空格符分隔。 name 參數是您在訊息文本檔中指定數值的名稱,而 header_name 是訊息編譯程式所產生之 C 頭檔中所宣告之此值的名稱。 :header_name 子句是選擇性的。
以下是嚴重性代碼符號名稱標頭宣告的範例:
SeverityNames = (
Success = 0x0:STATUS_SEVERITY_SUCCESS
Informational = 0x1:STATUS_SEVERITY_INFORMATIONAL
Warning = 0x2:STATUS_SEVERITY_WARNING
Error = 0x3:STATUS_SEVERITY_ERROR
)
LanguageNames 指示詞會定義地區設定標識碼 (LCID) 的符號值。 指示詞的格式為 LanguageNames = (values ),其中值是由表單的一或多個語句所組成,language_name= lcid :langfile,以空格符分隔。 language_name參數是您用來取代訊息文本檔中 lcid 的名稱,而檔名則指定唯一的檔名(不含擴展名)。 當訊息編譯程式從訊息文本檔產生資源腳本時,它會將此語言的所有字串資源儲存在名為 langfile 的檔案中。bin。
訊息區段
每個訊息定義都是從驅動程式用來報告這種特定錯誤類型的自定義 IO_ERR_XXX 值定義開始。 IO_ERR_XXX值是由一系列關鍵字 = 值組所定義。 可能的關鍵詞及其意義如下。
關鍵字 | 值 |
---|---|
MessageId |
新IO_ERR_XXX 值的程式代碼欄位。 |
嚴重性 |
新IO_ERR_XXX 值的嚴重性欄位。 指定的值必須是 SeverityNames 標頭指示詞所定義的其中一個符號名稱。 |
設施 |
新IO_ERR_XXX 值的設施欄位。 指定的值必須是 FacilityNames 標頭指示詞所定義的其中一個符號名稱。 |
SymbolicName |
新IO_ERR_XXX 值的符號名稱。 訊息編譯程式會產生 C 頭檔,其中包含 名稱的 #define 宣告做為對應的 NTSTATUS 值。 驅動程式會在指定錯誤類型時使用該名稱。 |
第一個關鍵詞一定是 MessageId。
訊息定義的其餘部分是由錯誤訊息的一或多個當地語系化版本所組成。 每個版本都是下列形式:
Language=language_name
localized_message
language_name值,必須是 LanguageNames 標頭指示詞所定義的其中一個符號名稱,會指定消息正文的語言。 當地語系化的消息正文本身是由 Unicode 字串所組成。 表單 %n 的任何內嵌字串都會被視為記錄錯誤時,事件檢視器 將取代的範本。 “%1” 字串會取代為驅動程式的裝置物件名稱,而 “%2” 到 “%n” 會取代為驅動程式所提供的任何插入字串。
訊息定義是由單一句號單獨在一行終止。
如果您定義自定義錯誤訊息,除非必要,否則不應該使用插入字串。 插入字串無法當地語系化,因此應該用於與語言無關的字串,例如數位或檔名。 大部分的驅動程式不會使用插入字串。
編譯錯誤訊息文本檔
使用訊息編譯程式 (mc.exe) 將訊息文本文件編譯成資源腳本檔案(擴展名為 .rc)。 表單的命令
mc filename.mc
會導致訊息編譯程式產生下列檔案:
filename.h,頭檔,其中包含 filename 中每個自定義IO_ERR_XXX 值的宣告。mc.
filename.rc,資源腳本。
訊息文本文件中出現的每種語言各有一個檔案。 每一個檔案都會儲存單一語言的所有錯誤訊息字串資源。 每個語言的檔案都會命名為 langfile。bin,其中 langfile 是訊息文本檔 之 LanguageNames 指示詞中為語言指定的值。
如需訊息編譯程式的詳細資訊,請參閱 windows SDK Microsoft。
資源編譯程式會將資源腳本轉換成您可以附加至驅動程式映像的資源檔。 如果您使用建置公用程式來建置驅動程式,您可以確定資源腳本會轉換成資源檔,並附加至驅動程式映像,只要在驅動程式的SOURCES變數中包含資源腳本的名稱即可。 如需資源編譯程式的詳細資訊,請參閱 Windows SDK 檔。 如需使用建置公用程式建置驅動程式的相關信息,請參閱 建置驅動程式。