다음을 통해 공유


QueryAllTracesW 함수(evntrace.h)

QueryAllTraces 함수는 호출자가 쿼리할 수 있는 권한이 있는 모든 이벤트 추적 세션에 대한 속성 및 통계를 검색합니다.

구문

ULONG WMIAPI QueryAllTracesW(
  [out] PEVENT_TRACE_PROPERTIES *PropertyArray,
  [in]  ULONG                   PropertyArrayCount,
  [out] PULONG                  LoggerCount
);

매개 변수

[out] PropertyArray

이벤트 추적 세션에 대한 세션 속성 및 통계를 수신하는 EVENT_TRACE_PROPERTIES 구조체에 대한 포인터 배열입니다.

EVENT_TRACE_PROPERTIES 구조체의 Wnode.BufferSize, LoggerNameOffsetLogFileNameOffset 멤버만 설정하면 됩니다. 다른 멤버는 모두 0으로 설정해야 합니다.

[in] PropertyArrayCount

PropertyArray 배열의 구조체 수입니다. 이 값은 ETW에서 지원하는 최대 이벤트 추적 세션 수인 64보다 작거나 같아야 합니다.

Windows 10:PropertyArrayCount는 64보다 클 수 있으며 일부 시스템은 64개 이상의 추적 세션을 지원할 수 있습니다.

[out] LoggerCount

컴퓨터에서 시작된 실제 이벤트 추적 세션 수입니다.

반환 값

함수가 성공하면 반환 값이 ERROR_SUCCESS.

함수가 실패하면 반환 값은 시스템 오류 코드 중 하나입니다. 다음은 몇 가지 일반적인 오류와 그 원인입니다.

  • ERROR_INVALID_PARAMETER

    다음 중 하나에 해당합니다.

    • PropertyArrayCount 가 0이거나 지원되는 최대 세션 수보다 큽니다.
    • PropertyArray가NULL입니다.
  • ERROR_MORE_DATA

    속성 배열이 너무 작아서 모든 세션에 대한 정보를 받을 수 없습니다(SessionCountPropertyArrayCount보다 큼). 함수는 PropertyArrayCount에 지정된 속성 구조의 수로 속성 배열을 채웁니다.

설명

이벤트 추적 컨트롤러는 이 함수를 호출합니다.

이 함수는 호출자가 쿼리할 수 있는 권한이 있는 추적 세션을 검색합니다. 관리자 권한으로 실행되는 사용자, 성능 로그 사용자 그룹의 사용자 및 LocalSystem, LocalService, NetworkService로 실행되는 서비스는 모든 추적 세션을 볼 수 있습니다.

이 함수는 프라이빗 로깅 세션을 반환하지 않습니다.

단일 세션에 대한 정보를 검색하려면 ControlTrace 함수를 사용하고 ControlCode 매개 변수를 EVENT_TRACE_CONTROL_QUERY 설정합니다.

예제

다음 예제에서는 이 함수를 호출하는 방법을 보여줍니다.

#include <windows.h>
#include <evntrace.h>
#include <vector>

const unsigned MAX_SESSION_NAME_LEN = 1024;
const unsigned MAX_LOGFILE_PATH_LEN = 1024;
const unsigned PropertiesSize =
    sizeof(EVENT_TRACE_PROPERTIES) +
    (MAX_SESSION_NAME_LEN * sizeof(CHAR)) +
    (MAX_LOGFILE_PATH_LEN * sizeof(CHAR));

int main()
{
    ULONG status;
    std::vector<EVENT_TRACE_PROPERTIES*> sessions; // Array of pointers to property structures
    std::vector<BYTE> buffer;                      // Buffer that contains all the property structures
    ULONG sessionCount;                            // Actual number of sessions started on the computer

    // The size of the session name and log file name used by the
    // controllers are not known, therefore create a properties structure that allows
    // for the maximum size of both.

    try
    {
        sessionCount = 64; // Start with room for 64 sessions.
        do
        {
            sessions.resize(sessionCount);
            buffer.resize(PropertiesSize * sessionCount);

            for (size_t i = 0; i != sessions.size(); i += 1)
            {
                sessions[i] = (EVENT_TRACE_PROPERTIES*)&buffer[i * PropertiesSize];
                sessions[i]->Wnode.BufferSize = PropertiesSize;
                sessions[i]->LoggerNameOffset = sizeof(EVENT_TRACE_PROPERTIES);
                sessions[i]->LogFileNameOffset = sizeof(EVENT_TRACE_PROPERTIES) + (MAX_SESSION_NAME_LEN * sizeof(CHAR));
            }

            status = QueryAllTracesA(&sessions[0], sessionCount, &sessionCount);
        } while (status == ERROR_MORE_DATA);

        if (status != ERROR_SUCCESS)
        {
            printf("Error calling QueryAllTraces: %u\n", status);
        }
        else
        {
            printf("Actual session count: %u.\n\n", sessionCount);

            for (ULONG i = 0; i < sessionCount; i++)
            {
                WCHAR sessionGuid[50];
                (void)StringFromGUID2(sessions[i]->Wnode.Guid, sessionGuid, ARRAYSIZE(sessionGuid));

                printf(
                    "Session GUID: %ls\n"
                    "Session ID: %llu\n"
                    "Session name: %s\n"
                    "Log file: %s\n"
                    "min buffers: %u\n"
                    "max buffers: %u\n"
                    "buffers: %u\n"
                    "buffers written: %u\n"
                    "buffers lost: %u\n"
                    "events lost: %u\n"
                    "\n",
                    sessionGuid,
                    sessions[i]->Wnode.HistoricalContext,
                    (PCSTR)((LPCBYTE)sessions[i] + sessions[i]->LoggerNameOffset),
                    (PCSTR)((LPCBYTE)sessions[i] + sessions[i]->LogFileNameOffset),
                    sessions[i]->MinimumBuffers,
                    sessions[i]->MaximumBuffers,
                    sessions[i]->NumberOfBuffers,
                    sessions[i]->BuffersWritten,
                    sessions[i]->LogBuffersLost,
                    sessions[i]->EventsLost);
            }
        }
    }
    catch (std::bad_alloc const&)
    {
        printf("Error allocating memory for properties.\n");
        status = ERROR_OUTOFMEMORY;
    }

    return status;
}

참고

evntrace.h 헤더는 UNICODE 전처리기 상수의 정의에 따라 이 함수의 ANSI 또는 유니코드 버전을 자동으로 선택하는 별칭으로 QueryAllTraces를 정의합니다. 인코딩 중립 별칭을 인코딩 중립이 아닌 코드와 혼합하면 컴파일 또는 런타임 오류가 발생하는 불일치가 발생할 수 있습니다. 자세한 내용은 함수 프로토타입에 대한 규칙을 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000 Professional[데스크톱 앱만]
지원되는 최소 서버 Windows 2000 Server[데스크톱 앱만]
대상 플랫폼 Windows
헤더 evntrace.h
라이브러리 Windows 8.1 및 Windows Server 2012 R2의 Sechost.lib; Advapi32.lib on Windows 8, Windows Server 2012, Windows 7, Windows Server 2008 R2, Windows Server 2008, Windows Vista 및 Windows XP
DLL Windows 8.1 및 Windows Server 2012 R2의 Sechost.dll, Windows 8, Windows Server 2012, Windows 7, Windows Server 2008 R2, Windows Server 2008, Windows Vista 및 Windows XP에서 Advapi32.dll

추가 정보

ControlTrace

EVENT_TRACE_PROPERTIES

EnumerateTraceGuids