[ 문제 ] 

Windows VISTA 이상 버전의 윈도우즈에서는 기본적으로 DbgPrint 와 KdPrint를 이용하여 출력하는 디버그 메세지가 출력되지 않는다.

[ 원인 ]

Windows VISTA에서는 DbgPrint 및 KdPrint가 각각 DbgPrintEx, KdPrintEx함수로 매핑되어 있다. 우선, DbgPrintEx의 원형은 아래와 같다.

ULONG
  DbgPrintEx(
    IN ULONG  ComponentId,
    IN ULONG  Level,
    IN PCHAR  Format,
    . . . .  [arguments]
    );

* 참고 * DbgPrintEx나 KdPrintEx나 동일하다.

VISTA에서 DbgPrint호출시 아래처럼 매핑되어 호출된다.

DbgPrint ( "Hello World" );

               

DbgPrintEx ( DPFLTR_DEFAULT_ID, DPFLTR_INFO_LEVEL, "Hello World" );

중요한 것은, DPFLTR_INFO_LEVEL은 0x3으로 정의되어 있으며 이 레벨은 기본적으로 출력이 제한되어 있다는 점이다.

[ 해결 ]

  • KdPrintEx 혹은 DbgPringEx사용한 후, Level 인자에 DPFLTR_ERROR_LEVEL 입력
  • Kernel Debugger가 활성되어 있을경우, WinDbg를 사용하여 적절한 컴포넌트 필터 Mask를 세팅 (재 부팅 시 초기화 됨)

DPFLTR_INFO_LEVEL 로 켜고 싶을 때
kd > ed Kd_DEFAULT_MASK 8

DPFLTR_ERROR_LEVEL 로 켜고 싶을 때
kd > ed Kd_DEFAULT_MASK 0xF

디버그 메시지를 끄고 싶을 때
kd > ed Kd_DEFAULT_MASK 0

  • 레지스트리 수정을 통해 (재 부팅 필요)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\

이하에 아래의 키를 추가

  • Debug Print Filter

위 키 내부에 아래의 DWORD(32-bit) 값을 추가

  • DEFAULT
DEFAULT의 값은 0xF 로 설정


출처 

http://msdn.microsoft.com/en-us/library/ff551519.aspx
http://www.osronline.com/article.cfm?article=295

Posted by 울랄라베베
:

카테고리

분류 전체보기 (20)
Kernel programming (13)
User porgramming (2)
Etc... (2)