Compartir a través de


Función TdhQueryProviderFieldInformation (tdh.h)

Recupera información del campo especificado de las descripciones de eventos de los valores de campo que coinciden con el valor especificado.

Sintaxis

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

Parámetros

[in] pGuid

GUID que identifica el proveedor cuya información desea recuperar.

[in] EventFieldValue

Recupere información sobre el campo si el valor del campo coincide con este valor. Si el tipo de campo es una palabra clave, la información se recupera para cada bit de palabra clave de evento contenido en la máscara.

[in] EventFieldType

Especifique el tipo de campo para el que desea recuperar información. Para conocer los valores posibles, consulte la enumeración EVENT_FIELD_TYPE .

[out] pBuffer

Búfer asignado por el usuario para recibir la información del campo. Para más información, consulte la estructura de PROVIDER_FIELD_INFOARRAY .

[in, out] pBufferSize

Tamaño, en bytes, del búfer de pBuffer . Si la función se ejecuta correctamente, este parámetro recibe el tamaño del búfer usado. Si el búfer es demasiado pequeño, la función devuelve ERROR_INSUFFICIENT_BUFFER y establece este parámetro en el tamaño de búfer necesario. Si el tamaño del búfer es cero en la entrada, no se devuelve ningún dato en el búfer y este parámetro recibe el tamaño de búfer necesario.

Valor devuelto

Devuelve ERROR_SUCCESS si se ejecuta correctamente. De lo contrario, esta función devuelve uno de los siguientes códigos de retorno además de otros.

Código devuelto Descripción
ERROR_INSUFFICIENT_BUFFER
El tamaño del búfer de pBuffer es demasiado pequeño. Use el tamaño de búfer necesario establecido en pBufferSize para asignar un nuevo búfer.
ERROR_NOT_SUPPORTED
El tipo de campo solicitado no es válido.
ERROR_NOT_FOUND
No se encontró el manifiesto o la clase MOF o no contiene información para el tipo de campo solicitado o un campo cuyo valor coincide con el valor especificado no se encontró.
ERROR_INVALID_PARAMETER
Uno o varios de los parámetros no son válidos.
ERROR_FILE_NOT_FOUND
El atributo resourceFileName del manifiesto contiene la ubicación del binario del proveedor. Al registrar el manifiesto, la ubicación se escribe en el Registro. TDH no pudo encontrar el binario en función de la ubicación registrada.

Comentarios

Esta función usa el manifiesto XML o la clase MOF de WMI para recuperar la información.

Ejemplos

En el ejemplo siguiente se muestra cómo consultar información contenida en el manifiesto o la clase MOF para el campo solicitado.

#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;
}

Requisitos

Requisito Value
Cliente mínimo compatible Windows Vista [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2008 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado tdh.h
Library Tdh.lib
Archivo DLL Tdh.dll

Consulte también

TdhEnumerateProviderFieldInformation