Bagikan melalui


Fungsi TdhQueryProviderFieldInformation (tdh.h)

Mengambil informasi untuk bidang yang ditentukan dari deskripsi peristiwa untuk nilai bidang yang cocok dengan nilai yang diberikan.

Sintaks

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 yang mengidentifikasi penyedia yang informasinya ingin Anda ambil.

[in] EventFieldValue

Ambil informasi tentang bidang jika nilai bidang cocok dengan nilai ini. Jika jenis bidang adalah kata kunci, informasi diambil untuk setiap bit kata kunci peristiwa yang terkandung dalam masker.

[in] EventFieldType

Tentukan tipe bidang yang ingin Anda ambil informasinya. Untuk nilai yang mungkin, lihat enumerasi EVENT_FIELD_TYPE .

[out] pBuffer

Buffer yang dialokasikan pengguna untuk menerima informasi bidang. Untuk detailnya, lihat struktur PROVIDER_FIELD_INFOARRAY .

[in, out] pBufferSize

Ukuran, dalam byte, dari buffer pBuffer . Jika fungsi berhasil, parameter ini menerima ukuran buffer yang digunakan. Jika buffer terlalu kecil, fungsi mengembalikan ERROR_INSUFFICIENT_BUFFER dan mengatur parameter ini ke ukuran buffer yang diperlukan. Jika ukuran buffer nol pada input, tidak ada data yang dikembalikan dalam buffer dan parameter ini menerima ukuran buffer yang diperlukan.

Mengembalikan nilai

Mengembalikan ERROR_SUCCESS jika berhasil. Jika tidak, fungsi ini mengembalikan salah satu kode pengembalian berikut selain yang lain.

Menampilkan kode Deskripsi
ERROR_INSUFFICIENT_BUFFER
Ukuran buffer pBuffer terlalu kecil. Gunakan ukuran buffer yang diperlukan yang diatur dalam pBufferSize untuk mengalokasikan buffer baru.
ERROR_NOT_SUPPORTED
Tipe bidang yang diminta tidak valid.
ERROR_NOT_FOUND
Manifes atau kelas MOF tidak ditemukan atau tidak berisi informasi untuk jenis bidang yang diminta, atau bidang yang nilainya cocok dengan nilai yang diberikan tidak ditemukan.
ERROR_INVALID_PARAMETER
Satu atau beberapa parameter tidak valid.
ERROR_FILE_NOT_FOUND
Atribut resourceFileName dalam manifes berisi lokasi biner penyedia. Saat Anda mendaftarkan manifes, lokasi ditulis ke registri. TDH tidak dapat menemukan biner berdasarkan lokasi terdaftar.

Keterangan

Fungsi ini menggunakan manifes XML atau kelas MOF WMI untuk mengambil informasi.

Contoh

Contoh berikut menunjukkan cara mengkueri informasi yang terkandung dalam manifes atau kelas MOF untuk bidang yang diminta.

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

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows Vista [hanya aplikasi desktop]
Server minimum yang didukung Windows Server 2008 [hanya aplikasi desktop]
Target Platform Windows
Header tdh.h
Pustaka Tdh.lib
DLL Tdh.dll

Lihat juga

TdhEnumerateProviderFieldInformation