慢慢写一系列的windbg扩展插件和分析dmp的小知识!
1.DebugExtensionInitialize
HRESULT
CALLBACK
DebugExtensionInitialize(
OUT PULONG Version,
OUT PULONG Flags
);
我们注意到它是一个callback函数,这个函数会在windbg加载我们的扩展插件后调用,所以
这个函数必须在扩展插件中被导出2.事实上每个要公开的扩展命令都被声明为PDEBUG_EXTENSION_CALL类型的函数
HRESULT
CALLBACK
(* PDEBUG_EXTENSION_CALL)(
IN IDebugClient * Client
IN OPTIONAL PCSTR Args
);
3.IDebugClient 有点类似于COM调用,
所以要实现一个最简单的插件就很easy:
HRESULT CALLBACK
DebugExtensionInitialize(PULONG Version, PULONG Flags)
{
*Version = DEBUG_EXTENSION_VERSION(1, 0);
*Flags = 0; // Reserved for future use.
return S_OK;
}
HRESULT CALLBACK hgytest(PDEBUG_CLIENT pDebugClient, PCSTR args)
{
UNREFERENCED_PARAMETER(args);
IDebugControl* pDebugControl;
if (SUCCEEDED(pDebugClient->QueryInterface(__uuidof(IDebugControl4), (void **)&pDebugControl)))
{
pDebugControl->Output(DEBUG_OUTPUT_NORMAL, "thanks for hgy413 engine dll");
pDebugControl->Release();
}
return S_OK;
}
4.加载/卸载扩展dll可以这样使用:
.load I:\WindbgEngine\Debug\WindbgEngine.dll
.unload I:\WindbgEngine\Debug\WindbgEngine.dll
要注意的是 全路径,当然你可以拷到windbg目录下,就不用全路径了
5.示例:
HRESULT CALLBACK
DebugExtensionInitialize(PULONG Version, PULONG Flags)
{
*Version = DEBUG_EXTENSION_VERSION(1, 0);
*Flags = 0; // Reserved for future use.
return S_OK;
}
HRESULT CALLBACK hgytest(PDEBUG_CLIENT pDebugClient, PCSTR args)
{
UNREFERENCED_PARAMETER(args);
IDebugControl* pDebugControl;
if (SUCCEEDED(pDebugClient->QueryInterface(__uuidof(IDebugControl4), (void **)&pDebugControl)))
{
pDebugControl->Output(DEBUG_OUTPUT_NORMAL, "thanks for hgy413 engine dll");
pDebugControl->Release();
}
return S_OK;
}
6.效果图:
7.最后附上工程源码: