305 {
309
310
312 EVENT_TRACE_PROPERTIES* pProperties = (EVENT_TRACE_PROPERTIES*)malloc(
bufferSize);
314
316 pProperties->Wnode.Flags = WNODE_FLAG_TRACED_GUID;
317 pProperties->Wnode.ClientContext = 1;
318 pProperties->LogFileMode = EVENT_TRACE_REAL_TIME_MODE;
319 pProperties->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
320 pProperties->LogFileNameOffset = 0;
321
322
324 WCHAR sessionName[] = L"Panoptes";
325 ULONG
result = StartTraceW(&
hTrace, sessionName, pProperties);
326 if (
result != ERROR_SUCCESS)
327 {
328
329 free(pProperties);
330 return 1;
331 }
332
333
334 for (const auto& provider : providers)
335 {
336 auto [provName, provMatchAny, provMatchAll] = provider;
337
339 if (provGUID == GUID{}) {
340 printf("[!] Could not retrieve GUID for %s\n", provName);
341 continue;
342 }
343
346 &provGUID,
347 EVENT_CONTROL_CODE_ENABLE_PROVIDER,
348 TRACE_LEVEL_INFORMATION,
349 provMatchAny,
350 provMatchAll,
351 0,
352 NULL
353 );
354 if (
result != ERROR_SUCCESS)
355 {
356
357 printf("[!] Could not enable trace for %s\n", provName);
358 continue;
359 }
360 }
361
362
363 EVENT_TRACE_LOGFILEW
trace;
364 ZeroMemory(&
trace,
sizeof(EVENT_TRACE_LOGFILE));
365 trace.LoggerName = (LPWSTR)sessionName;
366 trace.ProcessTraceMode = PROCESS_TRACE_MODE_REAL_TIME | PROCESS_TRACE_MODE_EVENT_RECORD;
368
369
370 TRACEHANDLE hProcessTrace = OpenTraceW(&
trace);
371 if (hProcessTrace == INVALID_PROCESSTRACE_HANDLE)
372 {
373
374 ControlTraceW(
hTrace, NULL, pProperties, EVENT_TRACE_CONTROL_STOP);
375 free(pProperties);
376 return 1;
377 }
378
379 ProcessTrace(&hProcessTrace, 1, NULL, NULL);
380
381
382 CloseTrace(hProcessTrace);
383 ControlTraceW(
hTrace, NULL, pProperties, EVENT_TRACE_CONTROL_STOP);
384 free(pProperties);
385
386 return 1;
387
388}
std::vector< std::tuple< std::string, unsigned long, unsigned long > > m_eventProviders
The event providers from the configuration file.
VOID WINAPI EventRecordCallback(EVENT_RECORD *pEventRecord)
EVENT_TRACE_LOGFILEW trace
std::optional< GUID > GetProviderGuid(const std::string &providerNameToFind)
ULONG StopAndDeleteTrace()
PanoptesContext * serviceContext