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 です。
関数が失敗した場合、戻り値は システム エラー コードの 1 つです。 一般的なエラーとその原因を次に示します。
ERROR_INVALID_PARAMETER
パラメーターの 1 つが無効です。
ERROR_INSUFFICIENT_BUFFER
OutBuffer バッファーが小さすぎて、登録されているすべてのプロバイダーの情報を受信できません。 ReturnLength で返されるサイズを使用してバッファーを再割り当てします。
注釈
この関数は、( RegisterTraceGuids または EventRegister を介して) 開始され、まだ停止されていないイベント トレース プロバイダーに関する情報を返します。
注意
システムに登録されているプロバイダー マニフェスト (つまり、 を介して wevtutil
登録されたマニフェスト) に関する情報を取得するには、 TdhEnumerateProviders を使用します。
TraceQueryInfoClass が TraceGuidQueryInfo の場合、ETW は情報のヘッダーであるTRACE_GUID_INFO ブロック内のデータを返します。 情報ブロックには、同じ GUID を使用する各プロバイダーの TRACE_PROVIDER_INSTANCE_INFO ブロックが含まれています。 各インスタンス情報ブロックには、プロバイダーを有効にしたセッションごとに 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 |
Library | Advapi32.lib |
[DLL] | Advapi32.dll |