WinDbg-DLL 개발 시작 확대

2661 단어 WindowsWinDbg
WinDbg는 제3자가 사용자 정의 기능을 개발할 수 있는 인터페이스를 제공하는 라이브러리를 제공합니다.
잔말 말고 다음은 가장 간단한 데모입니다. help 명령만 포함됩니다.
 

이루어지다


 
주로 두 가지 점이 있습니다.
1. DebugExtensionInitialize 함수를 실현하는데 이것은 WinDbg의 DLL 확장을 실현하는 데 반드시 실현해야 하는 것이다.WinDbg가 이 DLL을 로드하면 호출됩니다.
2. 함수 내보내기
 
간단한 DLL 프로젝트를 만듭니다.
소스는 다음과 같습니다.
.h
#include 

#define KDEXT_64BIT    //     64bit,  wdbgexts.h   
#include 
#include 


HRESULT
CALLBACK
DebugExtensionInitialize(
    OUT PULONG  Version,
    OUT PULONG  Flags
    );


HRESULT
CALLBACK
help(PDEBUG_CLIENT4 pDebugClient, PCSTR args);

 
.cpp
// KrDbgExtend.cpp : Defines the exported functions for the DLL application.
//

#include "KrDbgExtend.h"


WINDBG_EXTENSION_APIS   ExtensionApis;


HRESULT CALLBACK
DebugExtensionInitialize(PULONG Version, PULONG Flags)
{

    IDebugClient *DebugClient;
    PDEBUG_CONTROL DebugControl;
    HRESULT Hr;

    *Version = DEBUG_EXTENSION_VERSION(1, 0);
    *Flags = 0;
    Hr = S_OK;

    if ((Hr = DebugCreate(__uuidof(IDebugClient),
        (void **)&DebugClient)) != S_OK)
    {
        return Hr;
    }

    if ((Hr = DebugClient->QueryInterface(__uuidof(IDebugControl),
        (void **)&DebugControl)) == S_OK)
    {

        //
        // Get the windbg-style extension APIS
        //
        ExtensionApis.nSize = sizeof(ExtensionApis);
        Hr = DebugControl->GetWindbgExtensionApis64(&ExtensionApis);

        DebugControl->Release();

    }
    DebugClient->Release();
    return Hr;
}



HRESULT CALLBACK help(PDEBUG_CLIENT4 pDebugClient, PCSTR args)
{
    UNREFERENCED_PARAMETER(args);

    dprintf("Help for KrDbgExtend.dll
" " Hey, No help!!!
" ); return S_OK; }

dprintf 인쇄는 Extension Apis를 통해 이루어졌으며, 이 구조체 DLL 개발자는 초기화되었고, 섹션 코드는 Debug Extension Initialize에서 초기화되었다.
 
마지막으로 함수를 내보내야 합니다. 여기에 사용합니다.def 파일의 내보내기 방법:

; KrDbfExtend.def

EXPORTS
	DebugExtensionInitialize
	help

 
 

사용


DLL 자릿수는 WinDbg 자릿수와 일치해야 합니다.
 
로드
kd> .load KrDbgExtend.dll

 
사용
kd> !help
Help for KrDbgExtend.dll
  Hey, No help!!!

주의해야 할 것은 다른 모듈에서도 help 명령을 내보냈다면, 이것은 허용되는 것입니다. 이것은 DLL이 마지막으로 가져온 것을 보십시오.특정 모듈의 help 명령을 사용하려면 다음을 수행합니다.
kd> ![module_name].help

 
마운트 해제
kd> !KrDbgExtend.unload
or
kd> .unload KrDbgExtend

 
 
 

좋은 웹페이지 즐겨찾기