2025-04-27 07:49:33 -04:00

149 lines
3.5 KiB
C++

// EventTrace.cpp
#include "precomp.h"
// So GUID_WMI_NONCOM_EVENT_TRACE will get included into this file.
#include <initguid.h>
#include "NCEvent.h"
#include "EventTrace.h"
#include "P2PDefs.h"
#include "dutils.h"
// Event tracing stuff.
#include <wmistr.h>
#include <evntrace.h>
CEventTraceClient::CEventTraceClient() :
m_hTrace(NULL),
m_hLogger(NULL)
{
}
CEventTraceClient::~CEventTraceClient()
{
Deinit();
}
ULONG WINAPI CEventTraceClient::ControlCallback(
IN WMIDPREQUESTCODE requestCode,
IN PVOID pContext,
IN OUT ULONG *pdwInOutBufferSize,
IN OUT PVOID pBuffer)
{
CEventTraceClient
*pThis = (CEventTraceClient*) pContext;
DWORD status = ERROR_SUCCESS,
dwRetSize;
switch (requestCode)
{
case WMI_ENABLE_EVENTS:
dwRetSize = 0;
pThis->m_hLogger = GetTraceLoggerHandle(pBuffer);
pThis->m_pConnection->IncEnabledCount();
//dwEnableLevel = GetTraceEnableLevel(hLogger);
//dwEnableFlags = GetTraceEnableFlags(hLogger);
//_tprintf(_T("Logging enabled to 0x%016I64x(%d,%d,%d)\n"),
// hLogger, requestCode, dwEnableLevel, dwEnableFlags);
break;
case WMI_DISABLE_EVENTS:
dwRetSize = 0;
pThis->m_hLogger = NULL;
pThis->m_pConnection->ResetEventBufferLayoutSent(TRANS_EVENT_TRACE);
pThis->m_pConnection->DecEnabledCount();
break;
default:
dwRetSize = 0;
status = ERROR_INVALID_PARAMETER;
break;
}
*pdwInOutBufferSize = dwRetSize;
return status;
}
CEventTraceClient::IsReady()
{
return m_hLogger != NULL;
}
#define MS_SLEEP 10
BOOL CEventTraceClient::SendData(LPBYTE pBuffer, DWORD dwSize)
{
DWORD dwRet;
m_event.mofData.DataPtr = (ULONGLONG) pBuffer;
m_event.mofData.Length = dwSize;
do
{
dwRet =
TraceEvent(
m_hLogger,
(PEVENT_TRACE_HEADER) &m_event);
if (dwRet == 0)
{
//printf("Packet sent = %d bytes\n", dwSize);
break;
}
if (dwRet == ERROR_NOT_ENOUGH_MEMORY)
Sleep(MS_SLEEP);
} while (dwRet != ERROR_NOT_ENOUGH_MEMORY);
return dwRet == 0;
}
void CEventTraceClient::Deinit()
{
if (m_hTrace)
{
UnregisterTraceGuids(m_hTrace);
m_hTrace = NULL;
m_hLogger = NULL;
}
}
// TODO: Find out what in the world this is used for!
#define RES_NAME _T("MofResource")
BOOL CEventTraceClient::Init(GUID *pguidEventTraceProvider)
{
TRACE_GUID_REGISTRATION regTrace[] =
{ { &GUID_WMI_NONCOM_EVENTTRACE_EVENT, NULL } };
DWORD dwRet;
TCHAR szImagePath[MAX_PATH] = _T("");
GetModuleFileName(NULL, szImagePath, sizeof(szImagePath));
// Prepare our event buffer for later use.
ZeroMemory(&m_event, sizeof(m_event));
m_event.header.Size = sizeof(USER_EVENT);
m_event.header.Flags = WNODE_FLAG_TRACED_GUID | WNODE_FLAG_USE_MOF_PTR;
m_event.header.Guid = GUID_WMI_NONCOM_EVENTTRACE_EVENT;
dwRet =
RegisterTraceGuids(
ControlCallback,
this, // RequestContext
pguidEventTraceProvider,
1,
regTrace,
szImagePath,
RES_NAME,
&m_hTrace);
return dwRet == 0;
}