EnumerateTraceGuidsEx 함수(evntrace.h)
현재 컴퓨터에서 실행 중인 이벤트 추적 공급자에 대한 정보를 검색합니다.
구문
ULONG WMIAPI EnumerateTraceGuidsEx(
[in] TRACE_QUERY_INFO_CLASS TraceQueryInfoClass,
[in] PVOID InBuffer,
[in] ULONG InBufferSize,
[out] PVOID OutBuffer,
[in] ULONG OutBufferSize,
[out] PULONG ReturnLength
);
매개 변수
[in] TraceQueryInfoClass
반환할 정보의 유형을 결정합니다. 가능한 값은 TRACE_QUERY_INFO_CLASS 열거형을 참조하세요.
[in] InBuffer
정보를 검색하려는 공급자 또는 공급자 그룹의 GUID입니다. TraceQueryInfoClass가 TraceGuidQueryInfo 또는 TraceGroupQueryInfo인 경우에만 GUID를 지정합니다.
[in] InBufferSize
InBuffer 데이터의 크기(바이트)입니다.
[out] OutBuffer
열거된 정보를 포함하는 애플리케이션 할당 버퍼입니다. 정보의 형식은 TraceQueryInfoClass 값에 따라 달라집니다.
[in] OutBufferSize
OutBuffer 버퍼의 크기(바이트)입니다. 함수가 성공하면 ReturnLength 매개 변수는 사용된 버퍼의 크기를 받습니다. 버퍼가 너무 작으면 함수가 반환 ERROR_INSUFFICIENT_BUFFER
되고 ReturnLength 매개 변수는 필요한 버퍼 크기를 받습니다. 입력 시 버퍼 크기가 0이면 버퍼에 데이터가 반환되지 않으며 ReturnLength 매개 변수는 필요한 버퍼 크기를 받습니다.
[out] ReturnLength
OutBuffer의 실제 데이터 크기(바이트)입니다.
반환 값
함수가 성공하면 반환 값이 ERROR_SUCCESS.
함수가 실패하면 반환 값은 시스템 오류 코드 중 하나입니다. 다음은 몇 가지 일반적인 오류와 그 원인입니다.
ERROR_INVALID_PARAMETER
매개 변수 중 하나가 잘못되었습니다.
ERROR_INSUFFICIENT_BUFFER
OutBuffer 버퍼가 너무 작아서 등록된 모든 공급자에 대한 정보를 받을 수 없습니다. ReturnLength에서 반환된 크기를 사용하여 버퍼를 다시 할당합니다.
설명
이 함수는 RegisterTraceGuids 또는 EventRegister를 통해 시작되었으며 아직 중지되지 않은 이벤트 추적 공급자에 대한 정보를 반환합니다.
참고
시스템에 등록된 공급자 매니페스트(예: 를 통해 wevtutil
등록된 매니페스트)에 대한 정보를 얻으려면 TdhEnumerateProviders를 사용합니다.
TraceQueryInfoClass가 TraceGuidQueryInfo이면 ETW는 정보에 대한 헤더인 TRACE_GUID_INFO 블록의 데이터를 반환합니다. 정보 블록에는 동일한 GUID를 사용하는 각 공급자에 대한 TRACE_PROVIDER_INSTANCE_INFO 블록이 포함되어 있습니다. 각 instance 정보 블록에는 공급자를 사용하도록 설정한 각 세션에 대한 TRACE_ENABLE_INFO 구조가 포함되어 있습니다.
예제
다음 예제에서는 이 함수를 호출하는 방법을 보여줍니다.
#include <windows.h>
#include <stdio.h>
#include <evntcons.h>
DWORD GetProviderInfo(GUID ProviderGuid, PTRACE_GUID_INFO& pInfo);
int wmain(void)
{
ULONG status = ERROR_SUCCESS;
GUID* pTemp = NULL;
GUID* pGuids = NULL;
DWORD GuidListSize = 0;
DWORD GuidCount = 0;
DWORD RequiredListSize = 0;
WCHAR ProviderGuid[50];
PTRACE_GUID_INFO pInfo = NULL;
PTRACE_PROVIDER_INSTANCE_INFO pInstance = NULL;
PTRACE_ENABLE_INFO pEnable = NULL;
// Get the required buffer size for the query.
status = EnumerateTraceGuidsEx(TraceGuidQueryList, NULL, 0, pGuids, GuidListSize, &RequiredListSize);
// The number of registered providers could change between the
// time you called to get the buffer size and the time you called
// to get the actual data, so call EnumerateTraceGuidsEx in a loop
// until you no longer get ERROR_INSUFFICIENT_BUFFER.
while (ERROR_INSUFFICIENT_BUFFER == status)
{
pTemp = (GUID*)realloc(pGuids, RequiredListSize);
if (NULL == pTemp)
{
printf("Error allocating memory for list of provider GUIDs.\n");
goto cleanup;
}
pGuids = pTemp;
pTemp = NULL;
GuidListSize = RequiredListSize;
ZeroMemory(pGuids, GuidListSize);
status = EnumerateTraceGuidsEx(TraceGuidQueryList, NULL, 0, pGuids, GuidListSize, &RequiredListSize);
}
if (ERROR_SUCCESS == status)
{
GuidCount = GuidListSize / sizeof(GUID);
// For each registered provider on the computer, get information
// about how it was registered. If a session enabled the
// provider, get information on how the session enabled the provider.
for (USHORT i = 0; i < GuidCount; i++)
{
StringFromGUID2(pGuids[i], ProviderGuid, sizeof(ProviderGuid));
printf("Provider: %ls\n", ProviderGuid);
status = GetProviderInfo(pGuids[i], pInfo);
if (ERROR_SUCCESS == status)
{
pInstance = (PTRACE_PROVIDER_INSTANCE_INFO)((PBYTE)pInfo + sizeof(TRACE_GUID_INFO));
if (pInfo->InstanceCount > 1)
{
printf("There are %d providers that use the same GUID.\n", pInfo->InstanceCount);
}
for (DWORD j = 0; j < pInfo->InstanceCount; j++)
{
printf("\tThe PID of the process that registered the provider is %lu.\n", pInstance->Pid);
if ((pInstance->Flags & TRACE_PROVIDER_FLAG_PRE_ENABLE) == TRACE_PROVIDER_FLAG_PRE_ENABLE)
{
printf("\tThe provider is not registered; however, one or more sessions have enabled the provider.\n");
}
else
{
if ((pInstance->Flags & TRACE_PROVIDER_FLAG_LEGACY) == TRACE_PROVIDER_FLAG_LEGACY)
{
printf("\tThe provider used RegisterTraceGuids to register itself.\n");
}
else
{
printf("\tThe provider used EventRegister to register itself.\n");
}
}
if (pInstance->EnableCount > 0)
{
printf("\tThe provider is enabled to the following sessions.\n");
pEnable = (PTRACE_ENABLE_INFO)((PBYTE)pInstance + sizeof(TRACE_PROVIDER_INSTANCE_INFO));
for (DWORD k = 0; k < pInstance->EnableCount; k++)
{
printf("\t\tSession Id: %hu\n", pEnable->LoggerId);
printf("\t\tLevel used to enable the provider: %hu\n", pEnable->Level);
printf("\t\tMatchAnyKeyword value used to enable the provider: %I64u\n", pEnable->MatchAnyKeyword);
printf("\t\tMatchAllKeyword value used to enable the provider: %I64u\n", pEnable->MatchAllKeyword);
if (pEnable->EnableProperty > 0)
{
printf("\t\tThe session requested that the following information be included with each event:\n");
if ((pEnable->EnableProperty & EVENT_ENABLE_PROPERTY_SID) == EVENT_ENABLE_PROPERTY_SID)
{
printf("\t\t\tThe SID of the user that logged the event\n");
}
if ((pEnable->EnableProperty & EVENT_ENABLE_PROPERTY_TS_ID) == EVENT_ENABLE_PROPERTY_TS_ID)
{
printf("\t\t\tThe terminal session ID\n");
}
}
pEnable++;
printf("\n");
}
}
pInstance = (PTRACE_PROVIDER_INSTANCE_INFO)((PBYTE)pInstance + pInstance->NextOffset);
printf("\n");
}
printf("\n");
}
else
{
printf("Error retrieving provider info (%lu)\n\n", status);
}
}
printf("\nRegistered provider count is %lu.\n", GuidCount);
}
else
{
printf("EnumerateTraceGuidsEx(TraceGuidQueryList) failed with %lu.\n", status);
goto cleanup;
}
cleanup:
if (pGuids)
{
free(pGuids);
pGuids = NULL;
}
if (pInfo)
{
free(pInfo);
pInfo = NULL;
}
return 0;
}
// Get information about the specified provider.
DWORD GetProviderInfo(GUID ProviderGuid, PTRACE_GUID_INFO& pInfo)
{
ULONG status = ERROR_SUCCESS;
PTRACE_GUID_INFO pTemp = NULL;
DWORD InfoListSize = 0;
DWORD RequiredListSize = 0;
status = EnumerateTraceGuidsEx(TraceGuidQueryInfo, &ProviderGuid, sizeof(GUID), pInfo, InfoListSize, &RequiredListSize);
while (ERROR_INSUFFICIENT_BUFFER == status)
{
pTemp = (PTRACE_GUID_INFO)realloc(pInfo, RequiredListSize);
if (NULL == pTemp)
{
printf("Error allocating memory for provider info.\n");
goto cleanup;
}
pInfo = pTemp;
pTemp = NULL;
InfoListSize = RequiredListSize;
ZeroMemory(pInfo, InfoListSize);
status = EnumerateTraceGuidsEx(TraceGuidQueryInfo, &ProviderGuid, sizeof(GUID), pInfo, InfoListSize, &RequiredListSize);
}
if (ERROR_SUCCESS != status)
{
printf("EnumerateTraceGuidsEx(TraceGuidQueryInfo) failed with %lu.\n", status);
}
cleanup:
return status;
}
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows Vista [데스크톱 앱 | UWP 앱] |
지원되는 최소 서버 | Windows Server 2008 [데스크톱 앱 | UWP 앱] |
대상 플랫폼 | Windows |
헤더 | evntrace.h |
라이브러리 | Advapi32.lib |
DLL | Advapi32.dll |