You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
2.3 KiB
108 lines
2.3 KiB
//----------------------------------------------------------------------------
|
|
//
|
|
// Output capturing support.
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 2001.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
CaptureOutputCallbacks g_OutCapCb;
|
|
CHAR g_CaptureBuffer[65536];
|
|
|
|
CaptureOutputCallbacks::CaptureOutputCallbacks(void)
|
|
{
|
|
// For now just use a static buffer.
|
|
m_TextBuffer = g_CaptureBuffer;
|
|
m_TextBufferSize = sizeof(g_CaptureBuffer);
|
|
Reset();
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CaptureOutputCallbacks::QueryInterface(
|
|
THIS_
|
|
IN REFIID InterfaceId,
|
|
OUT PVOID* Interface
|
|
)
|
|
{
|
|
*Interface = NULL;
|
|
|
|
if (IsEqualIID(InterfaceId, IID_IUnknown) ||
|
|
IsEqualIID(InterfaceId, IID_IDebugOutputCallbacks))
|
|
{
|
|
*Interface = (IDebugOutputCallbacks *)this;
|
|
AddRef();
|
|
return S_OK;
|
|
}
|
|
else
|
|
{
|
|
return E_NOINTERFACE;
|
|
}
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG)
|
|
CaptureOutputCallbacks::AddRef(
|
|
THIS
|
|
)
|
|
{
|
|
// This class is designed to be static so
|
|
// there's no true refcount.
|
|
return 1;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG)
|
|
CaptureOutputCallbacks::Release(
|
|
THIS
|
|
)
|
|
{
|
|
// This class is designed to be static so
|
|
// there's no true refcount.
|
|
return 0;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
CaptureOutputCallbacks::Output(
|
|
THIS_
|
|
IN ULONG Mask,
|
|
IN PCSTR Text
|
|
)
|
|
{
|
|
if (Text)
|
|
{
|
|
ULONG Len = strlen(Text) + 1;
|
|
ULONG Space = m_TextBufferSize - (ULONG)(m_Insert - m_TextBuffer);
|
|
|
|
if (Len > Space)
|
|
{
|
|
Len = Space;
|
|
}
|
|
if (Len > 0)
|
|
{
|
|
Len--;
|
|
memcpy(m_Insert, Text, Len);
|
|
m_Insert += Len;
|
|
*m_Insert = 0;
|
|
}
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
HRESULT
|
|
CaptureCommandOutput(PSTR Command)
|
|
{
|
|
HRESULT Status;
|
|
PDEBUG_OUTPUT_CALLBACKS PrevCb;
|
|
|
|
g_OutCapCb.Reset();
|
|
g_ExtClient->GetOutputCallbacks(&PrevCb);
|
|
g_ExtClient->SetOutputCallbacks(&g_OutCapCb);
|
|
|
|
Status = g_ExtControl->Execute(DEBUG_OUTCTL_THIS_CLIENT, Command,
|
|
DEBUG_EXECUTE_NOT_LOGGED);
|
|
|
|
g_ExtClient->SetOutputCallbacks(PrevCb);
|
|
return Status;
|
|
}
|