当使用者执行某些作(例如添加或删除查询中的计数器)时,提供程序可以实现此函数来接收通知。 PERFLIB 在使用者的请求完成之前调用回调。
PERFLIBREQUEST 类型定义指向此回调函数的指针。 ControlCallback 函数是应用程序定义的函数名称的占位符。
Syntax
PERFLIBREQUEST Perflibrequest;
ULONG Perflibrequest(
[in] ULONG RequestCode,
[in] PVOID Buffer,
[in] ULONG BufferSize
)
{...}
参数
[in] RequestCode
请求代码可以是以下值之一。
| 价值 | Meaning |
|---|---|
|
使用者正在向查询添加计数器。 PERFLIB 调用回调,并针对要添加到查询的每个计数器调用此请求代码。
Buffer 参数包含一个PERF_COUNTER_IDENTITY结构,用于标识要添加的计数器。
提供程序可以使用此通知开始计数。 |
|
使用者正在从查询中删除计数器。 PERFLIB 调用回调,并针对要从查询中删除的每个计数器调用此请求代码。
Buffer 参数包含一个PERF_COUNTER_IDENTITY结构,用于标识要删除的计数器。
提供程序可以使用此通知停止计数。 |
|
使用者正在枚举计数器集的实例。 Buffer 参数包含一个以 null 结尾的 Unicode 字符串,该字符串标识使用者从中枚举实例的计算机(或其 IP 地址)的名称。 |
|
使用者开始收集计数器数据。
Buffer 参数包含一个以 null 结尾的 Unicode 字符串,用于标识使用者从中收集数据的计算机(或其 IP 地址)的名称。
如果原始数据状态至关重要(例如,不允许部分更新的事务相关计数器),则提供程序可以使用此通知。 此通知使提供程序有机会在集合开始之前刷新所有挂起的更新并锁定将来的更新。 |
|
计数器数据收集已完成。
Buffer 参数包含一个以 null 结尾的 Unicode 字符串,该字符串标识使用者从中收集数据的计算机(或其 IP 地址)的名称。
提供程序可以使用此通知释放集合启动通知施加的更新锁,以便恢复对计数器数据的更新。 |
[in] Buffer
缓冲区的内容取决于请求。 有关可能的内容,请参阅 RequestCode 参数。
[in] BufferSize
Buffer 参数的大小(以字节为单位)。
返回值
如果回调成功,则返回ERROR_SUCCESS。
如果回调失败,则如果请求PERF_ADD_COUNTER、PERF_ENUM_INSTANCES或PERF_COLLECT_START,PERFLIB 将向使用者返回错误代码;否则,将忽略错误代码。
注解
如果提供程序元素的回调属性为“custom”,或者在调用 CTRPP 时使用了 -NotificationCallback 参数,则必须实现此函数。 将回调函数的名称传递给 CounterInitialize。
Windows Vista: CounterInitialize 函数名为 PerfAutoInitialize。 CTRPP 工具还会为你生成此回调的框架,其中包含所有请求代码。 然后,将代码添加到要支持的请求代码,并删除其他人。
回调必须在一秒内完成。 如果回调未及时完成,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;
}
要求
| Requirement | 价值 |
|---|---|
| 最低支持的客户端 | Windows Vista [仅限桌面应用] |
| 支持的最低服务器 | Windows Server 2008 [仅限桌面应用] |
| 目标平台 | Windows操作系统 |
| Header | perflib.h |