Freigeben über


TdhQueryProviderFieldInformation-Funktion (tdh.h)

Ruft Informationen für das angegebene Feld aus den Ereignisbeschreibungen für die Feldwerte ab, die dem angegebenen Wert entsprechen.

Syntax

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

Parameter

[in] pGuid

GUID, die den Anbieter identifiziert, dessen Informationen Sie abrufen möchten.

[in] EventFieldValue

Rufen Sie Informationen zum Feld ab, wenn der Wert des Felds mit diesem Wert übereinstimmt. Wenn der Feldtyp ein Schlüsselwort (keyword) ist, werden die Informationen für jedes Ereignis Schlüsselwort (keyword) Bits abgerufen, das in der Maske enthalten ist.

[in] EventFieldType

Geben Sie den Typ des Felds an, für das Sie Informationen abrufen möchten. Mögliche Werte finden Sie in der EVENT_FIELD_TYPE-Enumeration .

[out] pBuffer

Benutzerseitig zugewiesener Puffer, um die Feldinformationen zu empfangen. Ausführliche Informationen finden Sie in der PROVIDER_FIELD_INFOARRAY-Struktur .

[in, out] pBufferSize

Größe des pBuffer-Puffers in Bytes. Wenn die Funktion erfolgreich ist, empfängt dieser Parameter die Größe des verwendeten Puffers. Wenn der Puffer zu klein ist, gibt die Funktion ERROR_INSUFFICIENT_BUFFER zurück und legt diesen Parameter auf die erforderliche Puffergröße fest. Wenn die Puffergröße bei der Eingabe null ist, werden keine Daten im Puffer zurückgegeben, und dieser Parameter empfängt die erforderliche Puffergröße.

Rückgabewert

Gibt bei erfolgreicher Ausführung ERROR_SUCCESS zurück. Andernfalls gibt diese Funktion zusätzlich zu anderen einen der folgenden Rückgabecodes zurück.

Rückgabecode Beschreibung
ERROR_INSUFFICIENT_BUFFER
Die Größe des pBuffer-Puffers ist zu klein. Verwenden Sie die erforderliche Puffergröße, die in pBufferSize festgelegt ist, um einen neuen Puffer zuzuweisen.
ERROR_NOT_SUPPORTED
Der angeforderte Feldtyp ist ungültig.
ERROR_NOT_FOUND
Das Manifest oder die MOF-Klasse wurde nicht gefunden oder enthält keine Informationen für den angeforderten Feldtyp, oder ein Feld, dessen Wert dem angegebenen Wert entspricht, wurde nicht gefunden.
ERROR_INVALID_PARAMETER
Mindestens ein Parameter ist ungültig.
ERROR_FILE_NOT_FOUND
Das resourceFileName-Attribut im Manifest enthält den Speicherort der Anbieterbinärdatei. Wenn Sie das Manifest registrieren, wird der Speicherort in die Registrierung geschrieben. TDH konnte die Binärdatei nicht basierend auf dem registrierten Speicherort finden.

Hinweise

Diese Funktion verwendet das XML-Manifest oder die WMI MOF-Klasse, um die Informationen abzurufen.

Beispiele

Im folgenden Beispiel wird gezeigt, wie Informationen abgefragt werden, die im Manifest oder der MOF-Klasse für das angeforderte Feld enthalten sind.

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

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows Vista [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2008 [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile tdh.h
Bibliothek Tdh.lib
DLL Tdh.dll

Weitere Informationen

TdhEnumerateProviderFieldInformation