PCW_REGISTRATION_INFORMATION结构 (wdm.h)

PCW_REGISTRATION_INFORMATION 结构提供有关提供程序和计数器集的详细信息。 大多数开发人员将使用 CTRPP-generated RegisterXxx 或 InitRegistrationInformationXxx 函数,而不是直接使用此结构。

语法

typedef struct _PCW_REGISTRATION_INFORMATION {
  ULONG                   Version;
  PCUNICODE_STRING        Name;
  ULONG                   CounterCount;
  PPCW_COUNTER_DESCRIPTOR Counters;
  PPCW_CALLBACK           Callback;
  PVOID                   CallbackContext;
  PCW_REGISTRATION_FLAGS  Flags;
} PCW_REGISTRATION_INFORMATION, *PPCW_REGISTRATION_INFORMATION;

成员

Version

指定提供程序所需的 Windows 性能计数器版本(PCW)的数值。

在 10.0.19645(NTDDI_VERSION < NTDDI_VERSION_MN)之前的 Windows 上运行时,Version 字段必须设置为PCW_VERSION_1(0x100)。 在 Windows 10.0.19645 及更高版本(NTDDI_VERSION >= NTDDI_VERSION_MN)上运行时,可能会将其设置为PCW_VERSION_1(0x100)或PCW_VERSION_2(0x200)。 如果 Version 字段设置为无法识别的值,PcwRegister 将返回STATUS_INVALID_PARAMETER_2。

使用 CTRPP 生成的 RegisterXxx 或 InitRegistrationInformationXxx 函数时,Version 字段将设置为 PCW_CURRENT_VERSION,这相当于以下值之一,具体取决于 NTDDI_VERSION的编译时值:

条件 PCW_CURRENT_VERSION值
NTDDI_VERSION < NTDDI_WIN10_FE PCW_VERSION_1 (0x0100)
NTDDI_VERSION >= NTDDI_WIN10_FE PCW_VERSION_2(0x0200)

如果你的代码使用 NTDDI_VERSION >= NTDDI_WIN10_FE 生成,但需要在早期版本的 Windows 上运行,则需要按照 PcwRegister文档中所述设置 Version = PCW_VERSION_1

Name

指向包含要注册的计数器集名称的字符串的指针。 此字符串不得为 NULL 或空白。

请注意,计数器集名称比较不区分大小写。 如果在两个计数器集注册中使用了相同的计数器集名称,使用者将从两个注册收集数据。

CounterCount

Counters 参数中提供的描述符数。

Counters

此计数器集的计数器的描述符数组。 从调用 PcwCreateInstancePcwAddInstance提供的数据块中提取计数器值时,将使用描述符中的信息。

Callback

指向可选 PCW_CALLBACK 回调函数的指针,该函数通知提供程序与此计数器集相关的事件。 如果不需要回调(例如,如果计数器集实例将通过 PcwCreateInstancePcwCloseInstance进行管理),则此字段可能为 NULL。

CallbackContext

一个指针值,将在每次调用提供程序定义的 PCW_CALLBACK 回调函数时传递给该函数。

Flags

Flags 字段仅在 NTDDI_VERSION >= NTDDI_WIN10_MN时才可用。

如果 Version 字段小于 PCW_VERSION_2,则 Flags 字段将被忽略。

Flags 字段启用 PcwRegister的特殊行为。 设置为一个或多个 PCW_REGISTRATION_FLAGS 值的组合:

PCW_REGISTRATION_FLAGS 意义
PcwRegistrationNone (0x0) 默认值(不需要特殊行为)。
PcwRegistrationSiloNeutral (0x1) 指示此注册应该对所有服务器接收器中的使用者可见。 默认情况下,注册仅对创建注册时处于活动状态的服务器接收器中的使用者可见(即调用 PcwRegister 时附加到线程的注册)。

言论

PcwRegister 函数采用指向此结构的指针的 Info 参数。

CTRPP 生成的 InitRegistrationInformationXxx 函数

大多数开发人员不需要直接使用 PCW_REGISTRATION_INFORMATION。 相反,他们将使用 CTRPP 工具编译清单,并使用 CTRPP 生成的标头中的 RegisterXxx 或 InitRegistrationInformationXxx 函数。 生成的 Register 函数调用 InitRegistrationInformation,然后调用 PcwRegister(有关详细信息,请参阅 PcwRegister)。 生成的 InitRegistrationInformation 函数如下所示:

EXTERN_C FORCEINLINE VOID
InitRegistrationInformationMyCounterset(
    __in_opt PPCW_CALLBACK Callback,
    __in_opt PVOID CallbackContext,
    __out PCW_REGISTRATION_INFORMATION* RegInfo
    )
{
    static const UNICODE_STRING Name = RTL_CONSTANT_STRING(L"My Counterset Name");
    static const PCW_COUNTER_DESCRIPTOR Descriptors[] = {
        { 0, 0, FIELD_OFFSET(MY_COUNTER_DATA, MyData1), RTL_FIELD_SIZE(MY_COUNTER_DATA, MyData1)},
        { 1, 0, FIELD_OFFSET(MY_COUNTER_DATA, MyData2), RTL_FIELD_SIZE(MY_COUNTER_DATA, MyData2)},
    };

#if CTRPP_VERIFY_COUNTER_SIZES

    //
    // Verify that structure member size matches manifest counter size.
    //

    C_ASSERT(RTL_FIELD_SIZE(MY_COUNTER_DATA, MyData1) == sizeof(ULONGLONG));
    C_ASSERT(RTL_FIELD_SIZE(MY_COUNTER_DATA, MyData2) == sizeof(ULONG));

#endif // CTRPP_VERIFY_COUNTER_SIZES

    PAGED_CODE();

    RtlZeroMemory(RegInfo, sizeof(*RegInfo));
    RegInfo->Version = PCW_CURRENT_VERSION;
    RegInfo->Name = &Name;
    RegInfo->CounterCount = RTL_NUMBER_OF(Descriptors);
    RegInfo->Counters = (PCW_COUNTER_DESCRIPTOR*)Descriptors;
    RegInfo->Callback = Callback;
    RegInfo->CallbackContext = CallbackContext;
}

CTRPP 生成的 InitRegistrationInformation 函数将命名 为前缀InitRegistrationInformationCounterset前缀 通常是空白的,但如果在 CTRPP 命令行上使用 -prefix 参数,则可能存在。 Counterset 是计数器集的名称,如清单中指定的。 生成的 InitRegistrationInformation 函数将使用函数参数和清单中的值初始化提供的 PCW_REGISTRATION_INFORMATION 结构。

CTRPP 生成的 InitRegistrationInformation 函数可以选择验证结构成员的大小是否与清单中声明的大小匹配。 默认情况下,CTRPP_VERIFY_COUNTER_SIZES 设置为 0,禁用此检查。 若要启用此检查,请在包括 CTRPP 生成的标头之前 #define CTRPP_VERIFY_COUNTER_SIZES 1。 如果启用检查,由于C_ASSERT条件失败,大小不匹配将触发编译错误。

要求

要求 价值
标头 wdm.h (包括 Wdm.h、Ntddk.h)

另请参阅

PCW_COUNTER_DESCRIPTOR 结构

PCW_CALLBACK 回调函数

PcwRegister 函数

CTRPP