PERFLIBREQUEST 回调函数 (perflib.h)

提供程序可以实现此函数,以在使用者执行某些操作(例如在查询中添加或删除计数器)时接收通知。 PERFLIB 在使用者的请求完成之前调用回调。

PERFLIBREQUEST 类型定义指向此回调函数的指针。 ControlCallback 函数是应用程序定义的函数名称的占位符。

语法

PERFLIBREQUEST Perflibrequest;

ULONG Perflibrequest(
  [in] ULONG RequestCode,
  [in] PVOID Buffer,
  [in] ULONG BufferSize
)
{...}

参数

[in] RequestCode

请求代码可以是以下值之一。

含义
PERF_ADD_COUNTER
使用者正在向查询添加计数器。 PERFLIB 针对要添加到查询的每个计数器使用此请求代码调用回调。 Buffer 参数包含标识要添加的计数器的 PERF_COUNTER_IDENTITY 结构。

提供程序可以使用此通知开始计数。

PERF_REMOVE_COUNTER
使用者正在从查询中删除计数器。 PERFLIB 针对要从查询中删除的每个计数器使用此请求代码调用回调。 Buffer 参数包含标识要移除的计数器的PERF_COUNTER_IDENTITY结构。

提供程序可以使用此通知停止计数。

PERF_ENUM_INSTANCES
使用者枚举计数器集的实例。 Buffer 参数包含一个以 null 结尾的 Unicode 字符串,该字符串标识使用者从中枚举实例 (或其 IP 地址) 的名称。
PERF_COLLECT_START
使用者开始收集计数器数据。 Buffer 参数包含一个以 null 结尾的 Unicode 字符串,该字符串标识 (计算机的名称或其 IP 地址) 使用者从中收集数据。

如果原始数据状态为关键 (提供程序可以使用此通知,例如,不允许) 部分更新的与事务相关的计数器。 此通知使提供程序有机会在收集开始之前刷新所有挂起的更新并锁定将来的更新。

PERF_COLLECT_END
计数器数据收集已完成。 Buffer 参数包含一个以 null 结尾的 Unicode 字符串,该字符串标识使用者从中收集数据 (或其 IP 地址) 的名称。

提供程序可以使用此通知来释放集合开始通知施加的更新锁定,以便可以继续更新计数器数据。

[in] Buffer

缓冲区的内容取决于请求。 有关可能的内容,请参阅 RequestCode 参数。

[in] BufferSize

Buffer 参数的大小(以字节为单位)。

返回值

如果回调成功,则返回ERROR_SUCCESS。

如果回调失败,如果请求PERF_ADD_COUNTER、PERF_ENUM_INSTANCESPERF_COLLECT_START,PERFLIB 会将错误代码返回给使用者;否则,将忽略错误代码。

注解

如果提供程序元素的回调属性为“custom”,或者在调用 CTRPP 时使用了 -NotificationCallback 参数,则必须实现此函数。 将回调函数的名称传递给 CounterInitialize

Windows Vista: CounterInitialize 函数名为 PerfAutoInitializeCTRPP 工具还会为你生成此回调的框架,其中包含所有请求代码。 然后,将代码添加到要支持的请求代码并删除其他代码。

回调必须在一秒内完成。 如果回调未及时完成,PERFLIB 将继续处理使用者的请求,并在回调完成后忽略回调的返回值。

示例

以下示例演示 ControlCallback 函数的简单实现。

ULONG MyControlCallback(ULONG RequestCode, PVOID pBuffer, ULONG* pBufferSize)
{
    ULONG Status = ERROR_SUCCESS;
    PWNODE_HEADER Wnode = (PWNODE_HEADER)pBuffer;
    LPWSTR pComputerName = NULL;
    LPWSTR pInstance = NULL;
    PPERF_COUNTER_IDENTITY pCounter;
    UNREFERENCED_PARAMETER(pBufferSize);

    switch (RequestCode) 
    {
        case PERF_ADD_COUNTER:
            pCounter = (PPERF_COUNTER_IDENTITY)(((LPBYTE) Wnode) + sizeof(WNODE_HEADER));
            pComputerName = (LPWSTR)(((LPBYTE) pCounter) + pCounter->MachineOffset);
            pInstance = (pCounter->NameOffset > 0) 
                ? (LPWSTR) (((LPBYTE) pCounter) + pCounter->NameOffset) : NULL;
            
            break;

        case PERF_REMOVE_COUNTER: 
            pCounter = (PPERF_COUNTER_IDENTITY)(((LPBYTE) Wnode) + sizeof(WNODE_HEADER));
            pComputerName = (LPWSTR)(((LPBYTE) pCounter) + pCounter->MachineOffset);
            pInstance = (pCounter->NameOffset > 0)
                ? (LPWSTR) (((LPBYTE) pCounter) + pCounter->NameOffset) : NULL;
            
            break;

        case PERF_ENUM_INSTANCES:
            pComputerName = (LPWSTR) (((LPBYTE) Wnode) + sizeof(WNODE_HEADER));
            
            break;

        case PERF_COLLECT_START: 
            pComputerName = (LPWSTR) (((LPBYTE) Wnode) + sizeof(WNODE_HEADER));
            
            break;

        case PERF_COLLECT_END: 
            pComputerName = (LPWSTR) (((LPBYTE) Wnode) + sizeof(WNODE_HEADER));
            
            break;

        default:
            wprintf(L"Unknown request code, %lu\n", RequestCode);
    }

    return Status;
}

要求

要求
最低受支持的客户端 Windows Vista [仅限桌面应用]
最低受支持的服务器 Windows Server 2008 [仅限桌面应用]
目标平台 Windows
标头 perflib.h