首页
社区
课程
招聘
[翻译]配置和启动 NT 内核记录器会话
2021-2-28 22:08 9507

[翻译]配置和启动 NT 内核记录器会话

2021-2-28 22:08
9507

文章链接:https://docs.microsoft.com/en-us/windows/win32/etw/configuring-and-starting-the-nt-kernel-logger-session


NT内核日志记录器会话是一个事件跟踪会话,它记录一组预定义的内核事件。您不需要调用EnableTrace函数来启用内核提供程序。相反,您可以使用EVENT_TRACE_PROPERTIES结构的EnableFlags成员来指定您想要接收的内核事件。StartTrace函数使用您指定的启用标志来启用内核提供程序。


只有一个NT内核日志记录器会话会话。如果会话已在使用中,则StartTrace函数将返回ERROR_ALREADY_EXISTS。

关于启动事件跟踪会话的详细信息,请参见配置并启动事件跟踪会话。(见后文)

原文链接:https://docs.microsoft.com/en-us/windows/win32/etw/configuring-and-starting-an-event-tracing-session


关于启动私有日志记录器会话的详细信息,请参见配置和启动私有日志记录器会话。(见后文)

关于启动全局Logger会话的详细信息,请参见配置并启动全局Logger会话。(见后文)

关于启动AutoLogger会话的详细信息,请参见配置并启动AutoLogger会话。(见后文)

下面的示例演示如何配置和启动NT内核日志记录器会话,该会话收集网络TCP / IP内核事件并将其写入5MB循环文件中。

#define INITGUID  // Include this #define to use SystemTraceControlGuid in Evntrace.h.

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <strsafe.h>
#include <wmistr.h>
#include <evntrace.h>

#define LOGFILE_PATH L"<FULLPATHTOTHELOGFILE.etl>"

void wmain(void)
{
    ULONG status = ERROR_SUCCESS;
    TRACEHANDLE SessionHandle = 0;
    EVENT_TRACE_PROPERTIES* pSessionProperties = NULL;
    ULONG BufferSize = 0;

    // Allocate memory for the session properties. The memory must
    // be large enough to include the log file name and session name,
    // which get appended to the end of the session properties structure.
    
    BufferSize = sizeof(EVENT_TRACE_PROPERTIES) + sizeof(LOGFILE_PATH) + sizeof(KERNEL_LOGGER_NAME);
    pSessionProperties = (EVENT_TRACE_PROPERTIES*) malloc(BufferSize);    
    if (NULL == pSessionProperties)
    {
        wprintf(L"Unable to allocate %d bytes for properties structure.\n", BufferSize);
        goto cleanup;
    }
    
    // Set the session properties. You only append the log file name
    // to the properties structure; the StartTrace function appends
    // the session name for you.

    ZeroMemory(pSessionProperties, BufferSize);
    pSessionProperties->Wnode.BufferSize = BufferSize;
    pSessionProperties->Wnode.Flags = WNODE_FLAG_TRACED_GUID;
    pSessionProperties->Wnode.ClientContext = 1; //QPC clock resolution
    pSessionProperties->Wnode.Guid = SystemTraceControlGuid; 
    pSessionProperties->EnableFlags = EVENT_TRACE_FLAG_NETWORK_TCPIP;
    pSessionProperties->LogFileMode = EVENT_TRACE_FILE_MODE_CIRCULAR;
    pSessionProperties->MaximumFileSize = 5;  // 5 MB
    pSessionProperties->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
    pSessionProperties->LogFileNameOffset = sizeof(EVENT_TRACE_PROPERTIES) + sizeof(KERNEL_LOGGER_NAME); 
    StringCbCopy((LPWSTR)((char*)pSessionProperties + pSessionProperties->LogFileNameOffset), sizeof(LOGFILE_PATH), LOGFILE_PATH);

    // Create the trace session.

    status = StartTrace((PTRACEHANDLE)&SessionHandle, KERNEL_LOGGER_NAME, pSessionProperties);

    if (ERROR_SUCCESS != status)
    {
        if (ERROR_ALREADY_EXISTS == status)
        {
            wprintf(L"The NT Kernel Logger session is already in use.\n");
        }
        else
        {
            wprintf(L"EnableTrace() failed with %lu\n", status);
        }

        goto cleanup;
    }

    wprintf(L"Press any key to end trace session ");
    _getch();

cleanup:

    if (SessionHandle)
    {
        status = ControlTrace(SessionHandle, KERNEL_LOGGER_NAME, pSessionProperties, EVENT_TRACE_CONTROL_STOP);

        if (ERROR_SUCCESS != status)
        {
            wprintf(L"ControlTrace(stop) failed with %lu\n", status);
        }
    }

    if (pSessionProperties)
        free(pSessionProperties);
}

配置和启动事件跟踪会话:


要配置事件跟踪会话,可以使用EVENT_TRACE_PROPERTIES结构来指定会话的属性。为EVENT_TRACE_PROPERTIES结构分配的内存必须足够大,以同时包含内存中紧跟该结构的会话和日志文件名。

指定会话的属性后,调用StartTrace函数以启动会话。如果函数成功,则SessionHandle参数将包含会话句柄,而LoggerNameOffset属性将包含会话名称的偏移量。

要启用希望将事件记录到会话的提供程序,请调用EnableTrace函数来启用经典提供程序,并调用EnableTraceEx函数来启用基于清单的提供程序。在Windows 8.1、Windows Server 2012 R2及更高版本上,要启用提供程序,您需要在特定条件下将事件记录到会话过滤中,请调用EnableTraceEx2函数。

此外,您还可以通过调用TraceSetInformation函数来跟踪事件的附加信息。TraceSetInformation将附加的跟踪信息放入事件的扩展数据部分,并可以包括诸如跟踪版本信息或当前在系统上注册的提供程序之类的信息。有关更多信息,请参见检索其他事件跟踪数据。

多达八个跟踪会话可以启用和接收来自同一基于清单的提供程序的事件。但是,只有一个跟踪会话可以启用经典提供程序。如果多个跟踪会话尝试启用经典提供程序,则当第二个会话启用提供程序时,第一个会话将停止接收事件。例如,如果会话A启用了提供程序1,然后会话B启用了提供程序1,则只有会话B会从提供程序1接收事件。

您可以使用这三个功能中的任何一个来启用提供程序,但是如果您使用EnableTrace来启用基于清单的提供程序,则可能会失去功能,因为您将无法提供MatchAllKeyword值,无法指定事件中要包括的扩展数据项,或提供提供商定义的过滤器数据。有关更多信息,请参见每个功能的“备注”部分。

在Windows 8.1,Windows Server 2012 R2和更高版本上,EnableTraceEx2函数以及ENABLE_TRACE_PARAMETERS和EVENT_FILTER_DESCRIPTOR结构可以使用事件有效负载,范围和堆栈遍历筛选器,以在记录器会话中的特定条件下进行筛选。有关事件有效负载过滤器的更多信息,请参见TdhCreatePayloadFilter和TdhAggregatePayloadFilters函数以及ENABLE_TRACE_PARAMETERS,EVENT_FILTER_DESCRIPTOR和PAYLOAD_FILTER_PREDICATE结构。

要确定用于启用基于清单的提供程序的级别和关键字,请使用以下命令之一:

    Logman查询提供者名称
    Wevtutil GP提供者名称


这些命令仅列出级别和关键字,提供程序必须记录潜在控制器的任何过滤器数据要求。

要枚举基于清单的提供程序,请使用Wevtutil ep。

对于经典提供程序,提供程序要由提供程序来记录并向潜在的控制器提供严重性级别或启用其支持的标志。如果提供者希望被任何控制器启用,则提供者应接受0作为严重性级别并启用标志,并将0解释为执行默认日志记录的请求(无论如何)。

您可以在提供者注册自己之前或之后启用提供者。启用提供程序后,ETW将调用提供程序的回调函数。如果未注册提供者,则ETW在注册其自身后将调用提供者的回调函数。

您还可以使用EnableTrace函数禁用提供程序(停止将事件记录到会话中)或更新日志记录级别或启用提供程序的标志。使用EnableTraceEx函数,您可以禁用提供程序或更新级别,关键字,扩展数据和过滤器数据。每次调用EnableTrace或EnableTraceEx函数时,ETW都会调用提供程序的回调函数。在会话禁用提供程序之前,该提供程序将保持对会话的启用状态。

您还可以使用EnableTrace函数禁用提供程序(停止将事件记录到会话中)或更新日志记录级别或启用提供程序的标志。使用EnableTraceEx函数,您可以禁用提供程序或更新级别,关键字,扩展数据和过滤器数据。每次调用EnableTrace或EnableTraceEx函数时,ETW都会调用提供程序的回调函数。在会话禁用提供程序之前,该提供程序将保持对会话的启用状态。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回