DbgEng 확장 DLL 분석
DbgEng 확장 DLL은 여러 콜백 함수를 내보내며, 그 중 일부는 확장 명령의 구현일 수 있습니다.
이러한 확장 DLL은 디버거 엔진 에 의해 로드되며 Microsoft Windows에서 사용자 모드 또는 커널 모드 디버깅을 수행하는 동안 추가 기능 또는 작업 자동화를 제공할 수 있습니다.
Windows용 디버깅 도구의 전체 설치를 수행한 경우 설치 디렉터리의 sdk\samples\exts 하위 디렉터리에서 "exts"라는 샘플 DbgEng 확장을 찾을 수 있습니다.
확장 명령
확장 DLL은 확장 명령을 실행하는 데 사용되는 함수 수를 내보낼 수 있습니다. 각 함수는 .def 파일에서 내보내기로 명시적으로 선언되며 해당 이름은 전적으로 소문자로 구성되어야 합니다.
확장 명령을 구현하는 데 사용되는 함수는 프로토타입 PDEBUG_EXTENSION_CALL 일치해야 합니다.
이러한 함수는 대문자가 허용되지 않는다는 점을 제외하고 표준 C++ 규칙에 따라 이름이 지정됩니다. 확장 명령이 느낌표(!)로 시작한다는 점을 제외하고 내보낸 함수 이름과 확장 명령 이름은 동일합니다. 예를 들어 디버거에 myextension.dll 로드한 다음 디버거 명령 창에 !stack 을 입력하면 디버거는 myextension.dll stack이라는 내보낸 함수 를 찾습니다.
myextension.dll 아직 로드되지 않았거나 다른 확장 DLL에 이름이 같은 다른 확장 명령이 있는 경우 디버거 명령 창에 !myextension.stack 을 입력하여 확장 DLL 및 해당 DLL의 확장 명령을 나타낼 수 있습니다.
내보낸 기타 함수
DbgEng 확장 DLL은 DebugExtensionInitialize를 내보내야 합니다. DLL을 초기화하기 위해 DLL이 로드될 때 호출됩니다. DLL에서 전역 변수를 초기화하는 데 사용할 수 있습니다.
확장 DLL은 DebugExtensionUninitialize를 내보낼 수 있습니다. 내보낸 경우 확장 DLL이 언로드되기 전에 호출됩니다. DLL이 언로드되기 전에 클린 데 사용할 수 있습니다.
확장 DLL은 DebugExtensionNotify를 내보낼 수 있습니다. 내보낸 경우 세션이 시작 또는 종료되고 대상이 실행을 시작하거나 중지할 때 호출됩니다. 이러한 알림은 클라이언트에 등록된 IDebugEventCallbacks 개체에도 제공됩니다.
확장 DLL은 KnownStructOutput을 내보낼 수 있습니다. 이 값을 내보내면 DLL이 로드될 때 호출됩니다. 이 함수는 DLL이 한 줄로 인쇄하는 방법을 알고 있는 구조체 목록을 반환합니다. 나중에 인쇄를 위해 이러한 구조체의 인스턴스에 서식을 지정하기 위해 호출될 수 있습니다.
DbgEng 확장 DLL 로드를 위한 엔진 프로시저
확장 DLL이 로드되면 콜백 함수는 엔진에서 다음 순서로 호출됩니다.
DLL 확장이 초기화할 수 있도록 DebugExtensionInitialize가 호출됩니다.
내보낸 경우 엔진에 활성 세션이 있는 경우 DebugExtensionNotify 가 호출되고 세션이 일시 중단되고 액세스할 수 있는 경우 다시 호출됩니다.
내보낸 경우 KnownStructOutput 이 호출되어 DLL이 한 줄로 인쇄하는 방법을 알고 있는 구조 목록을 요청합니다.
디버거를 사용하여 확장 DLL을 로드하고 언로드하는 방법에 대한 자세한 내용은 디버거 확장 DLL 로드를 참조하고 확장 명령 실행에 대한 자세한 내용은 디버거 확장 명령 사용을 참조하세요.
디버거 엔진은 확장 DLL 호출 주위에 try/except 블록을 배치합니다. 이렇게 하면 확장 코드의 일부 버그 유형으로부터 엔진이 보호됩니다. 하지만 확장 호출은 엔진과 동일한 스레드에서 실행되므로 작동이 중단될 수 있습니다.