WinDbg提供了接口实现第三方开发自定义功能的库。
废话少说,以下是最简单的一个Demo,只包含一个help指令。
实现
主要包含两个点:
1. 实现DebugExtensionInitialize 函数,这是实现WinDbg拓展DLL必须实现的;WinDbg在载入此DLL会调用。
2. 导出函数
创建一个简单的DLL工程。
源码如下:
.h
#include <windows.h>
#define KDEXT_64BIT // 定义使用64bit,针对wdbgexts.h头文件
#include <WDBGEXTS.H>
#include <DbgEng.h>
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\n"
" Hey, No help!!!\n"
);
return S_OK;
}
dprintf打印是通过ExtensionApis实现的,而这个结构体DLL开发者来初始化,在段代码是在DebugExtensionInitialize进行了初始化。
最后还需要导出函数,这里使用.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