IDebugControl :: Execute方法可以执行调试器命令。 如何获取执行的调试器命令的输出? 我的目的是检查驱动程序是否已加载,以完成我使用Execute执行“lm”windbg命令并解析返回的输出。
答案 0 :(得分:1)
你需要为样本实现IDebugOutputCallbacks,看一下windbg sdk示例中的remmon out.cpp和out.hpp(iirc new sdks不包含你需要从msdn样本库在线获取它的样本)
class StdioOutputCallbacks : public IDebugOutputCallbacks
{
public:
............
}
StdioOutputCallbacks g_Callback;
status = g_Client->SetOutputCallbacks( &g_Callback );
示例虚拟实现将两个文件out.cpp和out.hpp复制到本地文件夹构建并执行以显示警告和.echo执行的输出
//error,relasese() omitted Do_Nothing_sample no proc|thread warn print exit;
#include <engextcpp.hpp>
#include "out.hpp"
#include "out.cpp"
extern StdioOutputCallbacks g_OutputCb;
void __cdecl main( void ){
IDebugClient* g_Client = NULL;
IDebugControl* g_Control= NULL;
DebugCreate( __uuidof(IDebugClient), (void**)&g_Client );
g_Client->QueryInterface( __uuidof(IDebugControl), (void**)&g_Control );
g_Client->SetOutputCallbacks( &g_OutputCb );
g_Control->Execute( DEBUG_OUTCTL_THIS_CLIENT,
".echo hello iam alive and kicking", DEBUG_EXECUTE_DEFAULT);
}
构建和执行的结果
3 files compiled
1 executable built
WARNING: The debugger does not have a current process or thread
WARNING: Many commands will not work
hello iam alive and kicking
答案 1 :(得分:1)
从客户端实例获得客户端(IDebugClient*
)和控件(IDebugControl*
)实例后,您需要调用设置IDebugClient::SetOutputCallbacks
的output callback方法。您需要在调用execute()
方法之前设置输出回调。
这应该是这样的:
StdioOutputCallbacks g_OutputCb;
// ...
g_Client->SetOutputCallbacks(&g_OutputCb);
g_Control->Execute(DEBUG_OUTCTL_ALL_CLIENTS,"lm vm", DEBUG_EXECUTE_ECHO);
您的输出回调必须继承自IDebugOutputCallbacks
class StdioOutputCallbacks : public IDebugOutputCallbacks
执行此操作的简单方法是直接复制并使用实现回调类的out.cpp
和out.hpp
文件(存在于某些示例中),例如。在:
C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\sdk\samples\dumpstk
输出本身在IDebugOutputCallbacks::Output
实现中完成:
STDMETHODIMP
StdioOutputCallbacks::Output(
THIS_
_In_ ULONG Mask,
_In_ PCSTR Text
)
{
UNREFERENCED_PARAMETER(Mask);
fputs(Text, stdout);
return S_OK;
}