HyperDbg/hyperdbg/libhyperdbg/code/app/messaging.cpp

149 lines
3.5 KiB
C++

/**
* @file messaging.cpp
* @author Sina Karvandi (sina@hyperdbg.org)
* @brief Functions for handling messages
* @details
* @version 0.19
* @date 2026-05-28
*
* @copyright This project is released under the GNU Public License v3.
*
*/
#include "pch.h"
using namespace std;
//
// Global Variables
//
extern PVOID g_MessageHandler;
extern PVOID g_MessageHandlerSharedBuffer;
extern BOOLEAN g_LogOpened;
extern BOOLEAN g_IsConnectedToRemoteDebugger;
extern BOOLEAN g_IsSerialConnectedToRemoteDebugger;
/**
* @brief Set the function callback that will be called if any message
* needs to be shown
*
* @param Handler Function that handles the messages
* @return VOID
*/
VOID
SetTextMessageCallback(PVOID Handler)
{
g_MessageHandler = Handler;
}
/**
* @brief Set the function callback that will be called if any message
* needs to be shown
*
* @param Handler Function that handles the messages
* @return PVOID
*/
PVOID
SetTextMessageCallbackUsingSharedBuffer(PVOID Handler)
{
g_MessageHandler = Handler;
g_MessageHandlerSharedBuffer = malloc(COMMUNICATION_BUFFER_SIZE + TCP_END_OF_BUFFER_CHARS_COUNT);
if (!g_MessageHandlerSharedBuffer)
{
g_MessageHandler = NULL;
return NULL;
}
RtlZeroMemory(g_MessageHandlerSharedBuffer, COMMUNICATION_BUFFER_SIZE + TCP_END_OF_BUFFER_CHARS_COUNT);
return g_MessageHandlerSharedBuffer;
}
/**
* @brief Unset the function callback that will be called if any message
* needs to be shown
*
* @return VOID
*/
VOID
UnsetTextMessageCallback()
{
g_MessageHandler = NULL;
free(g_MessageHandlerSharedBuffer);
g_MessageHandlerSharedBuffer = NULL;
}
/**
* @brief Show messages
*
* @param Fmt format string message
* @param ... arguments
* @return VOID
*/
VOID
ShowMessages(const CHAR * Fmt, ...)
{
va_list ArgList;
va_list Args;
CHAR TempMessage[COMMUNICATION_BUFFER_SIZE + TCP_END_OF_BUFFER_CHARS_COUNT] = {0};
if (g_MessageHandler == NULL && !g_IsConnectedToRemoteDebugger && !g_IsSerialConnectedToRemoteDebugger)
{
va_start(Args, Fmt);
vprintf(Fmt, Args);
va_end(Args);
if (!g_LogOpened)
{
return;
}
}
va_start(ArgList, Fmt);
INT SprintfResult = PlatformVsnprintf(TempMessage, sizeof(TempMessage), Fmt, ArgList);
va_end(ArgList);
if (SprintfResult != -1)
{
if (g_IsConnectedToRemoteDebugger)
{
//
// vsprintf_s and vswprintf_s return the number of characters written,
// not including the terminating null character, or a negative value
// if an output error occurs.
//
RemoteConnectionSendResultsToHost(TempMessage, SprintfResult);
}
else if (g_IsSerialConnectedToRemoteDebugger)
{
KdSendUsermodePrints(TempMessage, SprintfResult);
}
if (g_LogOpened)
{
//
// .logopen command executed
//
LogopenSaveToFile(TempMessage);
}
if (g_MessageHandler != NULL)
{
//
// There is another handler
//
if (g_MessageHandlerSharedBuffer == NULL)
{
((SendMessageWithParamCallback)g_MessageHandler)(TempMessage);
}
else
{
memcpy(g_MessageHandlerSharedBuffer, TempMessage, strlen(TempMessage) + 1);
((SendMessageWithSharedBufferCallback)g_MessageHandler)();
}
}
}
}