Метод IDebugControl :: Execute позволяет выполнять команды отладчика.
Как я могу получить вывод выполненной команды отладчика?
Моя цель — проверить, загружен ли драйвер, для этого я использую Execute, чтобы выполнить команду «lm» windbg и проанализировать возвращенный результат.
Как только у вас есть ваш клиент (IDebugClient*
) и ваш контроль (IDebugControl*
) экземпляры, из экземпляра клиента нужно вызвать IDebugClient::SetOutputCallbacks
метод, который устанавливает выходной обратный вызов. Вам нужно установить обратный вызов вывода до вызывая 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;
}
вам нужно реализовать IDebugOutputCallbacks для примера. Взгляните на remmon out.cpp и out.hpp в образце windbg sdk (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