Функция PcwRegister (wdm.h)
Функция PcwRegister
создает новую регистрацию набора счетчиков. Большинство разработчиков будут использовать созданную CTRPP функцию RegisterXxx вместо прямого вызова этой функции.
Синтаксис
NTSTATUS PcwRegister(
[out] PPCW_REGISTRATION *Registration,
[in] PPCW_REGISTRATION_INFORMATION Info
);
Параметры
[out] Registration
Указатель на PPCW_REGISTRATION. Получает дескриптор новой регистрации. Регистрация должна быть закрыта с помощью PcwUnregister.
[in] Info
Указатель на структуру PCW_REGISTRATION_INFORMATION , содержащую сведения о регистремом наборе счетчиков.
Возвращаемое значение
PcwRegister
возвращает одно из следующих значений:
Код возврата | Описание |
---|---|
STATUS_SUCCESS |
Набор счетчиков успешно зарегистрирован. |
STATUS_INTEGER_OVERFLOW |
Количество счетчиков, предоставляемых этой регистрацией, превышает максимальное поддерживаемого значения. |
STATUS_NO_MEMORY |
Недостаточно места для выделения памяти счетчикам. |
STATUS_INVALID_PARAMETER_2 |
В параметре обнаружена Info проблема. Некоторые возможные причины см. ниже. |
PcwRegister
может возвращать данные STATUS_INVALID_PARAMETER_2
в следующих случаях:
Поле
Info->Name->Length
равно 0 или не кратноsizeof(WCHAR)
.Поле
Info->Version
не соответствует поддерживаемое значение для этой версии Windows. При работе в Windows до версии 10.0.19645 (NTDDI_VERSION < NTDDI_VERSION_MN
)Version
поле должно иметь значение PCW_VERSION_1 (0x100). При запуске в Windows 10.0.19645 и более поздних версиях (NTDDI_VERSION >= NTDDI_VERSION_MN
) для этого параметра может быть задано значение PCW_VERSION_1 (0x100) или PCW_VERSION_2 (0x200).Поле
Info->Flags
содержит значение, которое не распознается работающей версией Windows.
Комментарии
Поставщик вызывает эту функцию для создания новой регистрации набора счетчиков. Все входные аргументы записываются таким образом, что вызывающему объекту не нужно хранить их копию.
По умолчанию новый набор счетчиков отображается только для сервера, который был активен во время регистрации (т. е. PcwRegister
связывает созданную регистрацию с серверным хранилищем, подключенным к потоку при PcwRegister
вызове ). При запуске в Windows 10.0.19645 и более поздних версий (NTDDI_VERSION >= NTDDI_VERSION_MN
) можно создать регистрацию набора счетчиков, видимую для всех серверных разрозненных серверов, задав значение PCW_REGISTRATION_INFORMATION::Version
PCW_VERSION_2
, а — значение PCW_REGISTRATION_INFORMATION::Flags
PcwRegistrationSiloNeutral
.
Функция RegisterXxx, созданная CTRPP
Большинству разработчиков не нужно вызывать PcwRegister
напрямую. Вместо этого они компилируют манифест с помощью средства CTRPP и используют функцию RegisterXxx из созданного CTRPP заголовка. Созданная функция будет выглядеть следующим образом:
EXTERN_C FORCEINLINE NTSTATUS
RegisterMyCounterset(
__in_opt PPCW_CALLBACK Callback,
__in_opt PVOID CallbackContext
)
{
PCW_REGISTRATION_INFORMATION RegInfo;
PAGED_CODE();
InitRegistrationInformationMyCounterset(Callback, CallbackContext, &RegInfo);
return PcwRegister(&MyCounterset, &RegInfo);
}
Созданная CTRPP функция Register будет называться ПрефиксRegisterCounterset. Префикс обычно пуст, но может присутствовать, если -prefix
параметр использовался в командной строке CTRPP. Counterset — это имя набора счетчиков, указанное в манифесте. Созданная функция Register вызовет функцию PrefixInitRegistrationInformationCounterset для инициализации PCW_REGISTRATION_INFORMATION
структуры, а затем вызовет PcwRegister
для создания новой регистрации и сохранения дескриптора в глобальной переменной Counterset (в примере объявленной в заголовке MyCounterset
CTRPP).
В некоторых случаях созданная CTRPP функция Add может быть неуместна.
Если необходимо выполнить компиляцию с
NTDDI_VERSION >= NTDDI_VERSION_FE
помощью , но она должна выполняться в более ранних версиях Windows, функция Register, созданная CTRPP, не будет работать, так как она задаетRegInfo.Version = PCW_CURRENT_VERSION
. ПриNTDDI_VERSION >= NTDDI_VERSION_FE
значенииPCW_CURRENT_VERSION
будет задано значениеPCW_VERSION_2
, что приводитPcwRegister
к возврату ошибки.Если требуется поддержка регистрации нескольких наборов счетчиков (например, для поддержки отдельной регистрации для каждого серверного хранилища), созданная CTRPP функция Register не будет работать, так как она сохраняет возвращенный дескриптор в глобальной переменной.
Если вы хотите создать регистрацию набора счетчиков, не зависящий от распределения, функция Register, созданная CTRPP, не будет работать, так как невозможно изменить значение
RegInfo.Flags
перед вызовомPcwRegister
.
В таких случаях вместо вызова функции Register, созданной CTRPP, используйте следующий код:
PCW_REGISTRATION_INFORMATION RegInfo;
InitRegistrationInformationMyCounterset(Callback, CallbackContext, &RegInfo);
// Modify RegInfo as needed,
// e.g. RegInfo.Version = PCW_VERSION_1,
// or RegInfo.Flags = PcwRegistrationSiloNeutral.
// If needed, use another variable to store the handle instead of MyCounterset.
Status = PcwRegister(&MyCounterset, &RegInfo);
Созданная CTRPP функция InitRegistrationInformationXxx инициализирует структуру RegInfo
на основе объявлений из манифеста. Дополнительные сведения о созданной функции InitRegistrationInformation см. в документации по PCW_REGISTRATION_INFORMATION.
Если для хранения дескриптора используются собственные переменные дескриптора вместо counterset , может потребоваться вызвать PcwUnregister
и PcwCreateInstance
напрямую вместо использования созданных CTRPP функций Отменить регистрациюXxx и CreateXxx .
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Доступно в Windows 7 и более поздних версиях Windows. |
Целевая платформа | Универсальное |
Верхняя часть | wdm.h (включая Wdm.h, Ntddk.h) |
Библиотека | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | IRQL <= APC_LEVEL |
См. также раздел
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по