다음을 통해 공유


사용자 지정 오류 유형 정의

드라이버는 고유한 오류 유형 및 오류 메시지를 지정할 수 있습니다. 사용자 지정 오류 메시지를 정의하려면 먼저 새 IO_ERR_XXX 값을 정의하여 오류 로그 항목의 ErrorCode 멤버로 지정해야 합니다. 이벤트 뷰어 IO_ERR_XXX 값을 사용하여 드라이버의 오류 메시지를 조회합니다.

드라이버에서 사용자 지정 오류 메시지를 지원하려면 다음 단계를 수행합니다.

  1. 사용자 지정 IO_ERR_XXX 값 및 해당 오류 메시지를 지정하는 메시지 텍스트 파일을 만듭니다. 자세한 내용은 오류 메시지 텍스트 파일 만들기를 참조 하세요.

  2. 오류 메시지 텍스트 파일을 리소스에 컴파일하고 리소스를 드라이버 이미지에 연결합니다. 자세한 내용은 오류 메시지 텍스트 파일 컴파일을 참조 하세요.

  3. 드라이버 이미지를 오류 메시지가 포함된 것으로 등록합니다. 자세한 내용은 오류 메시지의 원본으로 등록을 참조 하세요.

오류 메시지 텍스트 파일 만들기

드라이버의 사용자 지정 IO_ERR_XXX 값 및 일치하는 오류 메시지 템플릿의 정의는 드라이버 이미지에 메시지 테이블 리소스로 연결됩니다. 메시지 텍스트 파일(.mc 파일 이름 확장명 포함)에서 드라이버에 대한 메시지를 설명할 수 있습니다.

메시지 텍스트 파일은 헤더 섹션과 메시지 섹션의 두 섹션으로 구성됩니다. 헤더 섹션에서는 숫자 값에 대한 기호 이름 선언을 허용하고 메시지 섹션에서는 IO_ERR_XXX 값 및 일치하는 오류 메시지 템플릿을 지정합니다.

메시지 텍스트 파일의 예제는 GitHub에서 사용할 수 있는 직렬 드라이버 샘플Serlog.mc 파일을 참조하세요.

헤더 섹션

머리글 섹션에는 다음 줄이 포함되어야 합니다.

MessageIdTypedef=NTSTATUS

이렇게 하면 메시지 컴파일러에서 생성된 IO_ERR_XXX 값의 형식이 NTSTATUS로 선언됩니다.

헤더 섹션에 표시되는 다른 지시문은 메시지 섹션의 숫자 값 대신 사용되는 기호 값을 정의합니다.

SeverityNamesFacilityNames 지시문은 NTSTATUS 값의 심각도 및 기능 필드에 대한 기호 값을 정의합니다. 지시문은 양식 키워드=()입니다. 여기서 은 폼 이름 = 의 하나 이상의 문인 header_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(로캘 ID)에 대한 기호 값을 정의합니다. 지시문은 LanguageNames = () 형식입니다. 여기서 은 공백으로 구분된 양식 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 값의 기호 이름입니다. 메시지 컴파일러는 이름의 #define 선언을 해당 NTSTATUS 값으로 포함하는 C 헤더 파일을 생성합니다. 드라이버는 오류 유형을 지정할 때 해당 이름을 사용합니다.

첫 번째 키워드는 항상 MessageId여야 합니다.

나머지 메시지 정의는 하나 이상의 지역화된 오류 메시지 버전으로 구성됩니다. 각 버전은 다음과 같은 형식입니다.

Language=language_name
localized_message

LanguageNames 헤더 지시문에 정의된 기호 이름 중 하나여야 하는 language_name 값은 메시지 텍스트의 언어를 지정합니다. 지역화된 메시지 텍스트 자체는 유니코드 문자열로 구성됩니다. "%n" 형식의 포함된 문자열은 오류가 기록될 때 이벤트 뷰어 대체할 템플릿으로 처리됩니다. "%1" 문자열은 드라이버의 디바이스 개체 이름으로 바뀝니다. 반면 "%2"에서 "%n"까지는 드라이버에서 제공하는 삽입 문자열로 바뀝니다.

메시지 정의는 한 줄에서만 단일 기간으로 종료됩니다.

사용자 지정 오류 메시지를 정의하는 경우 필요한 경우가 아니면 삽입 문자열을 사용하면 안 됩니다. 삽입 문자열은 지역화할 수 없으므로 숫자 또는 파일 이름과 같이 언어 독립적 문자열에 사용해야 합니다. 대부분의 드라이버는 삽입 문자열을 사용하지 않습니다.

오류 메시지 텍스트 파일 컴파일

메시지 컴파일러(mc.exe)를 사용하여 메시지 텍스트 파일을 리소스 스크립트 파일(.rc 파일 이름 확장명 포함)로 컴파일합니다. 양식의 명령

mc filename.mc

메시지 컴파일러에서 다음 파일을 생성합니다.

  • filename.h는 파일 이름에 있는 각 사용자 지정 IO_ERR_XXX의 선언을 포함하는 헤더 파일입니다.mc.

  • filename.rc, 리소스 스크립트입니다.

  • 메시지 텍스트 파일에 표시되는 각 언어에 대해 하나의 파일입니다. 이러한 각 파일은 한 언어에 대한 모든 오류 메시지 문자열 리소스를 저장합니다. 각 언어의 파일 이름은 langfile입니다.bin입니다. 여기서 langfile은 메시지 텍스트 파일의 LanguageNames 지시문에 있는 언어에 지정된 값입니다.

메시지 컴파일러에 대한 자세한 내용은 Microsoft Windows SDK에서 확인할 수 있습니다.

리소스 컴파일러는 리소스 스크립트를 드라이버 이미지에 연결할 수 있는 리소스 파일로 변환합니다. 빌드 유틸리티를 사용하여 드라이버를 빌드하는 경우 리소스 스크립트가 리소스 파일로 변환되고 드라이버의 SOURCES 변수에 리소스 스크립트의 이름을 포함하여 드라이버 이미지에 연결되도록 할 수 있습니다. 리소스 컴파일러에 대한 자세한 내용은 Windows SDK 설명서를 참조하세요. 빌드 유틸리티를 사용하여 드라이버를 빌드하는 방법에 대한 자세한 내용은 드라이버 빌드를 참조하세요.