TdhQueryProviderFieldInformation 関数 (tdh.h)

指定された値と一致するフィールド値のイベントの説明から、指定したフィールドの情報を取得します。

構文

TDHSTATUS TdhQueryProviderFieldInformation(
  [in]      LPGUID                    pGuid,
  [in]      ULONGLONG                 EventFieldValue,
  [in]      EVENT_FIELD_TYPE          EventFieldType,
  [out]     PPROVIDER_FIELD_INFOARRAY pBuffer,
  [in, out] ULONG                     *pBufferSize
);

パラメーター

[in] pGuid

情報を取得するプロバイダーを識別する GUID。

[in] EventFieldValue

フィールドの値がこの値と一致する場合は、フィールドに関する情報を取得します。 フィールド型がキーワード (keyword)の場合、マスクに含まれる各イベントキーワード (keyword)ビットの情報が取得されます。

[in] EventFieldType

情報を取得するフィールドの種類を指定します。 使用可能な値については、 EVENT_FIELD_TYPE 列挙を参照してください。

[out] pBuffer

フィールド情報を受け取るユーザー割り当てバッファー。 詳細については、PROVIDER_FIELD_INFOARRAY構造に するページを参照してください。

[in, out] pBufferSize

pBuffer バッファーのサイズ (バイト単位)。 関数が成功した場合、このパラメーターは使用されるバッファーのサイズを受け取ります。 バッファーが小さすぎる場合、関数は ERROR_INSUFFICIENT_BUFFERを返し、このパラメーターを必要なバッファー サイズに設定します。 入力時にバッファー サイズが 0 の場合、バッファーにデータは返されません。このパラメーターは必要なバッファー サイズを受け取ります。

戻り値

成功した場合はERROR_SUCCESSを返します。 それ以外の場合、この関数は、他のリターン コードに加えて、次のいずれかのリターン コードを返します。

リターン コード 説明
ERROR_INSUFFICIENT_BUFFER
pBuffer バッファーのサイズが小さすぎます。 pBufferSize に設定されている必要なバッファー サイズを使用して、新しいバッファーを割り当てます。
ERROR_NOT_SUPPORTED
要求されたフィールド型が無効です。
ERROR_NOT_FOUND
マニフェストまたは MOF クラスが見つからなかったか、要求されたフィールド型の情報が含まれていないか、指定された値と一致する値を持つフィールドが見つかりませんでした。
ERROR_INVALID_PARAMETER
1 つ以上のパラメーターが無効です。
ERROR_FILE_NOT_FOUND
マニフェストの resourceFileName 属性には、プロバイダー バイナリの場所が含まれています。 マニフェストを登録すると、場所がレジストリに書き込まれます。 TDH は、登録された場所に基づいてバイナリを見つけることができませんでした。

注釈

この関数は、XML マニフェストまたは WMI MOF クラスを使用して情報を取得します。

次の例は、要求されたフィールドのマニフェストまたは MOF クラスに含まれる情報を照会する方法を示しています。

#include <windows.h>
#include <stdio.h>
#include <wmistr.h>
#include <evntrace.h>
#include <tdh.h>

#pragma comment(lib, "tdh.lib")

DWORD QueryFieldInfo(LPGUID pProvider, EVENT_FIELD_TYPE fieldType, ULONGLONG fieldValue);

// GUID of the provider whose metadata you want to enumerate.

EXTERN_C __declspec(selectany) const GUID ProviderGuid = {0xd8909c24, 0x5be9, 0x4502, {0x98, 0xca, 0xab, 0x7b, 0xdc, 0x24, 0x89, 0x9d}};

void wmain(void)
{
    DWORD status = ERROR_SUCCESS;

    // Retrieve channel information if the provider defines a channel
    // whose value is 17. Returns one entry if the channel exists.

    wprintf(L"Retrieve EventChannelInformation for channel value 17.\n");

    status = QueryFieldInfo((LPGUID)&ProviderGuid, EventChannelInformation, 17);
    if (ERROR_SUCCESS != status)
    {
        wprintf(L"Failed to retrieve EventChannelInformation (%lu).\n\n", status);
    }

    // Retrieve keyword information for keywords whose value is 2 or 8.

    wprintf(L"Retrieve EventKeywordInformation for keywords 2 and 8.\n");

    status = QueryFieldInfo((LPGUID)&ProviderGuid, EventKeywordInformation, 0xA);
    if (ERROR_SUCCESS != status)
    {
        wprintf(L"Failed to retrieve EventKeywordInformation (%lu).\n\n", status);
    }
}

// Prints the information associated with the specified field type.
DWORD QueryFieldInfo(LPGUID pProvider, EVENT_FIELD_TYPE fieldType, ULONGLONG fieldValue)
{
    DWORD status = ERROR_SUCCESS;
    PROVIDER_FIELD_INFOARRAY* penum = NULL;
    DWORD bufferSize = 0;

    // Retrieve the required buffer size. If the status is ERROR_INSUFFICIENT_BUFFER,
    // use bufferSize to allocate the buffer.

    status = TdhQueryProviderFieldInformation(pProvider, fieldValue, fieldType, penum, &bufferSize);
    if (ERROR_INSUFFICIENT_BUFFER == status)
    {
        penum = (PROVIDER_FIELD_INFOARRAY*) malloc(bufferSize);
        if (penum == NULL)
        {
            wprintf(L"Allocation failed (size=%lu).\n", bufferSize);
            status = ERROR_OUTOFMEMORY;
            goto cleanup;
        }

        // Retrieve the information for the field type and value.

        status = TdhQueryProviderFieldInformation(pProvider, fieldValue, fieldType, penum, &bufferSize);
    }

    // The first call can fail with ERROR_NOT_FOUND if none of the provider's event
    // descriptions contain the requested field type information.

    if (ERROR_SUCCESS == status)
    {
        // Loop through the list of field information and print the field's name,
        // description (if it exists), and value. 

        for (DWORD i = 0; i < penum->NumberOfElements; i++)
        {
            wprintf(L"Field name: %s\nDescription: %s\nValue: %I64u\n\n",
                (PWCHAR)((PBYTE)(penum) + penum->FieldInfoArray[i].NameOffset),
                (penum->FieldInfoArray[i].DescriptionOffset) ? 
                    (PWCHAR)((PBYTE)(penum) + penum->FieldInfoArray[i].DescriptionOffset): L"",
                penum->FieldInfoArray[i].Value);
        }
    }
    else
    {
        if (ERROR_NOT_FOUND == status)
        {
            wprintf(L"Requested field type not found.\n");
        }
        else
        {
            wprintf(L"TdhQueryProviderFieldInformation failed with %lu.\n", status);
        }

        goto cleanup;
    }

cleanup:

    if (penum)
    {
        free(penum);
        penum = NULL;
    }

    return status;
}

要件

要件
サポートされている最小のクライアント Windows Vista [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2008 [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー tdh.h
Library Tdh.lib
[DLL] Tdh.dll

こちらもご覧ください

TdhEnumerateProviderFieldInformation