枚举提供程序
若要检索已在计算机上安装其清单或 MOF 类的提供程序的列表,请调用 TdhEnumerateProviders 函数。
以下示例演示如何枚举提供程序。
#include <windows.h>
#include <stdio.h>
#include <tdh.h>
#pragma comment(lib, "tdh.lib")
#define MAX_GUID_SIZE 39
void wmain(void)
{
DWORD status = ERROR_SUCCESS;
PROVIDER_ENUMERATION_INFO* penum = NULL; // Buffer that contains provider information
PROVIDER_ENUMERATION_INFO* ptemp = NULL;
DWORD BufferSize = 0; // Size of the penum buffer
HRESULT hr = S_OK; // Return value for StringFromGUID2
WCHAR StringGuid[MAX_GUID_SIZE];
DWORD RegisteredMOFCount = 0;
DWORD RegisteredManifestCount = 0;
// Retrieve the required buffer size.
status = TdhEnumerateProviders(penum, &BufferSize);
// Allocate the required buffer and call TdhEnumerateProviders. The list of
// providers can change between the time you retrieved the required buffer
// size and the time you enumerated the providers, so call TdhEnumerateProviders
// in a loop until the function does not return ERROR_INSUFFICIENT_BUFFER.
while (ERROR_INSUFFICIENT_BUFFER == status)
{
ptemp = (PROVIDER_ENUMERATION_INFO*)realloc(penum, BufferSize);
if (NULL == ptemp)
{
wprintf(L"Allocation failed (size=%lu).\n", BufferSize);
goto cleanup;
}
penum = ptemp;
ptemp = NULL;
status = TdhEnumerateProviders(penum, &BufferSize);
}
if (ERROR_SUCCESS != status)
{
wprintf(L"TdhEnumerateProviders failed with %lu.\n", status);
}
else
{
// Loop through the list of providers and print the provider's name, GUID,
// and the source of the information (MOF class or instrumentation manifest).
for (DWORD i = 0; i < penum->NumberOfProviders; i++)
{
hr = StringFromGUID2(penum->TraceProviderInfoArray[i].ProviderGuid, StringGuid, ARRAYSIZE(StringGuid));
if (FAILED(hr))
{
wprintf(L"StringFromGUID2 failed with 0x%x\n", hr);
goto cleanup;
}
wprintf(L"Provider name: %s\nProvider GUID: %s\nSource: %s\n\n",
(LPWSTR)((PBYTE)(penum)+penum->TraceProviderInfoArray[i].ProviderNameOffset),
StringGuid,
(penum->TraceProviderInfoArray[i].SchemaSource) ? L"WMI MOF class" : L"XML manifest");
(penum->TraceProviderInfoArray[i].SchemaSource) ? RegisteredMOFCount++ : RegisteredManifestCount++;
}
wprintf(L"\nThere are %d registered providers; %lu are registered via MOF class and\n%lu are registered via a manifest.\n",
penum->NumberOfProviders,
RegisteredMOFCount,
RegisteredManifestCount);
}
cleanup:
if (penum)
{
free(penum);
penum = NULL;
}
}