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 |
---|---|
|
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. |
|
El tipo de campo solicitado no es válido. |
|
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ó. |
|
Uno o varios de los parámetros no son válidos. |
|
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 |