Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Функция 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::VersionPCW_VERSION_2 , а — значение PCW_REGISTRATION_INFORMATION::FlagsPcwRegistrationSiloNeutral.
Функция 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 |